Java中的List和MySQL中的varchar相互转换的解决方案
作者:Coder马里奥
实体类中有一个 List<String> 类型的属性,对应于 MySQL 表里的 varchar 字段,使用 MyBatis 添加或查询时能互相转换,本文给大家介绍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相互转换内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
