概述
Mybatis的配置项的顺序不能颠倒,如果颠倒了它们的顺序,那么在mybatis启动阶段就会发生异常,导致无法运行。其中properties、settings、typeAliases、typeHandler、plugin、environments、mappers是常用内容。
Properties属性
Properties属性可以给系统配置一些运行参数,可放在xml或者properties文件中,不可放在java编码中,这样的好处在于方便参数的修改,而不会引起代码的重新编译。
有三种方式使用properties:
1.Property子元素
2.Properties文件
3.程序代码传递
Property子元素
使用property子元素将数据库连接的相关配置
代码见书
这里使用了元素
使用properties文件
这个文件非常简单,其逻辑就是键值对应,我们可以配置多个键值对应放在一个properties文件中,也可以把多个键值放到多个properties文件中。这种方式方便日后维护和修改。
创建一个文件jdbc.properties放到classpath下
database.driver=com.mysql.jdbc.Driver
database.url=jdbc:mysql://localhost:3306/ssm
database.username=root
database.password=123456
在mybatis中,通过
按照${database.username}的方法引用properties文件属性到mybatis文件中,这个时候我们维护properties文件就可以维护我们的配置内容了。
程序传递方式传递参数
代码见书
首先使用Resourcs对象读取一个jdbc.properties文件,然后获取了它原来配置的用户名和密码,进行解密并重置,最后使用sqlsessionfactoryBuilder的builder的方法,传递多个properties参数。这将覆盖之前的密文,这样就能连接数据库了。
总结
Mybatis使用properties有三种方式。是有优先级的,最优先的是使用程序传递方式,其次是properties文件,最后properties子元素方式,mybatis会根据优先级来覆盖原先配置的属性值。建议使用propertis文件方式,管理简易,可以从XML文件中剥离出来独立维护。
Setting设置
它能深刻影响Mybatis的底层运行,但是大部分情况使用默认值便可以运行,只需要修改一些常用规则:比如 自动映射(autoMappingBehaviror)(mapUnderscoreToCameCase)、驼峰命名映射()、级联映射(lazyLoadingEnabled)(aggressiveLazyLoading)、是否启动缓存(acheEnabled)、执行器(defaultExecutorType)等。
例如:
typeAliases别名
在Mybatis中允许定义一个简写来代表这个类,这就是别名,别名分别为系统别名和自定义别名。别名由类TypeAliasRegistry(org.apache.ibatis.type.TypeAliasRegistry)去定义。别名不区分大小写。
有时候要通过代码来实现注册别名,例如:
public TypeAliasRegistry(){
registerAlias("string",String.class); //别名为string
}
事实上Configuration对象也对一些常用的配置项配置了别名。
代码见书
以上就是系统命名,但是不要出现重复命名。
自定义别名
比如一个对象(User)需要大量的使用,因此Mybatis也提供了用户自定义别名的规则,我们可以通过TypeAliasRegistry类的registerAlias方法注册,也可以采用配置和扫描的方式来定义。
使用配置文件定义:但是有很多类需要定义别名,不采用这种方式。
如果两个类都在同一包下,可以使用扫描方式:
这样Mybatis将扫描这个包里的类,将其第一个字母变成小写作为别名,比如类Role的别名变成role。有时候会出现重名,比如com.learn.ssm.chapter4.pojo.User这个类,同时我们还增加了对包com.learn.ssm.chapter3.pojo的扫描,那么就会出现异常,这个使用可以使用Mybatis提供的注解@Alias("user3")进行区分。
package com.learn.ssm.chapter3.pojo;
@Alias("user3")
public Class User{
...
}
这样就能避免因为重命名导致扫描失败的问题。
typeHandler类型转换器
在JDBC中,需要在PreparedStatement对象中设置那些已经预编译过的SQL语句的参数。
执行SQL后,会通过ResultSet对象获取到数据库中的数据。
在TypeHandler中分为javaType和jdbcType。前者用于定义java类型,后者用于定义数据库类型。而typeHandler的作用就是承担jdbctype和javatype之间的互相转换。
和别名一样,存在系统定义和自定义typehandler。打开源码会发现了他们都继承了BaseTypeHandler。
系统定义TypeHandler
Mybatis使用最多的是StringTypeHandler,它用于字符串转换。
自定义TypeHandler
枚举有特殊的转化规则,这个时候就需要自定义TypeHandler进行处理。
要实现typeHandler就需要去实现接口typehandler,或者继承BaseTypeHandler。
自定义一个————MyTypeHandler:
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException
;import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandler;import org.apache.log4j.Logger;
public class MyTypeHandler implements TypeHandler{
Logger logger=Logger.getLogger(MyTypeHandler.class);
@Override
public void setParameter(PreparedStatement ps, int i, String parameter,
JdbcType jdbctype) throws SQLException {
logger.info("设置String参数["+parameter+"]");
ps.setString(i, parameter);
}
@Override
public String getResult(ResultSet rs, String columnName) throws SQLException {
String result=rs.getString(columnName);
logger.info("读取String参数1["+result+"]");
return result;
}
@Override
public String getResult(ResultSet rs, int columnIndex) throws SQLException {
String result=rs.getString(columnIndex);
logger.info("读取String参数2["+result+"]");
return result;
}
@Override
public String getResult(CallableStatement cs, int columnIndex)
throws SQLException {
String result=cs.getString(columnIndex);
logger.info("读取String参数3["+result+"]");
return result;
}
}
定义的泛型为String,显然我们要把数据库类型转换为String型。然后实现设置参数和获取结果集的方法。但是需要开启
配置typeHandler:
使用自定义TypeHandler的有两种方法。
如果要在insert或者update时使用则需要在sql定义中添加相应的内容。如下:
有时候枚举类型很多,我们可以使用包扫描的形式:
只是这样我们没法指定jdbctype和javatype,我们需要使用注解方式处理:
@MappedType(String.class)
@MappedjdbcType(jdbcType.VARCHAR)
public class MyTypeHandler implement TypeHandler
{ .......
}
枚举typehandler
TypeHandler因为枚举而使用,Mybatis已经定义两个枚举类型支持,
EnumOrdinalTypeHandler: 默认转换类,是按Mybatis根据枚举数组下标索引的方式进行匹配的,它要求数据库返回一个整数作为下标,它会根据下标找到对应的枚举类型。
EnumTypeHandler: 会把使用的名称转换为对应的枚举
ObjectFactory(对象工厂)
当创建结果集时,Mybatis会使用对象工厂来完成创建结果集实例。如果需要自定义,则需要实现接口org.apache.ibatis.relection.factory.factory.ObjectFactory 大部分情况下不需要自定义返回规则。