今天在项目中遇到一个需要从数据中读取一段字符然后转化成list类型。由于忘记了TypeHandler
的存在,就定义了一个对象,内部添加了一个String
和List
类型的成员变量,处理起来比较麻烦。突然想到TypeHandler
不就是处理这种情景的吗?!!
概述
TypeHandler
是Mybatis中用来将Java数据类型中和数据库类型进行相互转化的,mybatis中已经帮我们封装了大量的类型处理器,够工作中使用了。以下为mybatis中默认的的类型处理器。含有处理日期类型的DateTypeHandler
,处理字符创类型的StringTypeHandler
等。如下:
代码清单
自定义typeHandler有两种实现方式:
- 实现TypeHandler接口
- 继承BaseTypeHandler类
实现TypeHandler接口
package com.sxt.typehandler;
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.type.*;
import java.sql.*;
import java.util.Arrays;
import java.util.List;
@MappedTypes({List.class})
@MappedJdbcTypes(JdbcType.VARCHAR)
public class MyTypeHandler implements TypeHandler<List<String>> {
@Override
public void setParameter(PreparedStatement ps, int i, List<String> strings, JdbcType jdbcType) throws SQLException {
String s = StringUtils.join(strings, ",");
ps.setString(i,s);
}
@Override
public List<String> getResult(ResultSet resultSet, String s) throws SQLException {
return Arrays.asList(resultSet.getString(s).split(","));
}
@Override
public List<String> getResult(ResultSet resultSet, int i) throws SQLException {
String s = resultSet.getString(i);
return Arrays.asList(s.split(","));
}
@Override
public List<String> getResult(CallableStatement callableStatement, int i) throws SQLException {
String s = callableStatement.getString(i);
return Arrays.asList(s.split(","));
}
}
注册TypeHandler
- 方式一:逐个注册
<typeHandlers>
<typeHandler handler="com.fcl.MyTypeHandler"/>
</typeHandlers>
- 方式二:扫描包
<typeHandlers>
<package name="com.fcl"/>
</typeHandlers>
返回结果指定TypeHandler
<resultMap id="query1" type="person">
<id property="id" column="id"/>
<result property="hobbys" column="hobbys" typeHandler="com.fcl.MyTypeHandler"/>
</resultMap>