前言
在上一篇中已经介绍了MyBatis的基本结构及简单的实现方法,想要用好MyBatis我们还需要更进一步对它进行配置,接下来将介绍如何对MyBatis进行进一步配置。
Mybatis配置XML文件的层次结构
接下来我们对XML文件中这些元素进行一一介绍
properties元素
作用:配置属性的元素,属性能够在配置文件的上下文中使用。
配制方法:
a、property子元素
b、properties配置文件
c、程序参数传递
property子元素配置
配置
使用
properties配置文件
配置文件
使用,需要在配置文件用引入
程序参数传递
当开发过程中,一些参数如数据库的登录密码等需要加密,在创建SqlSessionFactory的时候需要解码,手动创建SqlSessionFactory,将参数传递进去。
代码如下:
优先级
三种配置方式可能同时出现,而且属性还有可能重复,这个时候就涉及到三种方式的优先级。
加载顺序如下:
1、在properties元素体内指定的属性首先被加载
2、properties文件中的属性被加载,并覆盖同名的属性
3、读取作为方法参数传递的属性,并覆盖已读取的同名属性
注:a、实际操作中尽量避免使用混合方式 b、首选方式为properties文件 c、如果要对数据进行特殊操作,将数据存在文件中,用方法参数传递,进行特殊处理,如加密。
设置-settings
作用:在MyBatis中是比较复杂的排至,比较重要,通过它可以改变MyBatis的行为。即使不配置settings,MyBatis也可以正常工作。
配置内容表格如下
代码实例如下:
别名-typeAliases
作用:当类全称过长的时候,可以给这个类取一个别名,方便引用。
分类:系统定义别名,自定义别名
作用域:别名是不分大小写的,并且长期保存在Configuration对象中,当我们使用时,再拿出来。
系统定义别名在API里面都有详细介绍,这里我们着重讲解自定义方法
配置方法:
为每个类单独配置别名
缺点:如果类过多,会造成XML文档复杂。
自动扫描的形式定义别名
定义扫描:
配置别名,使用@Alias注解
注:当不使用@Alias的时候,将会默认别名为类名首字母小写。
typeHandler类型处理器
作用:将参数从javaType转换为jdbcType,或者从数据库中取出数据,将jdbcType转换成javaType。当从预处理语句中获取参数或从结果集中取出参数时,都会使用到注册的typeHandler进行处理。
分类:系统定义和自定义。
系统自定义的typeHandler在这里我们多描述,具体请看API。需要注意:数值类型的精度和java的精度长度是不一样的。
自定义typeHandler
第一步:实现自定义的typeHandler,实现接口org.apache.ibatis.type.TypeHandler或继承org.apache.ibatis.type.BaseTypeHandler来实现
代码如下
a、继承BaseTypeHandler实现
@MappedTypes定义的是JavaType类型,可以指定那些Java类型被拦截
@MappedJdbcTypes定义的是JdbcType类型,它需要满足枚举类org.apache.ibatis.type.JdbcType所列的枚举类型
@MappedTypes({Date.class})
@MappedJdbcTypes(JdbcType.VARCHAR)
public class MyStringTypeHandler extends BaseTypeHandler<String> {
/**
* 将时间戳字符串存入数据库
*/
@Override
public void setNonNullParameter(PreparedStatement ps, int i, Date parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, String.valueOf(parameter.getTime()));
}
/**
* 把时间戳类型的字符串取出转换为Date
*/
@Override
public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
return new Date(rs.getLong(columnName));
}
/**
* 把时间戳类型的字符串取出转换为Date
*/
@Override
public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return new Date(rs.getLong(columnIndex));
}
/**
* 把时间戳类型的字符串取出转换为Date
*/
@Override
public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return cs.getDate(columnIndex);
}
}
b、实现TypeHandler接口
@MappedTypes({String.class})
@MappedJdbcTypes(JdbcType.VARCHAR)
public class MyStringTypeHandler implements TypeHandler<String>{
@Override
public String getResult(ResultSet rs, String colName) throws SQLException{
return rs.getString(colName);
}
@Override
public Calendar getResult(ResultSet rs, int index) throws SQLException{
return re.getString(index);
}
@Override
public Calendar getResult(CallableStatement cs, int index) throws SQLException{
return cs.getString(index);
}
@Override
public void setParameter(PreparedStatement ps, int index, String values, JdbcType jt) throws SQLException {
ps.setTimestamp(index, values);
}
}
第二步、在XML中配置
第三步、使用typeHandler,应用三种不同的方法使用。
枚举类型typeHandler
MyBatis内部提供了两个转化枚举类型的typeHandler ,分别是org.apache.ibatis.type.EnumTypeHandler和org.apache.ibatis.type.EnumOrdinalTypeHandler(默认的处理器)
EnumTypeHandler是使用枚举字符串名称作为参数传递,传递进去的是一个字符串并保存在数据库中,EnumOrdinalTypeHandler是使用整数下标作为参数传递的,保存在数据库中是整数参数。
系统自带的枚举类型typeHandler和普通和typeHandler用法上是一样的。
一个简单的性别枚Sex
public enum Sex{
MALE(1,"男"),FEMALE(2,"女");
private int id;
private String name;
privae Sex(int id, String name){
this.id = id;
this.name = name;
}
public int getId(){
return id;
}
public void setId(int id){
this.id = id;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public static Sex getSex(int id){
if(id == 1){
return MALE;
}else if(id == 2){
return FEMALE;
}
return null;
}
}
自定义枚举类型typeHandler
第一步:给出自定义源码
第二步:在Mapper-configer.xml中进行配置
ObjectFactory
作用:当结果返回时,使用ObjectFactory(对象工厂)去构建POJO,可以定制自己的工厂对象,默认是org.apache.ibatis.reflection.factory.DefaultObjectFactory。
还可以自定义对象工厂,自定义的时候需要继承DefaultObjectFactory类,然后在配置文件中声明。
environments配置环境
作用:用来注册数据源,可以注册多个数据源,每个数据源分为两大部分,一个是数据源的配置,另外一个是数据库事务的配置。
示例:
数据库事务中type属性的取值
a、JDBC,采用JDBC方式管理事务,经常使用在独立编码中
b、MANAGED,采用容器方式管理事务,在JNDI数据源中常用
c、自定义,自定义事务管理方法
dataSource标签中,type属性的取值(数据库连接方式)
a、UNPOOLED,非连接池数据库
b、POOLED,连接池数据库
c、JNDI,JNDI数据源
d、自定义数据源
使用自定义数据源,必须实现org.apache.ibatis.datasource.DataSourceFactory接口。
databaseIdProcider数据库厂商标识
作用:指定SQL到对应的数据库厂商提供的数据库中运行。
系统默认配置
type=“DB_VENDOR”是启动MyBatis内部注册的策略器:
①MyBatis会将你的配置读入Configuration类里面。
②在连接数据库后调用getDatabaseProductName()方法去获取数据库的信息。
③用配置的name去做匹配得到DatabaseId
在mapper中应用
不使用系统默认规则
自定义需要实现databaseIdProvider接口,并且实现配置。
第一步、实现接口
第二步、配置
引入映射器的方法
第一种,用文件路径引入映射器
第二种,用包名引入映射器
第三种,用类注册引入映射
第四种,userMapper.xml引入映射器
总结
到现在为止,我们已经较全面介绍了mybatis-config.xml配置文件中的内容,剩下插件我们没有介绍,插件应用比较复杂,也比较危险,我们在后期专门介绍。上面介绍的内容中着重掌握数据源的配置,和引入映射器的方法,这两个是核心。下一篇着重介绍映射器的配置。