前言
每个基于Mybatis的应用都是以一个SqlSessionFactory实例为核心的。
![](https://i-blog.csdnimg.cn/blog_migrate/8bb69fae63419f9c41dd6579f62e8acb.png)
生命周期和作用域
依赖注入框架可以创建线程安全的、基于事务的 SqlSession 和映射器,并将它们直接注入到你的 bean 中,因此可以直接忽略它们的生命周期。
-
非依赖注入框架下使用
image
一、全局配置文件
参考网站:https://mybatis.org/mybatis-3/zh/configuration.html
MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 配置文档的顶层结构如下
![](https://i-blog.csdnimg.cn/blog_migrate/4c42cc5b5dc7b73bb29174111dfb6647.png)
1. properties(属性)
- 这些属性可以在外部进行配置,并可以进行动态替换。你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置。
例如:
<!-- resource属性:引入类路径下的配置文件
url属性:引入网络或磁盘上的配置文件 -->
<properties resource="org/mybatis/example/config.properties">
<property name="username" value="ceshi"/>
<property name="password" value="123456"/>
</properties>
- 设置好的属性可以在整个配置文件中用来替换需要动态配置的属性值。
比如:
<dataSource type="POOLED">
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
如果一个属性在不只一个地方进行了配置,那么,通过方法参数传递的属性具有最高优先级,resource/url 属性中指定的配置文件次之,最低优先级的则是 properties 元素中指定的属性。
从 MyBatis 3.4.2 开始,你可以为占位符指定一个默认值(这个特性默认是关闭的。要启用这个特性,需要添加一个特定的属性来开启这个特性)。
例如:
<properties resource="org/mybatis/example/config.properties">
<!-- 启用默认值特性 -->
<property name="org.apache.ibatis.parsing.PropertyParser.enable-default-value" value="true"/>
</properties>
<dataSource type="POOLED">
<!-- 如果属性 'username' 没有被配置,'username' 属性的值将为 'cs_user' -->
<property name="username" value="${username:cs_user}"/>
</dataSource>
如果你在属性名中使用了 ":" 字符(如:db:username),或者在 SQL 映射中使用了 OGNL 表达式的三元运算符(如: ${tableName != null ? tableName : 'global_constants'}),就需要设置特定的属性来修改分隔属性名和默认值的字符。
例如:
<properties resource="org/mybatis/example/config.properties">
<!-- 修改默认值的分隔符 ?:-->
<property name="org.apache.ibatis.parsing.PropertyParser.default-value-separator" value="?:"/>
</properties>
<dataSource type="POOLED">
<property name="username" value="${db:username?:cs_user}"/>
</dataSource>
2.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>
-
各项设置的含义及默认值
image
3.typeAliases(类型别名)
类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写。(简化映射文件中parameterType和ResultType中的POJO类型名称编写,默认支持别名)
例如:
<typeAliases>
<!-- 当这样配置时,A01可以用在任何使用com.business.A01的地方。-->
<typeAlias alias="A01" type="com.business.A01"/>
<typeAlias alias="A02" type="com.business.A02"/>
</typeAliases>
也可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean,比如:
<typeAliases>
<!-- 每一个在包 com.business中的 Java Bean,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。 比如 com.business.A01 的别名为 a01; -->
<package name="com.business"/>
</typeAliases>
若有注解,则别名为其注解值。比如:
@Alias("a01")
public class A01 {
...
}
常见的 Java 类型内建的类型别名,它们都是不区分大小写的,注意,为了应对原始类型的命名重复,采取了特殊的命名风格。
如:_byte/byte( 别名/映射文件);byte/Byte;hashmap/HashMap等。
4.typeHandlers(类型处理器)
MyBatis 在设置预处理语句(PreparedStatement)中的参数或从结果集中取出一个值时, 都会用类型处理器将获取到的值以合适的方式转换成 Java 类型(从 3.4.5 开始,MyBatis 默认支持 JSR-310(日期和时间 API))。下表描述了一些默认的类型处理器。
![](https://i-blog.csdnimg.cn/blog_migrate/8eca33a2300d649fed61ba33647d900c.png)
也可以重写已有的类型处理器或创建自定义的处理器来处理不支持或非标准的类型。实现必须遵循:实现org.apache.ibatis.type.TypeHandler接口,或继承一个和便利的类org.apache.ibatis.type.BaseTypeHandler,并可将它映射到一个JDBC类型。
<typeHandlers>
<typeHandler handler="org.mybatis.example.ExampleTypeHandler"/>
</typeHandlers>
5.objectFactory(对象工厂)
每次MyBatis创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成实例化工作。默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认无参构造方法,要么通过已存在的参数映射来调用带有参数的构造方法。也可以创建自己的对象工厂来覆盖默认的。
比如:
// ExampleObjectFactory.java
public class ExampleObjectFactory extends DefaultObjectFactory {
public Object create(Class type) {
return super.create(type