Java中的List和MySQL中的varchar相互转换的解决方案
需求
实体类中有一个 List<String> 类型的属性,对应于 MySQL 表里的 varchar 字段,使用 MyBatis 添加或查询时能互相转换。
解决方案
自定义一个类型处理器:
package com.examples.handler;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ListStringTypeHandler extends BaseTypeHandler<List<String>> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, List<String> parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, String.join(",", parameter));
}
@Override
public List<String> getNullableResult(ResultSet rs, String columnName) throws SQLException {
if (rs.getString(columnName) == null) {
return new ArrayList<>();
}
return Arrays.asList(rs.getString(columnName).split(","));
}
@Override
public List<String> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
if (rs.getString(columnIndex) == null) {
return new ArrayList<>();
}
return Arrays.asList(rs.getString(columnIndex).split(","));
}
@Override
public List<String> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
if (cs.getString(columnIndex) == null) {
return new ArrayList<>();
}
return Arrays.asList(cs.getString(columnIndex).split(","));
}
}
示例
Java 实体类
@Data
public class Student {
private Long id;
private String name;
private List<String> hobbies;
}
数据表的字段

Mapper接口
public interface StudentMapper {
void saveStudent(Student student);
Student queryStudentById(long id);
}
xml文件 需要使用 typeHandler="com.examples.handler.ListStringTypeHandler"
<?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.examples.mapper.StudentMapper">
<resultMap id="studentMap" type="student">
<result column="hobbies" property="hobbies" typeHandler="com.examples.handler.ListStringTypeHandler"/>
</resultMap>
<insert id="saveStudent" keyProperty="id" useGeneratedKeys="true" keyColumn="id">
insert into student (name, hobbies)
values (#{name}, #{hobbies,typeHandler=com.examples.handler.ListStringTypeHandler})
</insert>
<select id="queryStudentById" resultType="student" resultMap="studentMap">
select *
from student
where id = #{id}
</select>
</mapper>
测试
public class StudentTest {
@Resource
private StudentMapper studentMapper;
// 添加
@Test
void testSaveStudent() {
Student student = new Student();
List<String> hobbiesList = new ArrayList<>();
hobbiesList.add("篮球");
hobbiesList.add("阅读");
hobbiesList.add("写代码");
student.setName("张三");
student.setHobbies(hobbiesList);
studentMapper.saveStudent(student);
}
//查询
@Test
void testQueryStudentById() {
Student student = studentMapper.queryStudentById(1L);
System.out.println(student);
}
}
添加的结果

查询的结果

到此这篇关于Java中的List和MySQL中的varchar相互转换的解决方案的文章就介绍到这了,更多相关Java List和MySQL varchar相互转换内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Java常用类库Apache Commons工具类说明及使用实例详解
这篇文章主要介绍了Java常用类库Apache Commons工具类说明及使用实例详解,需要的朋友可以参考下2020-02-02
springboot+kafka中@KafkaListener动态指定多个topic问题
这篇文章主要介绍了springboot+kafka中@KafkaListener动态指定多个topic问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2022-12-12
Java的Hibernate框架数据库操作中锁的使用和查询类型
这篇文章主要介绍了Java的Hibernate框架数据库操作中锁的使用和查询类型,Hibernate是Java的SSH三大web开发框架之一,需要的朋友可以参考下2016-01-01


最新评论