前言:
首先我们可以明确的一点是,mybatis的核心是sqlSession,所有对数据库的操作都封装在其中(这个跟hibernate是一样的)。所以如果要使用mybatis第一步是获得sqlSession,mybatis提供了sqlSessionFactory工厂方法来构建sqlSession,一般情况我们都是通过配置文件来构建sqlSessionFactory的。看下面代码:
String resource = "../mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
我们可以看到sqlSessionFactory是通过sqlSessionFactoryBuilder来创建的,而通过源码我们清楚地看到,mybatis通过
XMLConfigBuilder解析配置文件构建配置对象Configuration,生成sqlSessionFactory。如果说sqlSession是mybatis的核心,那么全局配置文件就是其基础。它包含了框架所有的配置。
public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
try {
XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
Configuration config = parser.parse(); //Mybatis框架配置对象
return new DefaultSqlSessionFactory(config);
} catch (Exception e) {
throw ExceptionFactory.wrapException("Error building SqlSession.", e);
} finally {
try {
inputStream.close();
} catch (IOException e) {}
}
}
1.typeAliases属性
别名,就是用来简化配置的。
<typeAliases>
<typeAlias type="com.huatech.iaudit.audit.entity.LogLogin" alias="LogLogin"/>
<typeAlias type="com.huatech.iaudit.audit.entity.LogAction" alias="LogAction"/>
</typeAliases>
2.plugins属性
提供一种插件(plugin)的功能,虽然叫做插件,但其实这是拦截器功能。
<plugins>
<!-- com.github.pagehelper为PageHelper类所在包名 -->
<plugin interceptor="com.github.pagehelper.PageHelper">
<!-- 4.0.0以后版本可以不设置该参数 -->
<!-- property name="dialect" value="postgresql"/ -->
<!-- 该参数默认为false -->
<!-- 设置为true时,会将RowBounds第一个参数offset当成pageNum页码使用 -->
<!-- 和startPage中的pageNum效果一样-->
<property name="offsetAsPageNum" value="true"/>
<!-- 该参数默认为false -->
<!-- 设置为true时,使用RowBounds分页会进行count查询 -->
<property name="rowBoundsWithCount" value="true"/>
<!-- 设置为true时,如果pageSize=0或者RowBounds.limit = 0就会查询出全部的结果 -->
<!-- (相当于没有执行分页查询,但是返回结果仍然是Page类型)-->
<property name="pageSizeZero" value="false"/>
<!-- 3.3.0版本可用 - 分页参数合理化,默认false禁用 -->
<!-- 启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页 -->
<!-- 禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据 -->
<property name="reasonable" value="false"/>
<!-- 3.5.0版本可用 - 为了支持startPage(Object params)方法 -->
<!-- 增加了一个`params`参数来配置参数映射,用于从Map或ServletRequest中取值 -->
<!-- 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,orderBy,不配置映射的用默认值 -->
<!-- 不理解该含义的前提下,不要随便复制该配置 -->
<!-- property name="params" value="pageNum=pageHelperStart;pageSize=pageHelperRows;"/ -->
<!-- 支持通过Mapper接口参数来传递分页参数 -->
<property name="supportMethodsArguments" value="false"/>
<!-- always总是返回PageInfo类型,check检查返回类型是否为PageInfo,none返回Page -->
<property name="returnPageInfo" value="none"/>
</plugin>
</plugins>
3.settings属性
setting属性和properties属性一样,也是配置参数名和参数值。但到底和properteis有什么区别呢?我们知道properties的配置参数是为其他的配置服务的,配置项不是不定的。而settings的配置项是配置Configuration对象的属性的,配置项定死就那么几个,不配的话框架有默认值。
<settings>
<setting name="cacheEnabled" value="true"/>
<!-- 全局映射器启用缓存 -->
<setting name="useGeneratedKeys" value="false"/>
<setting name="defaultExecutorType" value="REUSE"/>
</settings>
4.environments属性
要是Mybatis和Spring整合的话,那environments的配置是省略的。此配置项是配置数据库连接池和事物管理的。若何Spring配合使用,则事务的管理和数据库连接池一般都是交给Spring控制。
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/> <!--事物的配置, 可以是:JDBC, MANAGED-->
<dataSource type="POOLED"> <!--数据源配置,可以是: JNDI, POOLED, UNPOOLED -->
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${user}"/>
<property name="password" value="${passwd}"/>
</dataSource>
</environment>
<environment id="product">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${product.driver}"/>
<property name="url" value="${product.url}"/>
<property name="username" value="${product.user}"/>
<property name="password" value="${product.passwd}"/>
</dataSource>
</environment>
</environments>
5.mapper属性
对应实体的映射文件,在此不赘述。