一、概述
MyBatis配置项的顺序不能颠倒,否则可能发生异常。
二、各个配置项说明
1、properties
该属性可以给系统配置一些运行参数,可以直接在基本配置文件中即SqlSessionFactory的配置文件中直接配置:
<properties>
<property name="database.driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="database.url" value="jdbc:mysql://localhost:3306/wz_db" />
<property name="database.username" value="root" />
<property name="database.password" value="123456" />
</properties>
使用:
<dataSource type="POOLED">
<property name="driver" value="${database.driver}"/>
<property name="url" value="${database.url}"/>
<property name="username" value="${database.username}" />
<property name="password" value="${database.password}" />
</dataSource>
或者通过额外的properties配置文件配置:
<properties resource="jdbc.properties" />
在某些情况下,properties文件中的数据库用户名和密码是加密的,这时就需要通过代码传递property参数了。代码如下:
String resource = "mybatis-config.xml"//基础配置文件
InputStream inputStream;
InputSream is = Resource.getResourceAsStream("jdbc.properties");
Properties props = new Properties();
props.load(is);
String userName = props.getProperty("database.username");
String password = props.getProperty("database.password");
//解密用户名和密码
props.put("database.username", CodeUtils.decode(userName));
props.put("database.password", CodeUtils.decode(password));
inputStream = Resource.getResourceAsStream(resource);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream, props);
总结:三种配置方式优先级:代码方式>properties文件方式>property子元素方式
2、settings
settings是MyBatis中最复杂的配置,它能深刻影响MyBatis底层的运行,常用的配置项有:
关于缓存的cacheEnabled、关于级联的lazyLoadingEnabled和aggresiveLazyLoading、关于自动映射的autoMappingBehavior和mapUnderscoreToCamelCase、关于执行器类型的defaultExecutorType等。
3、typeAliases 别名
别名不区分大小写
3.1、mybatis已经定义的一些别名:
如果要使用对应类型的数组类型,查表看mybatis是否支持,然后别名加[]即可,如
_int[]。
3.2、自定义别名
3.2.1 通过代码注册别名
通过Configuration获取TypeAliasRegistry类对象:
TypeAliasRegistry aliasRegistry = configuration.getTypeAliasRegistry();
使用registerAlias()方法注册别名:
aliasRegistry.registerAlias("JDBC", JdbcTransactionFactory.class);
3.2.2 在配置文件中配置别名
在MyBatis基础配置文件即SqlSessionFactory配置文件中:
<typeAliases>
<typeAlias alias="role" type="com.mybatis.learn.Role" />
</typeAliases>
3.2.3、通过包名
<typeAliases>
<package name="com.mybatis.learn.chapter03.pojo" />
</typeAliases>
MyBatis将扫描这个包里所有的类,类名的第一个字母变为小写作为其别名,但同时扫描几个包时,可能出现重名的情况如com.chapter03.pojo和com.chapter04.pojo包中都存在类名为User的类,这时候可以通过注解@Alias("user3")进行区分。
4、typeHandler类型转换器
typeHandler的作用是将jdbcType和javaType互相转换。MyBatis提供了大部分数据类型转换,但是对于枚举类型,我们往往需要通过自定义TypeHandler去实现转换。
4.1 自定义TypeHandler
自定义TypeHandler需要实现TypeHandler接口
public class SexEnumTypeHandler implements TypeHandler<sexEnum> {
@Override
public sexEnum getResult(ResultSet rs, String columnName) throws SQLException {
return sexEnum.getSexById(rs.getInt(columnName));
}
@Override
public sexEnum getResult(ResultSet rs, int i) throws SQLException {
return sexEnum.getSexById(rs.getInt(i));
}
@Override
public sexEnum getResult(CallableStatement cs, int i) throws SQLException {
return sexEnum.getSexById(cs.getInt(i));
}
@Override
public void setParameter(PreparedStatement ps, int i, sexEnum sex, JdbcType jdbcType) throws SQLException {
ps.setInt(i, sex.getId());
}
}
枚举类型 sexEnum:
public enum sexEnum{
MALE(0, "男"), FEMALE(1, "女");
private int id;
private String sex;
private sexEnum(int id, String sex) {
this.id = id;
this.sex = sex;
}
public static sexEnum getSexById(int id){
for(sexEnum s : sexEnum.values()) {
if(s.getId() == s.id) {
return s;
}
return null;
}
/**getter and setter**/
}
启用自定义TypeHandler:
采用扫包+注解方式启用: