一、介绍
MyBatis 在设置预处理语句(PreparedStatement)中的参数或从结果集中取出一个值时, 都会用类型处理器
将获取到的值以合适的方式转换成 Java 类型。
可以在官方文档中看到,下面时默认的类型处理器。
但是,我们还是有个麻烦事
比如:
javaBean中字段类型为Date,数据库中存储的是varchar类型;
javabean中字段类型是Enum,数据库中存储的是varchar或者Integer。
javaBean中字段类型是List,数据中存储的是varchar。
怎么保证类型之间的转换映射?
TypeHandler
MyBatis 中的 TypeHandler 类型处理器用于 JavaType 与 JdbcType 之间的转换,用于 PreparedStatement 设置参数值和从 ResultSet 或 CallableStatement 中取出一个值。
二、上手试试
前提:
- 我的实体类
- 我的数据库中表字段是这样的
可见: List<String> resultList
类型的Java对象字段在数据库中并没有对应得类型,而且温馨提示,也是没有默认类型处理器得!这个时候我以前就简单粗暴,改变实体类得结构,造出个String resultListStr
类型出来,然后入库得时候就用这个属性,不用List。
然而其实这个场景,可以自定义一个List<String>
---- varchar
,的自定义类型处理器。
自定义类型处理器
如下,可以实现List<String>
----varchar
的转换。
@MappedJdbcTypes(JdbcType.VARCHAR)
@MappedTypes(List.class)
public class ReportTypeHandler implements TypeHandler<List<String>> {
/**
* 设置参数
* Java类型-----> 数据库类型
*/
@Override
public void setParameter(PreparedStatement preparedStatement, int i, List<String> list, JdbcType jdbcType) throws SQLException {
StringBuilder sb = new StringBuilder(