1. TypeHandler简介

    TypeHandler,顾名思义类型转换器,就是将数据库中的类型与Java中的类型进行相互转换的处理器。

    MyBatis 在设置预处理语句(PreparedStatement)中的参数或从结果集中取出一个值时, 都会用类型处理器将获取到的值以合适的方式转换成 Java 类型

  2. 实现讲解

    经常自定义类型转换器方式有两种,实现 TypeHandler 接口, 或继承抽象类 BaseTypeHandle,并且可以指定转换后的字段类型。

    • 其实BaseTypeHandler也是继承了TypeHandler接口,在实现的TypeHandler接口的方法中调用的是自身抽象方法,如下
    public abstract class BaseTypeHandler<T> extends TypeReference<T> implements TypeHandler<T> {
    
      public T getResult(ResultSet rs, String columnName) throws SQLException {
    Object result;
    try {
    result = this.getNullableResult(rs, columnName);
    } catch (Exception var5) {
    throw new ResultMapException("Error attempting to get column '" + columnName + "' from result set. Cause: " + var5, var5);
    } return rs.wasNull() ? null : result;
    } public abstract T getNullableResult(ResultSet var1, String var2) throws SQLException;
    }
    • 抽象类BaseTypeHandler的抽象方法
    // 执行之前,将Java类型转换为对应的jdbc类型,用于赋值sql中参数
    public abstract void setNonNullParameter(PreparedStatement var1, int var2, T var3, JdbcType var4) throws SQLException; // 根据列名从resultSet中获取,将JDBC类型转换为Java类型
    public abstract T getNullableResult(ResultSet var1, String var2) throws SQLException; // 根据下标从resultSet中获取,将JDBC类型转换为Java类型
    public abstract T getNullableResult(ResultSet var1, int var2) throws SQLException; // 用于在执行完存储过程后,将JDBC类型转换为Java类型
    public abstract T getNullableResult(CallableStatement var1, int var2) throws SQLException;
  3. 自定义类型处理器

    ​ 假设现在有一个支付标识(0-否 1-是)字段,数据库中我们存入的是tinyint 0/1,但是前端显示却是 是/否,使用TypeHandler就可以实现。具体步骤如下:

    • 新建MyTypeHandler,继承BaseTypeHandler类
    public class MyTypeHandler extends BaseTypeHandler<String> {
    
        /**
    * @Description 执行之前,将Java类型转换为对应的jdbc类型,用于赋值sql中参数
    **/
    @Override
    public void setNonNullParameter(PreparedStatement preparedStatement, int i, String s, JdbcType jdbcType) throws SQLException {
    preparedStatement.setInt(i,Integer.valueOf(s));
    } /**
    * @Description 根据列名从resultSet中获取,将JDBC类型转换为Java类型
    **/
    @Override
    public String getNullableResult(ResultSet resultSet, String s) throws SQLException {
    return this.convert(resultSet.getInt(s));
    } /**
    * @Description 根据下标从resultSet中获取,将JDBC类型转换为Java类型
    **/
    @Override
    public String getNullableResult(ResultSet resultSet, int i) throws SQLException {
    return this.convert(resultSet.getInt(i));
    } /**
    * @Description 用于在执行完存储过程后,将JDBC类型转换为Java类型
    **/
    @Override
    public String getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
    return this.convert(callableStatement.getInt(i));
    } /**
    * @Description 对数据库中0/1进行转换
    **/
    private String convert(int flag){
    if (flag==1){
    return "是";
    }
    return "否";
    }
    }
    • 在Mapper中指定需要转换的字段,jdbcType指数据库中的类型,javaType指Java中的类型,typeHandler指定自定义的转换器
    <result column="flag" property="flag" jdbcType="TINYINT" javaType="java.lang.String" typeHandler="com.rangers.MyTypeHandler"></result>
    • 进行测试
        private SqlSession sqlSession ;
    private OrderMapper orderMapper; @Before
    public void init() throws IOException {
    InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    sqlSession = sqlSessionFactory.openSession();
    orderMapper = sqlSession.getMapper(OrderMapper.class);
    } // 测试读取时转换
    @org.junit.Test
    public void testResult(){
    Order order = orderMapper.selectOne(1);
    System.out.println(order);
    } // 测试传入时转换
    @org.junit.Test
    public void testParameter(){
    // 假设前端传入字符串0/1
    List<Order> orders = orderMapper.selectOneByFlag("1");
    System.out.println(orders);
    } @After
    public void close(){
    sqlSession.close();
    }
    [Order{id=2, time=Wed Mar 10 17:22:45 CST 2021, total=2.22, uid=1, flag=是}, Order{id=3, time=Wed Mar 10 17:22:57 CST 2021, total=3.33, uid=2, flag=是}]
  4. 全局字段转换与单个字段转换

    全局转换:在核心配置文件中添加typeHandlers标签

    <typeHandlers>
    <typeHandler handler="com.rangers.MyTypeHandle"/>
    </typeHandlers>

    单个字段转换:指定jdbcType、javaType与typeHandler

    <result column="flag" property="flag" jdbcType="TINYINT" javaType="java.lang.String" typeHandler="com.rangers.MyTypeHandler"></result>

    通常在项目中使用的是单个字段进行转换,经常自定义类型处理器还有日期处理、加密字段处理、List处理,JSON处理等

MyBatis(九):MyBatis类型处理器(TypeHandler)详解的更多相关文章

  1. MyBatis源码解析(十)——Type类型模块之类型处理器TypeHandler

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6715063.html 1.回顾 之前的两篇分别解析了类型别名注册器和类型处理器注册器,此二 ...

  2. 深入浅出Mybatis系列(四)---配置详解之typeAliases别名(mybatis源码篇)

    上篇文章<深入浅出Mybatis系列(三)---配置详解之properties与environments(mybatis源码篇)> 介绍了properties与environments, ...

  3. Mybatis的配置文件和映射文件详解

    一.Mybatis的全局配置文件 1.SqlMapConfig.xml是mybatis的全局配置文件,配置内容如下: properties(属性) settings(全局配置参数) typeAlias ...

  4. 热烈祝贺华清远见《ARM处理器开发详解》第2版正式出版

    2014年6月,由华清远见研发中心组织多名业 内顶尖讲师编写的<ARM处理器开发详解>一书正式出版.本书以S5PV210处理器为平台,详细介绍了嵌入式系统开发的各个主要环节,并注重实践,辅 ...

  5. C#中的预处理器指令详解

    这篇文章主要介绍了C#中的预处理器指令详解,本文讲解了#define 和 #undef.#if.#elif.#else和#endif.#warning和#error.#region和#endregio ...

  6. MyBatis的SQL语句映射文件详解

    SQL 映射XML 文件是所有sql语句放置的地方.需要定义一个workspace,一般定义为对应的接口类的路径.写好SQL语句映射文件后,需要在MyBAtis配置文件mappers标签中引用 < ...

  7. MyBatis魔法堂:Insert操作详解(返回主键、批量插入)

    一.前言    数据库操作怎能少了INSERT操作呢?下面记录MyBatis关于INSERT操作的笔记,以便日后查阅. 二. insert元素 属性详解   其属性如下: parameterType  ...

  8. MyBatis魔法堂:Insert操作详解

    一.前言 数据库操作怎能少了INSERT操作呢?下面记录MyBatis关于INSERT操作的笔记,以便日后查阅. 二. insert元素 属性详解 其属性如下: parameterType:入参的全限 ...

  9. MyBatis学习笔记2--配置环境详解

    1.MyBatis-config.xml详解 一个完整的配置文件如下所示 <configuration> <!-- <properties resource="jdb ...

随机推荐

  1. Leetcode(17)-电话号码的字母组合

    给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 示例: 输入:"23" 输出:[&quo ...

  2. ZOJ 3494 BCD Code(AC自动机 + 数位DP)题解

    题意:每位十进制数都能转化为4位二进制数,比如9是1001,127是 000100100111,现在问你,在L到R(R <= $10^{200}$)范围内,有多少数字的二进制表达式不包含模式串. ...

  3. CDD All In One

    CDD All In One 组件驱动开发 (CDD) refs https://www.componentdriven.org/ https://www.learnstorybook.com/int ...

  4. 编程术语 All In One

    编程术语 All In One js 名词,术语 函数 函数签名 一个函数签名 (或类型签名,或方法签名) 定义了 函数 或 方法 的输入与输出. 一个签名可以包括: 参数 及参数的 类型 一个返回值 ...

  5. wifi IP address scanner on macOS

    wifi IP address scanner on macOS Nmap Network Scanning https://nmap.org/book/inst-macosx.html https: ...

  6. vuex & redux

    vuex & redux https://vuex.vuejs.org/ https://github.com/xgqfrms/VAIO/ https://scrimba.com/playli ...

  7. c++ 获取兄弟窗口

    // 返回给定窗口上方窗口的句柄. HWND prevSibling = GetWindow((HWND)0x1011C, GW_HWNDPREV); printf("%x\n", ...

  8. 08.手写KNN算法测试

    导入库 import numpy as np from sklearn import datasets import matplotlib.pyplot as plt 导入数据 iris = data ...

  9. 进阶高阶IoT架构-教你如何简单实现一个消息队列

    前言 消息队列是软件系统领域用来实现系统间通信最广泛的中间件.基于消息队列的方式是指由应用中的某个系统负责发送消息,由关心这条消息的相关系统负责接收消息,并在收到消息后进行各自系统内的业务处理.消息可 ...

  10. scala:函数作为值或参数进行传递、作为返回值进行返回

    @ 目录 函数可以作为值进行传递 函数可以作为参数进行传递 函数可以作为返回值进行返回 什么是匿名函数 函数可以作为值进行传递 语法var f = 函数名 _ 如果明确了变量的数据类型,那么下划线可以 ...