mybatis实践-自定义Mybatis类型转换器

版权声明:本文为博主原创文章,未经允许不得转载。 https://blog.csdn.net/qq_24672657/article/details/89282778

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();
    
    }
    

在这里插入图片描述

  • 查询测试

    • 数据库表:
      在这里插入图片描述

    • 查询结果
      在这里插入图片描述
      测试成功。

猜你喜欢

转载自blog.csdn.net/qq_24672657/article/details/89282778