MyBatis 全局配置文件
涉及代码:mybatis
全局配置文件中可配置子标签有: properties
、settings
、typeAliases
、typeHandlers
、objectFactory
、objectWrapperFactory
、reflectorFactory
、plugins
、environments
、databaseIdProvider
、mappers
。
properties
使用标签 properties
可引入 properties
配置文件,引入后就可以 ${属性名}
的方式获取属性值。
标签 properties
属性有:resource
引入类路径下的资源;url
引入网络路径或磁盘路径的资源。
也可以结合子标签 property
设置属性:name
为属性名;value
为属性值。
1、示例:引入数据源配置
<properties resource="jdbc.properties">
<property name="jdbc.username" value="root"/>
</properties>
2、引用属性
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
settings
标签 settings
中可设置多个子标签 setting
,用来修改配置项的默认值。
一个 setting
标签用来配置一个设置项,name
为设置项名,value
为设置项值。
配置项参考:https://mybatis.org/mybatis-3/configuration.html#settings
1、示例:开启驼峰命名自动映射,将表结构的字段 USER_NAME
映射到 Java
实体类属性 userName
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
typeAliases
类型别名,使用一个简短的别名来代替 Java
类的全类名。引用该类时直接使用别名代替。
标签 typeAliases
中可配置多个子标签 typeAlias
或者 package
。
子标签 typeAlias
设置一个类的别名。属性 type
需要设置别名的类全类名;属性 alias
设置类的别名,可选项,不设置此属性,则别名为类名且不区分大小写。
1、示例
<typeAliases>
<typeAlias type="com.don.learn.mybatis.bean.User"/>
<typeAlias type="com.don.learn.mybatis.bean.Dept" alias="_dept"/>
</typeAliases>
子标签 package
为某个包下的所有类批量设置别名,默认的别名为简单类名小写。
2、示例
<typeAliases>
<package name="com.don.learn.mybatis.bean"/>
</typeAliases>
在批量设置别名时,想为某个类指定特定的别名,可以使用 @Alias
注解为某个类指定别名。
3、示例
@Alias("_user")
public class User{
//...
}
MyBatis
提供了常见的 Java
类的类型别名。
参考:https://mybatis.org/mybatis-3/configuration.html#typealiases
typeHandlers
MyBatis
在处理 SQL
参数映射或从结果集中取值时,都会用类型处理器将一个值以合适的方式转换成 Java
类型。
其自带了大多数的类型处理器。
参考:https://mybatis.org/mybatis-3/configuration.html#typeHandlers
自定义类型处理器
内置的类型处理器不满足时,可以自定义类型处理器,两种方式:
- 实现
org.apache.ibatis.type.TypeHandler
接口 - 继承
org.apache.ibatis.type.BaseTypeHandler
类
1、示例
@MappedTypes(LocalDate.class)
@MappedJdbcTypes(value = JdbcType.DATE, includeNullJdbcType = true)
public class LocalDateTypeHandler extends BaseTypeHandler<LocalDate> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, LocalDate parameter, JdbcType jdbcType)
throws SQLException {
ps.setDate(i, Date.valueOf(parameter));
}
@Override
public LocalDate getNullableResult(ResultSet rs, String columnName) throws SQLException {
Date date = rs.getDate(columnName);
return getLocalDate(date);
}
@Override
public LocalDate getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
Date date = rs.getDate(columnIndex);
return getLocalDate(date);
}
@Override
public LocalDate getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
Date date = cs.getDate(columnIndex);
return getLocalDate(date);
}
private static LocalDate getLocalDate(Date date) {
if (date != null) {
return date.toLocalDate();
}
return null;
}
}
2、装配自定义类型处理器
<!--mybatis-config.xml-->
<typeHandlers>
<typeHandler handler="com.don.learn.mybatis.typehandler.LocalDateTypeHandler"/>
</typeHandlers>
1)通过泛型表示该类型处理器处理的 Java
类型。或通过2种方式配置:
- 在全局配置文件配置类型处理器时,标明
javaType
属性javaType="LocalDate"
- 在类型处理器的类上标注
@MappedTypes
注解指定其关联的Java
类型
2)通过2种方式来指定关联的 JDBC
类型:
- 在全局配置文件配置类型处理器时,标明
jdbcType
属性jdbcType="DATE"
- 在类型处理器的类上标注
@MappedJdbcTypes
注解指定其关联的JDBC
类型
objectFactory
MyBatis
在处理结果映射时,通过使用对象工厂 ObjectFactory
实例来完成结果实例化。
默认的对象工厂在实例化目标类时,通过默认的无参构造方法,或者通过对应参数映射来调用有参构造方法完成实例化。
plugins
可以通过插件来修改 MyBatis
的核心执行过程。插件通过动态代理
机制,可以介入四大对象的方法的执行。
在映射语句执行过程中的某一点进行拦截调用。默认情况下,允许使用插件来拦截的方法调用包括:
Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
ParameterHandler (getParameterObject, setParameters)
ResultSetHandler (handleResultSets, handleOutputParameters)
StatementHandler (prepare, parameterize, batch, update, query)
使用插件只实现 Interceptor
接口,并指定要拦截的方法,在 intercept
方法编写处理。
然后在全局配置文件进行注册。
<plugins>
<plugin interceptor="com.don.learn.mybatis.plugin.MyPlugin"/>
</plugins>
environments
标签 environments
用于配置环境,可以配置多个环境,使用属性 default
,设置默认使用的环境的 id
。
标签 environment
设置一个连接数据库的环境信息。必填属性 id
表示该环境的唯一标识。内部必须包含两个子标签 transactionManager
和 dataSource
。
transactionManager
:设置事务管理方式。默认有 2 种类型的事务管理器 JDBC
和 MANAGED
。
JDBC
是JdbcTransactionFactory
类的别名。直接使用JDBC
的提交和回滚功能MANAGED
是ManagedTransactionFactory
类的别名。该配置不提交或回滚连接,而是让容器来管理事务的整个生命周期
dataSource
:设置数据源。默认有 3 种自带的数据源类型 UNPOOLED
、POOLED
、JNDI
。
UNPOOLED
是UnpooledDataSourceFactory
类的别名。即不使用连接池的数据源,每次请求都打开和关闭连接POOLED
是PooledDataSourceFactory
类的别名。使用连接池JNDI
是JndiDataSourceFactory
类的别名。使用在EJB
或应用服务器容器中
mappers
用于将 SQL
的 XML
映射文件注册到全局配置文件中。
1、类路径的资源引用
<mappers>
<mapper resource="mappers/UserMapper.xml"/>
</mappers>
2、映射器接口实现类的全类名。映射文件必须和接口同名,并且放在与接口同一目录
<mappers>
<mapper class="com.don.learn.mybatis.mapper.UserMapper"/>
</mappers>
3、将某包内的映射器接口实现全部注册为映射器
<mappers>
<!--
以包为单位,将包下所有的映射文件引入核心配置文件
注意:此方式必须保证mapper接口和mapper映射文件必须在相同的包下
-->
<package name="com.don.learn.mybatis.mapper"/>
</mappers>