Mybatis的配置
MyBatis配置XML的层次结构
<?xml version="1.0" encoding="UTF-8"?>
<Configuration><!--配置-->
<properties/><!--属性-->
<settings/><!--设置-->
<typeAliases/><!--类型命名-->
<typeHandlers/><!--类型处理器-->
<objectFactory/><!--对象工厂-->
<plugins/><!--插件-->
<environments><!--配置环境-->
<environment><!--环境变量-->
<transactionManager/><!--事务管理器-->
<dataSource/><!--数据源-->
</environment>
</environments>
<databaseIdProvider/><!--数据库厂商标识-->
<mappers/><!--映射器-->
</Configuration>
properties元素
properties是一个配置属性的元素,让我们能在配置文件中的上下文使用它。
MyBatis提供3中配置方式
- property子元素
- properties配置文件
- 程序参数传递
注:Mybatis支持的3种配置方式可能同时出现,并且属性还会重复配置。这3种方式是存在优先级的,MyBatis将按照下面的顺序来加载。
1.在properties元素体内指定的属性首先被读取
2.根据properties元素中的resource属性读取类路径下属性文件,或者根据url属性指定的路径读取属性文件,并覆盖已读取的同名属性。
3.读取作为方法参数传递的属性,并覆盖已读取的属性。
设置(settings)
settings 的配置项很多,但是真正用到的不会太多,我们把常用的配置项研究清楚就可以了,比如关于缓存的 cacheEnabled,关于级联的 lazyLoadingEnabled 和 aggressiveLazy Loading,关于自动映射的 autoMappingBehavior 和 mapUnderscoreToCamelCase,关于执行器类型的 defaultExecutorType 等。
别名(typeAliases)
别名是一个指代的名称。因为我们遇到的类全限定名过长,所以我们希望用一个简短的名称去指代它,而这个名称可以在mybatis上下文中使用,别名在MyBatis里面分为系统定义别名和自定义别名两类。注意,在MyBatis中别名是不区分大小写的。
系统定义别名
如果需要使用对应类型的数组型,要看其是否能支持数据,如果支持只需要使用别名加[]即可,比如 _int 数组的别名就是 _int[]。而类似 list 这样不支持数组的别名,则不能那么写。
自定义别名
<!--定义别名-->
<typeAliases>
<typeAlias alias="role" type="com.learn.chapter.po.Role"/>
</typeAliases>
这样我们就可以在Mybatis的上下文中使用“role”来代替其类的全路径。
如果com.learn.chapter.po这个文件夹中包含许多许多类,我们不可能一一命名
mybatis支持我们通过自动扫描形式自定义别名
<!--定义别名-->
<typeAliases>
<typeAlias alias="role" type="com.learn.chapter.po"/>
</typeAliases>
配置了包扫描路径,即使没有配置Alias,Mybatis会自动把类名的第一个字母变成小写作为该类的别名。
typeHandler 类型处理器
ObjectFactory 对象工厂
environments 配置环境
配置环境可以注册多个数据源(dataSource),每一个数据源分为两大部分:一个是数据源(dataSource)的配置,另一个是数据库事务(transactionManager)的配置。下面是一个连接池的数据源的配置
<environments default="development">
<environment id="development">
<transactionManager type="JDBC">
<property name="autoCommit" value="false"/>
</transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql"//localhost:3306/oa"/>
<property name="username" value="root"/>
<property name="passeword" value="learn"/>
</dataSource>
</environment>
</environments>
分析一下上面的配置
-
environments中的属性default,标明在缺省情况下,我们将启用哪个数据源配置
-
environment元素是配置一个数据源的开始,属性id是设置这个数据源的标志,以便MyBatis上下文使用它。
-
transactionManager配置的是数据库事务,其中type属性有3中配置方式。
(1) JDBC:采用JDBC方式管理事务,在独立编码中常用
(2)MANAGED:采用容器方式管理事务,在JNDI数据源中常用。
(3)自定义,由使用者自定义数据库事务管理办法,适用于特殊应用 -
property元素则是可以配置数据源的各类属性,我们这里配置了autoCommit=false 则是要求数据源不自动提交。
-
dataSource标签,是配置数据源的连接信息,type属性是提供我们对数据源连接方式的配置,同样MyBatis提供这么几种配置方式。
(1) UNPOOLED,非连接池数据库
(2)POOLED:连接池数据库
(3)JNDI,JNDI数据源
(4)自定义数据源。
其中,配置的property元素,就是定义数据库的各类参数。
数据库事务
数据库事务MyBatis是交由SqlSession去控制的,我们可以通过SqlSession提交(commit)或者回滚(rollback)。我们插入一个角色对象,如果成功就提交,否则就回滚
代码清单如下:
try{
sqlSession=SqlSessionFactoryUtil.openSqlSession();
RoleMapper roleMapper=sqlSession.getMapper(RoleMapper.class);
int count=roleMapper.insertRole(role);
sqlSession.commit();
return count;
}catch(Exception ex){
sqlSession.rollback();
}finally{
sqlSession.close();
}
databaseIdProvider 数据库厂商标识
MyBatis可能会运行在不同厂商的数据库中,它为此提供了一个数据库标识,并提供自定义。它的作用在于指定SQL到对应的数据库厂商提供的数据库中运行。
使用默认系统规则
MyBatis提供系统默认的配置规则
<databaseIdProvider type="DB_VENDOR">
<property name="SQL Server" value="sqlserver"/>
<property name="MySQL" value="mysql"/>
<property name="DB2" value="db2"/>
<property name="Oracle" value="oracle"/>
</databaseIdProvider>
type="DB_VENDOR"是启动MyBatis内部注册的策略器。
我们也可以指定SQL在哪个数据库厂商执行,我们把Mapper的XML配置修改一下,如下所示
<select parameterType="string" id="getRole" resultType="role" databaseId="mysql">
select role_no as roleNo,role_name as roleName,note from t_role
where role_no=#{roleNo,javaType=String,jdbcType=VARCHAR}
</select>
引入映射器的方法
1.用文件路径引入映射器
<mappers>
<mapper resource="com/learn/chapter3/mapper/roleMapper.xml"/>
</mappers>
2.用包名引入映射器
<mappers>
<package name="com.learn.chapter3.mapper"/>
</mappers>
3.用类注册引入映射器
<mappers>
<mapper class="com.learn.chapter3.mapper.UserMapper"/>
<mapper class="com.learn.chapter3.mapper.RoleMapper"/>
</mappers>
4.用userMapper.xml(外部文件形式)引入映射器
<mappers>
<mapper url="file:///var/mappers/com/learn/chapter3/mapper/roleMapper.xml"/>
</mappers>