Mybatis实现自定义TypeHandler
项目需要:从第三方系统获取的数据是一个list,但是我需要把这个list存入数据库,存入格式是varchar。这里就需要自定义一个简单的mybatis的handler处理器;当然java代码也可以实现,就是比较麻烦。
有俩种实现的方法:
- 一、实现TypeHandler接口的实现代码;
- 二、继承BaseTypeHandler
这里只展示第一种。本实例是java中的List类型的数据存入数据库转为varchar类型
1、首先写一个handler
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.TypeHandler;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.List;
/**
* @Author Summer_DM
* @Summary TODO Mybatis实现自定义TypeHandler
* TODO 有俩种实现的方法:一、实现TypeHandler接口的实现代码;二、继承BaseTypeHandler
* TODO 这里只展示第一种。本实例是java中的List类型的数据存入数据库转为varchar类型
* @Version 1.0
* @Date 2021/11/3 上午 09:37
**/
public class MyBatisTypeHandler implements TypeHandler<List<String>> {
/**
* 这里表示,我们数据库存储的时候选择用逗号分割开
* @param preparedStatement
* @param i
* @param strings
* @param jdbcType
* @throws SQLException
*/
@Override
public void setParameter(PreparedStatement preparedStatement, int i, List<String> strings, JdbcType jdbcType) throws SQLException {
StringBuilder sb = new StringBuilder();
for(String s : strings){
sb.append(s).append(",");
}
preparedStatement.setString(i,sb.toString().substring(0,sb.toString().length() - 1));
}
/**
* 我们查询数据库时返回结果也需要拼接成一个list
* @param resultSet
* @param s
* @return
* @throws SQLException
*/
@Override
public List<String> getResult(ResultSet resultSet, String s) throws SQLException {
String[] arr = resultSet.getString(s).split(",");
return Arrays.asList(arr);
}
@Override
public List<String> getResult(ResultSet resultSet, int i) throws SQLException {
String[] arr = resultSet.getString(i).split(",");
return Arrays.asList(arr);
}
@Override
public List<String> getResult(CallableStatement callableStatement, int i) throws SQLException {
String[] arr = callableStatement.getString(i).split(",");
return Arrays.asList(arr);
}
}
//这里是第二种
//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);
// }
//}
2、准备好model类和dao层
import lombok.Data;
import java.util.List;
/**
* @Author Summer_DM
* @Summary TODO 用来测试mybatis自定义的handler
* @Version 1.0
* @Date 2021/11/3 上午 09:54
**/
@Data
public class Hobby {
private Integer id;
private Integer userId;
private List<String> hobby;
}
import com.example.library.model.Hobby;
import org.springframework.stereotype.Repository;
/**
* @Author Summer_DM
* @Summary TODO
* @Version 1.0
* @Date 2021/11/3 上午 09:57
**/
@Repository
public interface HobbyDao {
Hobby getHobbyById(int id);
void insertHobby(Hobby hobby);
}
3、写一下xml中的配置
<?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.example.library.dao.HobbyDao">
<resultMap id="hobbyResult" type="com.example.library.model.Hobby">
<result column="hobby" jdbcType="VARCHAR" property="hobby"
typeHandler="com.example.library.handler.MyBatisTypeHandler"></result>
</resultMap>
<select id="getHobbyById" parameterType="java.lang.Integer" resultType="com.example.library.model.Hobby"
resultMap="hobbyResult">
select *
from hobby
where id = #{id}
</select>
<insert id="insertHobby" parameterType="com.example.library.model.Hobby">
insert into hobby (id, hobby, userId)
values (#{id}, #{hobby,typeHandler=com.example.library.handler.MyBatisTypeHandler,jdbcType=VARCHAR}, #{userId})
</insert>
</mapper>
这里注意一下,需要指定resultMap。
4、写一个测试类
@Test
public void testInsert() {
try {
Hobby hobby = new Hobby();
List<String> hobbys = new ArrayList<String>(4);
hobbys.add("打篮球");
hobbys.add("爬山");
hobbys.add("读书");
hobbys.add("旅游");
hobby.setHobby(hobbys);
hobby.setId(3);
hobby.setUserId(3);
hobbyDao.insertHobby(hobby);
} catch (Exception e) {
e.printStackTrace();
} finally {
}
}
@Test
public void testSelect() {
try {
Hobby hobby = hobbyDao.getHobbyById(1);
System.out.println("爱好:"+hobby);
} catch (Exception e) {
e.printStackTrace();
} finally {
}
}
5、数据库结果
比较简单,这里只展示了list和varchar的互转,其实还有很多很强大的互转,大家可以参考一下。
以下是更多的参考:
https://blog.csdn.net/qq_42402854/article/details/84374122
https://blog.csdn.net/lmb55/article/details/90380309