栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

mybatis 自定义 TypeHandler

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

mybatis 自定义 TypeHandler

文章目录
    • 概述
    • 提问
    • 回答
        • 一、如何自定义typeHandler
        • 二、如何配置使用typeHandler?以及mybatis-plus自带方法如何使用?
        • 三、@MappedJdbcTypes和@MappedTypes的作用是什么
        • 四、typeHandler如何配置单个字段使用?以及如何配置全局使用?
            • 全局使用
            • 单个字段的使用
        • 五、如何进行身份证,密码,手机号,邮箱等等的脱敏处理

概述

  TypeHandler顾名思义就是类型处理器,这里类型指的是数据库类型和java类型之间的处理。

  通常情况下我们使用mybatis的时候都是varchar对应String,Date对应Date等等,但是使用自定义TypeHandler之后我们可以任意的转换数据库类型(JdbcType)和java类型。

  当你使用这个typeHandler熟练之后,你会发现,这个东西不仅仅能够进行类型处理,而且可以进行一下数据上的处理,比如身份证,密码,手机号,邮箱等等的脱敏处理。

  以下的所有的讲解使用都是基于在springboot下的使用。其它的请

提问
  1. 如何自定义typeHandler
  2. 如何配置使用typeHandler?以及mybatis-plus自带方法如何使用?
  3. @MappedJdbcTypes和MappedTypes的作用是什么
  4. typeHandler如何配置单个字段使用?以及如何配置全局使用?
  5. 如何进行身份证,密码,手机号,邮箱等等的脱敏处
回答 一、如何自定义typeHandler

  自定义typeHandler需要实现[org.apache.ibatis.type.TypeHandler],但是已经有[org.apache.ibatis.type.baseTypeHandler]实现了TypeHandler,我们只要继承这个baseTypeHandler就可以实现自定义的TypeHandler。

  注意:TypeHandler里面还有两种枚举类型的EnumOrdinalTypeHandler和EnumTypeHandler.这两种的使用不在这篇文章中说明,请查看[mybatis 枚举类型处理器 EnumTypeHandler、EnumOrdinalTypeHandler]

package org.loulan.application.function.mybatis.org.typeHandler;

import lombok.SneakyThrows;
import org.apache.ibatis.type.baseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;

import javax.swing.text.DateFormatter;
import java.sql.*;
import java.text.SimpleDateFormat;


@MappedJdbcTypes(JdbcType.TIMESTAMP)
@MappedTypes(String.class)
public class DateTypeHandler extends baseTypeHandler {
    @SneakyThrows
    @Override
    public void setNonNullParameter(PreparedStatement preparedStatement, int i, String s, JdbcType jdbcType) throws SQLException {
        SimpleDateFormat format = new SimpleDateFormat();
        java.util.Date parse = format.parse(s);
        preparedStatement.setDate(i, new Date(parse.getTime()));
    }

    @Override
    public String getNullableResult(ResultSet resultSet, String s) throws SQLException {
        try {
            String date = resultSet.getString(s);
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");
            java.util.Date parse = format.parse(date);
            return format.format(parse);
        } catch (Exception ex) {
            return null;
        }
    }

    @Override
    public String getNullableResult(ResultSet resultSet, int i) throws SQLException {
        Date date = resultSet.getDate(i);
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");

        return format.format(date);
    }

    @Override
    public String getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
        Date date = callableStatement.getDate(i);
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");

        return format.format(date);
    }
}
二、如何配置使用typeHandler?以及mybatis-plus自带方法如何使用?

  如上的案例,已经定义好了将日期类型转换为自定格式化的字符串,但是这个自定义的typeHandler如何使用呢?

  typeHandler的使用,我们可以在mapper.xml的配置文件中的resultMap中进行配置使用,也可以在参数传递的时候进行配置使用。





    
            
            
            
            
            
            
            
            
            
            
            
    

    
        UUID,ADL_CD,AD_NM,
        AD_SHNM,AD_A,PID_UUID,
        ST_DT,END_DT,IS_ENABLE,
        TS,NT
    

    
        select
        
        from dm_addr
    

    
        insert into dm_addr(ADL_CD,ST_DT) VALUES(#{adlCd},#{stDt,typeHandler=org.loulan.application.function.mybatis.org.typeHandler.DateTypeHandler})
    

  如上在resultMap或者参数中配置typeHandler属性便可一使用。

  那么如果我们调用的是mybatis-plus自带的方法应该如何使用typeHandler,这个其实在官方网站中也提到了,就是使用注解@TableField,该注解里面有一个属性就是typeHandler(需要配合@TableName里面autoResultMap使用),通过这个属性的配置就可以使用typeHandler。如下是官方给的解释:

关于jdbcType和typeHandler以及numericScale的说明:
numericScale只生效于 update 的sql. jdbcType和typeHandler如果不配合@TableName#autoResultMap = true一起使用,也只生效于 update 的sql. 对于typeHandler如果你的字段类型和set进去的类型为equals关系,则只需要让你的typeHandler让Mybatis加载到即可,不需要使用注解

三、@MappedJdbcTypes和@MappedTypes的作用是什么

  使用typeHandler就不可避免的会使用到这两个注解,这两个注解一个是用来定义数据库类型JdbcType,一个是定义java类型。

  如此我们可以看出,既然定义了两种类型,还正好是转换的两种类型,那么它的作用就是筛选。只有符合这两种类型转换的typehandler才能使用,也就是说,即使你定义对应的resultMap使用了typeHandler,但是类型对应不上也是无法使用的。

  个人认为,这两个注解的使用,更多的使用在全局的typeHandler上面。

四、typeHandler如何配置单个字段使用?以及如何配置全局使用? 全局使用

  使用typeHandler的时候,有时候我们是使用在全局的过程中的,也就是说只要符合筛选条件的就可以使用这个typeHandler,如何配置才能让这个typeHandler变成为全局的typeHandler。

// application.yml
mybatis-plus:
    type-handlers-package: org.loulan.application.function.mybatis.org.config

  通过这个配置的扫描就可以将对应jar包下的typeHandler扫描为全局的typeHandler。全局的typeHandler是不需要在resultMap中配置查询返回的,只要符合条件的就可以自动使用这个typeHandler。

单个字段的使用

  就像前面讲解说明的时候一样,需要配置在指定的resultMap中,单个字段的配置使用,实体类中的配置需要配置在@TableField的typeHandler属性中。

注意要进行@TableField属性typeHandler配置使用的需要配合@TableName的autoResultMap属性。

  为什么要配合@TableNamed的autoResultMap来使用呢,个人经过测试,这个并不是一定的。只是实体类的配置中没有resultMap,造成这个typeHandler没有承载,其实在@TableName中还有一个属性resultMap,使用这个属性可以直接指定mapper.xml中一个resultMap直接使用,这样@TableField的typeHandler属性也就可以使用了。

五、如何进行身份证,密码,手机号,邮箱等等的脱敏处理

  通过上面学习,我们可以知道typeHandler的实现使用需要实现4个方法,这四个方法中有一个方式设set,三个方法是get。如此我们便可以在set方法中通过对传递过来的数据进行加密再保存到数据库。在get方法中,我们可以使用解密方法解密之后再返回到对象的属性中。

  set和get操作就可以使用这些关键信息的脱敏处理,而且不需要们额外的进行处理。关于关键信息的脱敏处理也可以使用全局的拦截器等等进行mybatis的拦截处理。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/337194.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号