mybatis实践-自定义Mybatis类型转换器
这两天重新去看了http://www.mybatis.org/mybatis-3/zh/index.html上的文档一遍,按照文档上面的操作重新实践后,整理成文档记录分享。
概念
- 概念
截图自http://www.mybatis.org
总结就是:mybatis在预处理语句(PreparedStatement)中设置一个参数时将java类型(javaType)转化为jdbc类型(jdbcType),或者从结果集(ResultSet)中取出一个值时将jdbc类型(jdbcType)转化为java类型(javaType)。
-
自定义类型处理器的方法
实现 org.apache.ibatis.type.TypeHandler 接口, 或继承一个很便利的类 org.apache.ibatis.type.BaseTypeHandler, 然后可以选择性地将它映射到一个 JDBC 类型。
实践
背景:
假设有下表
其中insider类型是的值是0,1。但我们想在查询后将改字段转换为Boolean类型。当然这种情况我们不写转换器,mybatis自身可以将0转成false,1转成true。
但现在我们为了演示,进行一个非常规操作:将false转成10,true转成11,再将10转成false,11转成true。
操作:
1.实现org.apache.ibatis.type.TypeHandler
2.重新setParameter、getResult方法
代码如下
package com.learing.mybatis.util;
import com.sun.xml.internal.bind.v2.model.core.ID;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandler;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* TODO
*
* @author dsdj
* @version 1.0
* @className MyTypeHandler
* @date 2019/4/13 上午11:24
**/
public class MyTypeHandler implements TypeHandler {
/**
* 在生成SQL语句时被调用 设置从java类型转换为JDBC类型
* @param ps PreparedStatement对象
* @param i 代表第几个占位符
* @param parameter 传入的java类型参数
* @param jdbcType 需要设置的jdbc类型
* @throws SQLException
*/
public void setParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
System.out.println("进入到TypeHandler的setParameter方法中......");
// Boolean 为空 着默认为0
if (parameter == null){
ps.setInt(i,10);
return;
}
Boolean b = (Boolean) parameter;
if (b){
// true 11
ps.setInt(i,11);
}else {
// false 10
ps.setInt(i,10);
}
return;
}
/**
* 查询结束之后,在将ResultSet数据行装换为实体类对象时
* 通知TypeHandler将当前数据行某个字段转换为何种类型
* @param rs 返回值集合
* @param columnName 拦截的列表
* @return
* @throws SQLException
*/
public Object getResult(ResultSet rs, String columnName) throws SQLException {
int anInt = rs.getInt(columnName);
if (anInt == 11){
return true;
}else if (anInt == 10){
return false;
}
if (anInt == 1){
return true;
}
if (anInt == 0){
return false;
}
return false;
}
public Object getResult(ResultSet rs, int columnIndex) throws SQLException {
return null;
}
public Object getResult(CallableStatement cs, int columnIndex) throws SQLException {
return null;
}
}
3.配置类型装换器
两种方法:
-
全局:.在mybatis核心配置类中添加类型装换器
<typeHandlers> <typeHandler handler="com.learing.mybatis.util.MyTypeHandler" javaType="Boolean" jdbcType="TINYINT"></typeHandler> </typeHandlers>
-
局部(推荐)
在mapper映射文件中指定resultMap设置typeHandler属性
<resultMap id="BaseResultMap" type="com.learing.mybatis.beans.User" >
<id column="id" property="id" jdbcType="INTEGER" />
<result column="name" property="name" jdbcType="VARCHAR" />
<result column="age" property="age" jdbcType="TINYINT" />
<result column="insider" property="insider" jdbcType="TINYINT" typeHandler="com.learing.mybatis.util.MyTypeHandler" />
</resultMap>
测试
-
插入测试
@Test public void testInsert(){ UserMapper mapper = sqlSession.getMapper(UserMapper.class); User user = new User(); user.setName("张三11"); user.setAge(12); user.setInsider(false); int insert = mapper.insert(user); System.out.println(); }
-
查询测试
-
数据库表:
-
查询结果
测试成功。
-