当数据库中的类型,封装到实体类中,我们使用的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)