开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 17 天,点击查看活动详情
当数据库中的类型,封装到实体类中,我们使用的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。
它需要实现四个方法:
- 第一个是用于
save操作时,操作prepareStatement的。 - 第二、三、四个是用于查询时
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> {
}
@MappedTypes指定Java类型为String@MappedJdbcTypes注解指定JDBC类型为TIMESTAMP。
方法体的内容。
我们需要定义封装的规则,因为涉及到日期的格式化问题,可以考虑使用SimpleDateFormat进行格式化的操作。
Timestamp sqTimestamp = resultSet.getTimestamp(s);通过列名获取时间戳Date date = new Date(sqTimestamp.getTime());通过时间戳获取Date类型的对象SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日");规则日期格式,只有年 月 日。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类型做转换使用,通常的转换器已经符合日常的大部分使用,如果遇到特殊需求可以按步骤编写自定义的类型处理器进行封装和保存操作,操作的逻辑是操作prepareStatement和ResultSet,这部分知识是属于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)