XML 映射配置文件(官方结构)
MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置(settings)和属性(properties)信息。文档的顶层结构如下:
- configuration 配置
-
- environment 环境变量
- transactionManager 事务管理器
- dataSource 数据源
- environment 环境变量
-
以上是mybatis官方提供的全局配置文件的结构内容,下面我们来看看如何配置这些属性:
properties属性配置
如果属性在不只一个地方进行了配置,那么 MyBatis 将按照下面的顺序来加载:
– 在 properties 元素体内指定的属性首先被读取。
– 然后根据 properties 元素中的 resource 属性读取类路径下属性文件或根据 url 属性指定的路径读取属性文件,并覆盖已读取的同名属性。也就是说:外部引入配置文件中的额属性值优先级比properties 元素体内的高。
settings属性配置
typeAliases 类型别名属性配置
给mybatis可以使用到的类型,取一个映射别名,可以用在SQL Mapper映射文件的resultType,parameterType等属性以及其他填写类型的属性值。
1)单个类型配置
2) 整包范围配置
3)注解形式 (给实体类中添加注解@Alias("name"))
这种形式优先级最高,其次typeAlias,最后package形式。
示例:
mybatis内建类型别名:
typeHandlers 类型处理器
主要提供给mybatis在预编译时参数设值的时候做参数类型转换处理,以及结果集处理时数据类型转换。自定义的类型转换器需要实现接口org.apache.ibatis.type.TypeHandler。
以下为接口源码:
package org.apache.ibatis.type;import java.sql.CallableStatement;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;/** * @author Clinton Begin */public interface TypeHandler{ void setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException; T getResult(ResultSet rs, String columnName) throws SQLException; T getResult(ResultSet rs, int columnIndex) throws SQLException; T getResult(CallableStatement cs, int columnIndex) throws SQLException;}
StringTypeHandler.java源码:(处理String类型的参数和结果数据)
package org.apache.ibatis.type;import java.sql.CallableStatement;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;/** * @author Clinton Begin */public class StringTypeHandler extends BaseTypeHandler{ @Override public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException { ps.setString(i, parameter); } @Override public String getNullableResult(ResultSet rs, String columnName) throws SQLException { return rs.getString(columnName); } @Override public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException { return rs.getString(columnIndex); } @Override public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { return cs.getString(columnIndex); }}
1) 单个配置形式:
2)整包配置形式:
plugins 插件配置
插件是MyBatis提供的一个非常强大的机制,我们可以通过插件来修改MyBatis的一些核心行为。插件通过动态代理机制,可以介入四大对象的任何一个方法的执行。后面会有专门的章节我们来介绍mybatis运行原理以及插件
四大对象:
- Executor (update, query, flushStatements, commit, rollback,getTransaction, close, isClosed)
- ParameterHandler (getParameterObject, setParameters)
- ResultSetHandler (handleResultSets, handleOutputParameters)
- StatementHandler (prepare, parameterize, batch, update, query)
environments 环境
备注:实际开发中我们使用Spring管理数据源,并进行事务控制的配置来覆盖上述配置。
databaseIdProvider 数据库厂商标识配置
1)如何使用呢?
在SQL标签中,可以通过databaseId属性来指定数据库来源,只有当前数据库与之匹配时才用这条定制化SQL。SQL方法ID相同的SQL,优先使用指定databaseId的SQL 。
如上,当数据库为mysql时,会使用第二个select sql,当数据库为sql server时,会使用第一个select sql。同时可以在mapper.xml文件中通过_databaseId获取当前数据库的所对应的databaseId值。
mappers 映射器设置
用来注册写好的SQL Mapper映射文件。
1)单个注册方式:
2)整包注册方式:
示例:
总结
1)通过配置文件的方式创建SqlSessionFactory时,会先通过org.apache.ibatis.builder.xml.XMLConfigBuilder解析全局xml配置文件,将解析的结果放到内存org.apache.ibatis.session.Configuration对象,这是一个全局对象,在mybatis整个生命周期都有效的内存对象。
2)同理,也可以直接创建org.apache.ibatis.session.Configuration对象,再由Configuration来创建SqlSessionFactory对象。
官方提供的创建SqlSessionFactory的硬编码方式:
//BlogDataSourceFactory为自定义的数据库连接池工厂DataSource dataSource = BlogDataSourceFactory.getBlogDataSource();TransactionFactory transactionFactory = new JdbcTransactionFactory();Environment environment = new Environment("development", transactionFactory, dataSource);//直接创建Configuration 内存全局对象Configuration configuration = new Configuration(environment);//硬编码的方式配置Mapper,也可以配置其他属性,不配置时使用mybatis内部默认值configuration.addMapper(BlogMapper.class);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);