Mybatis的typeHandlers类型处理器的使用

简介: Java类型和JDBC类型的转换工作由类型处理器来完成。接口typeHandlers,用于处理Java类型和JDBC类型之间的转换,本文介绍的是它的一个抽象类:BaseTypeHandler。

当数据库中的类型,封装到实体类中,我们使用的Mybatis框架已经做了很多类型处理的工作,这个工作由typeHandlers负责。

数据库中的日期类型进行封装的时候有多种选择,也可以封装成String类型,我们来看看默认类型处理器封装的格式:

birthday=2003-08-08 10:00:00.0

现在有一个新的需求:

需求:封装日期时,指定了一个格式,我需要的是 2003年08月08日并且 不需要时间,问该如何做?

对于这种自定义的类型转换,这时候Mybatis的typeHandlers可以起作用啦!

接口typeHandlers用于处理Java类型和JDBC类型之间的转换。 它有一个抽象类:BaseTypeHandler<E>,可以方便的完成我们想要做的事情,具体做法如下:

继承BaseTypeHandler

编写了一个DateTypeHandler类,继承BaseTypeHandler,在泛型中写明的是封装成Java的类型。这里我们需要将TIMESTAMP转化成String,所以泛型是String

它需要实现四个方法:

  1. 第一个是用于save操作时,操作prepareStatement的。
  2. 第二、三、四个是用于查询时resultSet作封装时使用的。此需求我们关注getNullableResult方法,它的第二个参数是对应的列名
public class DateTypeHandler extends BaseTypeHandler<String> {
    @Override
    public void setNonNullParameter(PreparedStatement preparedStatement, int i, String s, JdbcType jdbcType) throws SQLException {

    }

    @Override
    public String getNullableResult(ResultSet resultSet, String s) throws SQLException {
        return null;
    }

    @Override
    public String getNullableResult(ResultSet resultSet, int i) throws SQLException {
        return null;
    }

    @Override
    public String getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
        return null;
    }
}

类名上的修饰

@MappedTypes(String.class)
@MappedJdbcTypes(JdbcType.TIMESTAMP)
public class DateTypeHandler extends BaseTypeHandler<String> {
}
  1. @MappedTypes指定Java类型为String
  2. @MappedJdbcTypes注解指定JDBC类型为TIMESTAMP。

方法体的内容。

我们需要定义封装的规则,因为涉及到日期的格式化问题,可以考虑使用SimpleDateFormat进行格式化的操作。

  1. Timestamp sqTimestamp = resultSet.getTimestamp(s);通过列名获取时间戳
  2. Date date = new Date(sqTimestamp.getTime());通过时间戳获取Date类型的对象
  3. SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日");规则日期格式,只有年 月 日
  4. String dateString = dateFormat.format(date);得到格式化的日期,将日期字符串返回。

完整代码如下,为了防止有空日期存在的列,添加了一个if判断。

@Override
public String getNullableResult(ResultSet resultSet, String s) throws SQLException {
    Timestamp sqTimestamp = resultSet.getTimestamp(s);
    if (null == sqTimestamp){
        return null;
    }else {
        Date date = new Date(sqTimestamp.getTime());
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日");
        String dateString = dateFormat.format(date);
        System.out.println(dateString);
        return dateString;
    }
}

配置文件

handler中写明处理器的全类路径即可。

<typeHandlers>
    <typeHandler handler="top.chengyunlai.typeHandle.DateTypeHandler"/>
</typeHandlers>

总结

类型转换,用于一对一的java类型JDBC类型做转换使用,通常的转换器已经符合日常的大部分使用,如果遇到特殊需求可以按步骤编写自定义的类型处理器进行封装和保存操作,操作的逻辑是操作prepareStatementResultSet,这部分知识是属于JDBC的内容,还是比较基础的。

附录

常见的日期时间格式:

  • "yyyy-MM-dd HH:mm:ss":年月日时分秒(例如:2023-02-19 21:20:17)
  • "yyyy/MM/dd HH:mm:ss":年月日时分秒(例如:2023/02/19 21:20:17)
  • "yyyy年MM月dd日 HH:mm:ss":年月日时分秒(例如:2023年02月19日 21:20:17)
  • "yyyy-MM-dd":年月日(例如:2023-02-19)
  • "yyyy/MM/dd":年月日(例如:2023/02/19)
  • "yyyy年MM月dd日":年月日(例如:2023年02月19日)
  • "HH:mm:ss":时分秒(例如:21:20:17)
  • "HH:mm":时分(例如:21:20)
目录
相关文章
|
6月前
|
SQL Java 数据库连接
Mybatis源码分析系列之第三篇:Mybatis的操作类型对象
Mybatis源码分析系列之第三篇:Mybatis的操作类型对象
|
6月前
|
SQL Java 数据库连接
Mybatis之核心配置文件详解、默认类型别名、Mybatis获取参数值的两种方式
【1月更文挑战第3天】 一、核心配置文件详解 二、默认的类型别名 三、MyBatis的增删改查 四、MyBatis获取参数值的两种方式 1、单个字面量类型的参数 2、多个字面量类型的参数 3、map集合类型的参数 4、实体类类型的参数 5、使用@Param标识参数
109 2
Mybatis之核心配置文件详解、默认类型别名、Mybatis获取参数值的两种方式
|
6天前
|
SQL Java 数据库连接
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
MyBatis-Plus是一个MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。本文讲解了最新版MP的使用教程,包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段等核心功能。
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
|
1月前
|
SQL Java 数据库连接
mybatis使用四:dao接口参数与mapper 接口中SQL的对应和对应方式的总结,MyBatis的parameterType传入参数类型
这篇文章是关于MyBatis中DAO接口参数与Mapper接口中SQL的对应关系,以及如何使用parameterType传入参数类型的详细总结。
32 10
|
1月前
|
SQL Java 数据库连接
Mybatis中传入不同类型的值处理方案
这篇文章讲述了在Mybatis中如何处理传入不同类型参数的情况,包括单个值、列表及Map等,并提供了相应的XML映射和Java代码示例。
72 0
|
6月前
|
存储 XML Java
mybatis使用内部类处理一对多类型数据2
mybatis使用内部类处理一对多类型数据2
63 0
|
6月前
|
SQL Java 数据库连接
Mybatis查询的时候BigDecimal类型的值查询失效的解决办法
Mybatis查询的时候BigDecimal类型的值查询失效的解决办法
|
6月前
|
存储 JSON Java
深入理解 MyBatis-Plus 中的 JSON 处理器及案例演示
深入理解 MyBatis-Plus 中的 JSON 处理器及案例演示
774 0
|
6月前
|
SQL 存储 测试技术
深入了解MyBatis-Plus中的枚举处理器及实例演示
深入了解MyBatis-Plus中的枚举处理器及实例演示
338 0
|
6月前
|
SQL XML Java
mybatis元素类型为 "resultMap" 的内容必须匹配 "(constructor?,id *,result*,association报错解决
mybatis元素类型为 "resultMap" 的内容必须匹配 "(constructor?,id *,result*,association报错解决
316 0