Mybatis初始—环境配置
配置需要遵循如上图所示的顺序
MyBatis到底有什么作用呢?
MyBatis是一个持久层框架、属于JDBC的替代方案之一、它的前身是iBatis。
它属于ORM关系型映射
ORM(O/R-Mapping 对象关系映射)、是一种内存中的对象保存到关系型数据库的技术。主要是负责数据实体的持久化,用它封装数据库访问的细节。采用(XML)的方式来描述对象-关系(数据库表)的映射细节,可以使得ORM充当任何一个Java应用层到数据库之间的桥梁
MyBaatis简化了JDBC中那些繁琐的工作(建立链接、PreparedStatment-预编译sql语句、设置占位符、获取结果集等一系列的操作)可以让开发者更多的关注sql语句本身(MyBatis内部封装了JDBC)
MyBatis组成(三个基本要素)
1.核心接口和类(sqlsessionFactory SqlSession)
2.核心(主)配置文件Mybatis.cfg.xml
3…SQL映射文件(mapper.xml)
SQLSessionFactory是MyBatis中的核心对象、是数据库映射关系经过数据库编译之后的镜像,而它的作用就是用来创SqlSession
SQLSessionFactory 可以根据上层对象SqlSessionFactoryBuilder对象来创建
SqlSessionFactoryBuilder则可以通过核心()配置文件或Java代码定义好的配置类来构建。
SQLSessionFactory ,是线程安全的,他一旦被创建,在应用运行期间都会存在,如果我们多次创建同一个数据库的SQLSessionFactory ,会导致数据库资源被消耗殆尽。因此通常情况下,同一个数据库都只会对应一个SQLSessionFactory 对象,所以我们在构建SQLSessionFactory 实列时通常情况下会使用单例模式
SqlSession
sqlSession独享是另一个核心对象、他是应用程序和持久层之间的而执行交互操作的单线程对象–起作用主要是执行持久化操作
每一个线程都应该拥有一个自己的SqlSession实列,并且他们都是不共享的,同时也是线程不安全的,SqlSession使用范围最好限制再一次请求或一个方法中,绝对不能把他放在一个类的静态字段、属性中,使用完SqlSession对象的实列后需要关闭资源
通常finally关闭 或try-with-reasoue
属性(properties)
这些属性可以在外部进行配置,并可以进行动态替换。你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置。
设置(settings)
这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。 下表描述了设置中各项设置的含义、默认值等。
一个配置完整的 settings 元素的示例如下:
<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="multipleResultSetsEnabled" value="true"/>
<setting name="useColumnLabel" value="true"/>
<setting name="useGeneratedKeys" value="false"/>
<setting name="autoMappingBehavior" value="PARTIAL"/>
<setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
<setting name="defaultExecutorType" value="SIMPLE"/>
<setting name="defaultStatementTimeout" value="25"/>
<setting name="defaultFetchSize" value="100"/>
<setting name="safeRowBoundsEnabled" value="false"/>
<setting name="mapUnderscoreToCamelCase" value="false"/>
<setting name="localCacheScope" value="SESSION"/>
<setting name="jdbcTypeForNull" value="OTHER"/>
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>
类型别名(typeAliases)
类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写。
类型处理器(typeHandlers)
MyBatis 在设置预处理语句(PreparedStatement)中的参数或从结果集中取出一个值时, 都会用类型处理器将获取到的值以合适的方式转换成 Java 类型。
处理枚举类型
若想映射枚举类型 Enum,则需要从 EnumTypeHandler 或者 EnumOrdinalTypeHandler 中选择一个来使用。
比如说我们想存储取近似值时用到的舍入模式。默认情况下,MyBatis 会利用 EnumTypeHandler 来把 Enum 值转换成对应的名字。
注意 EnumTypeHandler 在某种意义上来说是比较特别的,其它的处理器只针对某个特定的类,而它不同,它会处理任意继承了 Enum 的类。
不过,我们可能不想存储名字,相反我们的 DBA 会坚持使用整形值代码。那也一样简单:在配置文件中把 EnumOrdinalTypeHandler 加到 typeHandlers 中即可, 这样每个 RoundingMode 将通过他们的序数值来映射成对应的整形数值。
<!-- mybatis-config.xml -->
<typeHandlers>
<typeHandler handler="org.apache.ibatis.type.EnumOrdinalTypeHandler" javaType="java.math.RoundingMode"/>
</typeHandlers>
对象工厂(objectFactory)
每次 MyBatis 创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成实例化工作。 默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认无参构造方法,要么通过存在的参数映射来调用带有参数的构造方法。 如果想覆盖对象工厂的默认行为,可以通过创建自己的对象工厂来实现。
插件(plugins)
MyBatis 允许你在映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括:
Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
ParameterHandler (getParameterObject, setParameters)
ResultSetHandler (handleResultSets, handleOutputParameters)
StatementHandler (prepare, parameterize, batch, update, query)
通过 MyBatis 提供的强大机制,使用插件是非常简单的,只需实现 Interceptor 接口,并指定想要拦截的方法签名即可。
环境配置(environments)
MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中, 现实情况下有多种理由需要这么做。例如,开发、测试和生产环境需要有不同的配置;或者想在具有相同 Schema 的多个生产数据库中使用相同的 SQL 映射。还有许多类似的使用场景。
不过要记住:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。
所以,如果你想连接两个数据库,就需要创建两个 SqlSessionFactory 实例,每个数据库对应一个。而如果是三个数据库,就需要三个实例,依此类推,记起来很简单:
每个数据库对应一个 SqlSessionFactory 实例
事务管理器(transactionManager)
在 MyBatis 中有两种类型的事务管理器(也就是 type=“[JDBC|MANAGED]”):
JDBC – 这个配置直接使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域。
MANAGED – 这个配置几乎没做什么。它从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接。然而一些容器并不希望连接被关闭,因此需要将 closeConnection 属性设置为 false 来阻止默认的关闭行为。
数据库厂商标识(databaseIdProvider)
MyBatis 可以根据不同的数据库厂商执行不同的语句,这种多厂商的支持是基于映射语句中的 databaseId 属性。 MyBatis 会加载带有匹配当前数据库 databaseId 属性和所有不带 databaseId 属性的语句。 如果同时找到带有 databaseId 和不带 databaseId 的相同语句,则后者会被舍弃。 为支持多厂商特性,只要像下面这样在 mybatis-config.xml 文件中加入 databaseIdProvider 即可:
映射器(mappers)
既然 MyBatis 的行为已经由上述元素配置完了,我们现在就要来定义 SQL 映射语句了。 但首先,我们需要告诉 MyBatis 到哪里去找到这些语句。 在自动查找资源方面,Java 并没有提供一个很好的解决方案,所以最好的办法是直接告诉 MyBatis 到哪里去找映射文件。 你可以使用相对于类路径的资源引用,或完全限定资源定位符(包括 file:/// 形式的 URL),或类名和包名等。
MyBatis简单环境搭建
注意:创建Maven项目才能导入MyBatis的Jar包
1.创建Maven项目,在pom.xml导入依赖
<!-- mybatis核心 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
</dependency>
<!-- mybatis支持JDK8新类型的拓展包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-typehandlers-jsr310</artifactId>
<version>1.0.2</version>
</dependency>
<!-- mysql驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>
2.在resources目录中导入mybaits.cfg.xml-主配置文件,并完成一系列配置
2.1 日志
<settings>
<!-- 设置 执行mybatis方法时,显示日志信息。比如:SQL语句方法参数等 -->
<setting name="logImpl" value="STDOUT_LOGGING" />
</settings>
2.2 实体类别名
<typeAliases>
<!-- 别名配置,允许使用指定包中的类名做为实体类的类型 -->
<package name="com.project.bean"/>
</typeAliases>
2.3 数据源配置,设置连接信息
<environments default="dev">
<environment id="dev">
<!-- 指定事务管理器类型 此时指定为JDBC 使用JDBC的提交和回滚设置 -->
<transactionManager type="JDBC"></transactionManager>
<!-- dataSource 设置数据源 type=POOLED指使用JDBC的POOLED数据源连接池的实现对象 -->
<dataSource type="POOLED">
<!-- 数据库驱动 mysql5 - com.mysql.jdbc.Driver
mysql8 - com.mysql.cj.jdbc.Driver
-->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:端口号/数据库名称?characterEncoding=utf-8&allowMultiQueries=true"/>
<property name="username" value="root"/>
<property name="password" value="密码"/>
</dataSource>
</environment>
</environments>
2.4 链接映射文件
<!-- 映射文件的所在位置 -->
<mappers>
<!-- 扫描指定包下的映射文件 -->
<package name="com.project.dao"/>
</mappers>
3.在resources目录下去创建映射文件和持久接口同名的层级目录,并完成映射文件名称的修改(和持久接口同名)