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)
目录
相关文章
|
5月前
|
SQL Java 数据库连接
Mybatis源码分析系列之第三篇:Mybatis的操作类型对象
Mybatis源码分析系列之第三篇:Mybatis的操作类型对象
|
8月前
|
Java 数据库连接 mybatis
mybatis返回map类型数据空值字段不显示(三种解决方法)
mybatis返回map类型数据空值字段不显示(三种解决方法)
|
4月前
|
SQL Java 数据库连接
Mybatis之核心配置文件详解、默认类型别名、Mybatis获取参数值的两种方式
【1月更文挑战第3天】 一、核心配置文件详解 二、默认的类型别名 三、MyBatis的增删改查 四、MyBatis获取参数值的两种方式 1、单个字面量类型的参数 2、多个字面量类型的参数 3、map集合类型的参数 4、实体类类型的参数 5、使用@Param标识参数
63 2
Mybatis之核心配置文件详解、默认类型别名、Mybatis获取参数值的两种方式
|
5月前
|
存储 Java 数据库连接
MyBatis的类型处理器TypeHandler与自定义实现
MyBatis的类型处理器TypeHandler与自定义实现
187 0
|
2月前
|
SQL Java 数据库连接
Mybatis查询的时候BigDecimal类型的值查询失效的解决办法
Mybatis查询的时候BigDecimal类型的值查询失效的解决办法
|
4月前
|
SQL XML Java
mybatis元素类型为 "resultMap" 的内容必须匹配 "(constructor?,id *,result*,association报错解决
mybatis元素类型为 "resultMap" 的内容必须匹配 "(constructor?,id *,result*,association报错解决
56 0
|
5月前
|
SQL IDE Java
MyBatis【问题 01】mapper传入array\collection\list类型的参数时报BindingException:Parameter ‘xx‘ not found问题复现及解决
MyBatis【问题 01】mapper传入array\collection\list类型的参数时报BindingException:Parameter ‘xx‘ not found问题复现及解决
63 0
|
9月前
|
Java 数据库连接 mybatis
mybatis映射文件格式错误:根元素类型mapper的文档类型声明必须以..结尾
mybatis映射文件格式错误:根元素类型 mapper 的文档类型声明必须以>结尾。 在写Spring 项目的时候,mapper.xml一直提示我报这个错误,实在是百思不得其解,经过不断的探索,终于找到了原因,我原来写的mapper.xml文件是这样的:
80 1
|
9月前
|
SQL Java 数据库连接
MyBatis输出类型
MyBatis输出类型
50 0
|
9月前
|
Java 关系型数据库 数据库连接
探索Java中的MyBatis Plus注解 @DbType:灵活处理数据库类型
在数据库操作中,不同的数据库系统可能具有不同的数据类型,如MySQL、Oracle、SQL Server等,这就需要我们在操作中处理不同的数据库类型。MyBatis Plus作为一款强大的ORM框架,提供了注解 `@DbType`,使得开发者能够更加灵活地处理数据库类型,从而在多数据库支持下轻松切换。本文将详细介绍 `@DbType` 注解的用法及其在持久层开发中的应用。
598 1