每当MyBatis设置参数到PrepareStatement或者从ResultSet结果集中取值时,就会用到TypeHandler来处理数据库类型与Java类型之间的转换。
myBatis类型转换器适用于 Java实体类中的类型和数据库中的类型不对应时。
比如:Java实体类中有一个Boolean类型的字段flag,对应到数据库flag字段中类型是int。这时我们会使用TypeHandler来进行入库和查询的数据转换。
下图是默认的TypeHandler:
我们开始实现一下上边例子的类型转换器:
定义实体类Dept :
public class Dept {
private Integer deptno;
private String name;
private String loc;
private boolean flage;
//get,set方法省略
}
创建Mapper接口DeptMapper:
public interface DeptMapper {
void deptSave(Dept dept);
List deptFind();
}
创建对应的Mapper文件:
INSERT INTO DEPT VALUES(#{deptno},#{name},#{loc},#{flage})
创建我们自己的类型转换类MyTypeHandler:
myBatis自定义类型转换器需要实现org.apache.ibatis.type.TypeHandler接口
public class MyTypeHandler implements TypeHandler{
/**
* 执行查询后
* 参数: ResultSet rs 查询当前列数据
* String cloumnName 查询当前列名称
*/
public Object getResult(ResultSet rs, String cloumnName) throws SQLException {
int flage = rs.getInt(cloumnName);
Boolean b = Boolean.FALSE;
if(flage == 1){
b = Boolean.TRUE;
}
return b;
}
public Object getResult(ResultSet rs, int columnIndex) throws SQLException {
// TODO Auto-generated method stub
return null;
}
public Object getResult(CallableStatement cs, int columnIndex) throws SQLException {
// TODO Auto-generated method stub
return null;
}
/**
* 此方法是在插入是进行设置参数
* 参数: PreparedStatement
* int i 为Jdbc预编译时设置参数的索引值
* Object obj 要插入的参数值
* JdbcType jdbcType 要插入JDBC的类型
*/
public void setParameter(PreparedStatement ps, int i, Object obj, JdbcType jdbcType) throws SQLException {
if(obj == null){
ps.setInt(i, 0);
}
Boolean par = (Boolean)obj;
if(par){
ps.setInt(i, 1);
}else{
ps.setInt(i, 0);
}
}
}
现在我们就需要最后一步,进行自定义类型转换器的注册(在面向接口编程中好多我们实现或者集成人家的接口或者是实现类都需要去注册,这样子程序在运行时才会知道运行的实现类是那个)。
注册类型转换器的方式有两种:
1,进行全局的注册
在核心配置文件中添加:
这种配置的作用域是全局的,也就是说所有的我们书写的Mapper中凡是满足Java类型是Boolean数据库类型是Number或者是int时(满足这个条件 javaType=“Boolean” jdbcType=“NUMERIC” ),都会执行这个MyTypeHandler。
2,局部注册
在对应的Mapper文件中添加resultMap标签:
这些是今天学习的一部分内容,如果您在上述文章中发现有错误的地方欢迎您指出来我会积极去改正。
这应该是我的第一篇博客,从大学到实习之后到工作从没有写博客的念头,但是突然感觉自己工作这么长的时间中应该把自己的积累进行实化,做些看得到的东西。