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. CentOS 7 升级内核版本

    1.查看当前内核版本 $ uname -r 3.10.0-514.el7.x86_64 $ uname -a Linux k8s-master 3.10.0-514.el7.x86_64 #1 SMP ...

  2. Redis-sentinel 哨兵(HA)

    Sentinel 介绍 Redis-Sentinel 是 Redis 官方推荐的高可用性(HA)解决方案,当用 Redis 做 Master-slave 的高可用方案时,假如Master 宕机了,Re ...

  3. SSH 密钥认证

    目录 SSH协议概述 SSH 和 Telnet 的区别 SSH 相关命令 SSH 验证方式 基于密钥的安全认证 SSH 优化 expect 脚本免交互登录 sshpass 免交互登录 SSH协议概述 ...

  4. C++ part3

    函数和const references: C++中const用于函数重载 有些情况可以重载,有些不行,具体看↑. 隐式类型转换 references: nowcoder 对于内置类型,低精度的变量给高 ...

  5. 51nod 1073约瑟夫环 递归公式法

    约瑟夫环问题的原来描述为,设有编号为1,2,--,n的n(n>0)个人围成一个圈,从第1个人开始报数,报到m时停止报数,报m的人出圈,再从他的下一个人起重新报数,报到m时停止报数,报m的出圈,- ...

  6. Python对excel的基本操作

    Python对excel的基本操作 目录 1. 前言 2. 实验环境 3. 基本操作 3.1 安装openpyxl第三方库 3.2 新建工作簿 3.2.1 新创建工作簿 3.2.2 缺省工作表 3.2 ...

  7. js load more select

    js load more select searchable scroll load more append to list refs xgqfrms 2012-2020 www.cnblogs.co ...

  8. js Array.from & Array.of All In One

    js Array.from & Array.of All In One 数组生成器 Array.from The Array.from() static method creates a ne ...

  9. how to convert Map to Object in js

    how to convert Map to Object in js Map to Object just using the ES6 ways Object.fromEntries const lo ...

  10. WebAssembly in Action

    WebAssembly in Action 数据加密,反爬虫,防盗链,版权保护,数据追踪,埋点 blogs 加密,js 禁用检测,权限控制 WebAssembly 防盗链 wasm online id ...