本文主要记录学习mybatis自定义TypeHandler实例。
本实例是java中的List类型的数据存入数据库转为varchar类型
首先是POJO的内容如下
public class Hobby {
private Long id;
private List<String> hobbys;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public List<String> getHobbys() {
return hobbys;
}
public void setHobbys(List<String> hobbys) {
this.hobbys = hobbys;
}
}
对应的数据的表结构为
然后定义自己的TypeHandler,一般有两种方式,一种是继承BaseTypeHandler,一种是实现TypeHandler接口。其实两种方法大同小异。
第一种继承BaseTypeHandler实现代码如下
public class MyTypeHandler extends BaseTypeHandler<List<String>> {
@Override
public void setNonNullParameter(PreparedStatement preparedStatement, int i, List<String> list, JdbcType jdbcType) throws SQLException {
StringBuffer sb = new StringBuffer();
for(String s : list){
sb.append(s).append(",");
}
preparedStatement.setString(i,sb.toString().substring(0,sb.toString().length() - 1));
}
@Override
public List<String> getNullableResult(ResultSet resultSet, String s) throws SQLException {
String[] arr = resultSet.getString(s).split(",");
return Arrays.asList(arr);
}
@Override
public List<String> getNullableResult(ResultSet resultSet, int i) throws SQLException {
String[] arr = resultSet.getString(i).split(",");
return Arrays.asList(arr);
}
@Override
public List<String> getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
String[] arr = callableStatement.getString(i).split(",");
return Arrays.asList(arr);
}
}
第二种实现TypeHandler接口的实现代码
public class MyTypeHandler2 implements TypeHandler<List<String>> {
public void setParameter(PreparedStatement preparedStatement, int i, List<String> strings, JdbcType jdbcType) throws SQLException {
StringBuffer sb = new StringBuffer();
for(String s : strings){
sb.append(s).append(",");
}
preparedStatement.setString(i,sb.toString().substring(0,sb.toString().length() - 1));
}
public List<String> getResult(ResultSet resultSet, String s) throws SQLException {
String[] arr = resultSet.getString(s).split(",");
return Arrays.asList(arr);
}
public List<String> getResult(ResultSet resultSet, int i) throws SQLException {
String[] arr = resultSet.getString(i).split(",");
return Arrays.asList(arr);
}
public List<String> getResult(CallableStatement callableStatement, int i) throws SQLException {
String[] arr = callableStatement.getString(i).split(",");
return Arrays.asList(arr);
}
}
其实自定义的TypeHandler就是在插入数据之前,把数据格式处理成我们需要的格式,然后再插入数据库。在查询的时候,把从数据库查出的数据转换成我们自己需要的格式,而这个转换的过程就是自定义TypeHandler中代码的实现过程。
Mapper接口代码
public interface HobbyMapper {
Hobby getHobbyById(Long id);
void insertHobby(Hobby hobby);
}
配置文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.cyy.mybatis.mapper.HobbyMapper"> <resultMap id="hobbyResult" type="com.cyy.mybatis.Hobby"> <result column="hobbys" jdbcType="VARCHAR" property="hobbys" typeHandler="com.cyy.mybatis.typeHandler.MyTypeHandler2"></result> </resultMap> <select id="getHobbyById" parameterType="long" resultMap="hobbyResult"> select * from hobby where id=#{id} </select> <insert id="insertHobby" parameterType="com.cyy.mybatis.Hobby"> insert into hobby (hobbys) values (#{hobbys,typeHandler=com.cyy.mybatis.typeHandler.MyTypeHandler2}) </insert> </mapper>
配置文件中指定了hobbys字段用自定的MyTypeHandler类处理类型转换。
测试类
public class HobbyTest {
@Test
public void testInsert(){
SqlSession session = null;
try {
session = DbUtils.getSession();
HobbyMapper mapper = session.getMapper(HobbyMapper.class);
Hobby hobby = new Hobby();
List<String> hobbys = new ArrayList<String>(4);
hobbys.add("读书");
hobbys.add("散步");
hobbys.add("温酒");
hobbys.add("煮茶");
hobby.setHobbys(hobbys);
mapper.insertHobby(hobby);
session.commit();
} catch (Exception e) {
e.printStackTrace();
session.rollback();
} finally {
if(session != null){
session.close();
}
}
}
@Test
public void testSelect() {
SqlSession session = null;
try {
session = DbUtils.getSession();
HobbyMapper mapper = session.getMapper(HobbyMapper.class);
Hobby hobby = mapper.getHobbyById(4L);
System.out.println(hobby.getHobbys().size());
} catch (IOException e) {
e.printStackTrace();
} finally {
if(session != null){
session.close();
}
}
}
}
执行testInsert方法后,可以看到数据库中已经插入数据
执行testSelect可以查询出插入的数据,并且查询出的结果已经转为List
至此我们自定义TypeHandler已经完成!