接着上一节我们来详解一下Mybatis的核心配置文件sqlMapConfig.xml
我们先来看下Mybatis核心配置文件的层级结构
- configuration(配置)
- properties(属性)
- settings(设置)
- typeAliases(类型别名)
- typeHandlers(类型处理器)
- objectFactory(对象工厂)
- plugins(插件)
- environments(环境配置)
- environment(环境变量)
- transactionManager(事务管理器)
- dataSource(数据源)
- environment(环境变量)
- databaseIdProvider(数据库厂商标识)
- mappers(映射器)
注意:
configuration 的子标签顺序,需要严格按照上面给的列表顺序进行编写,如果顺序不一致,编译器会直接报错,而且加载配置文件的时候也会报错
下面我们来一一介绍核心配置文件的所有属性
属性 properties
<properties resource="jdbc.properties"/>
属性配置,我们可以引用外部的参数,来对核心配置文件做配置来达到解耦合的目的。比如我们引入了jdbc.properties
配置文件,就可以使用EL表达式
来对数据源中的参数做替换
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.ur}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
另外我们还可以在properties
标签中填写property
标签,当配置文件没有生效,或者未加载到的时候可以使用property
中提供的属性值
<properties resource="jdbc.properties">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/lagou"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</properties>
设置 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>
这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。因为参数较多,我们选几个参数进行解释
- cacheEnabled 全局开启/关闭配置的任何缓存
- lazyLoadingEnabled 延迟加载的全局开关
- aggressiveLazyLoading 开启时,任一方法的调用都会加载该对象的所有延迟加载属性。 否则,每个延迟加载属性会按需加载
- useGeneratedKeys 允许 JDBC 支持自动生成主键,需要数据库驱动支持
更多参数说明,请参阅:https://mybatis.org/mybatis-3/zh/configuration.html
类型别名 typeAliases
<typeAliases>
<typeAlias type="com.lagou.domain.User" alias="user"/>
</typeAliases>
类型别名,可以为我们的实体生成一个别名。来替代我们在mapper xml配置文件中的resultType,简化我们的配置
<select id="getUserList" resultType="user">
select * from users
</select>
类型处理器 typeHandlers
<typeHandlers>
<typeHandler handler="org.mybatis.example.ExampleTypeHandler"/>
</typeHandlers>
MyBatis 在设置预处理语句(PreparedStatement)中的参数或从结果集中取出一个值时, 都会用类型处理器将获取到的值以合适的方式转换成 Java 类型。下表描述了一些默认的类型处理器。
提示 从 3.4.5
开始,MyBatis 默认支持JSR-310
(日期和时间 API) 。
对象工厂 objectFactory
<objectFactory type="org.mybatis.example.ExampleObjectFactory">
<property name="someProperty" value="100"/>
</objectFactory>
Mybaits每次创建结果集的时候都需要使用对象工厂来完成实例化,如果你想替换工厂的默认行为,可以定义自己的工厂类来实现。
插件 plugins
<plugins>
<plugin interceptor="com.lagou.interceptor.CustomInterceptor">
<property name="name" value="tomcat"/>
</plugin>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
</plugin>
</plugins>
plugins
标签可以用于在映射SQL语句执行过程中进行拦截,执行一些自定义的操作,下面我们来举一个自定义plugin的例子。里面有详细的说明,我就不一一介绍了。
@Intercepts({
@Signature(type = StatementHandler.class, //拦截那个接口
method = "prepare", //接口方法
args = {Connection.class, Integer.class} //接口参数
)
})
public class CustomInterceptor implements Interceptor {
/**
* 每次操作都会调用这个方法
*/
public Object intercept(Invocation invocation) throws Throwable {
//里面可以写增强的逻辑
System.out.println("增强中。。。");
//执行原方法
return invocation.proceed();
}
/**
* 把拦截器生成一个代理,放到拦截器链中
* 包装目标对象,为目标对象创建代理对象
*
* @param target 要拦截的对象
* @return 代理对象
*/
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
/**
* 传递插件所需参数
*
* @param properties 参数
*/
public void setProperties(Properties properties) {
System.out.println("传递参数:" + properties);
}
}
环境配置 environments
<environments default="dev">
<!--id环境的唯一标识-->
<environment id="dev">
<!--当前事务交给jdbc处理 指定事务类型-->
<transactionManager type="jdbc" />
<!--使用mybatis提供的连接池 type指定当前数据源类型-->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.ur}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
environments
标签主要有用于数据库环境配置,我们可以针对不同的环境来配置不同的数据库参数。default
属性来指定我们使用的是哪一个环境的数据库配置。environments
的子标签注释里面有相应的说明,就不多介绍了。
映射器 mappers
<mappers>
<mapper resource="userMapper.xml"/>
</mappers>
mappers
标签用来配置我们的Mapper 语句的位置。
子标签mapper
中参数解释:
- resource 使用相对于类路径的资源引用
- url 使用完全限定资源定位符
- class 使用映射器接口实现类的完全限定类名
子标签package
用来将包内的映射器接口实现全部注册为映射器
举例
<mappers>
<mapper resource="userMapper.xm"/>
<mapper url="file:///var/mappers/userMapper.xml"/>
<mapper class="com.lagou.mapper.userMapper"/>
<package name="com.lagou.mapper"/>
</mappers>
至此,我们针对Mybatis中核心配置文件的说明已经结束,有任何疑问欢迎在评论区给我评论留言。
注:部分资料参考https://mybatis.org/mybatis-3/zh/configuration.html