Java中的List和MySQL中的varchar相互转换的解决方案

 更新时间:2024年06月06日 09:37:36   作者: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相互转换内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot整合MongoDB全过程

    SpringBoot整合MongoDB全过程

    这篇文章主要介绍了SpringBoot整合MongoDB全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • Java常用类库Apache Commons工具类说明及使用实例详解

    Java常用类库Apache Commons工具类说明及使用实例详解

    这篇文章主要介绍了Java常用类库Apache Commons工具类说明及使用实例详解,需要的朋友可以参考下
    2020-02-02
  • java将一个目录下的所有文件复制n次

    java将一个目录下的所有文件复制n次

    这篇文章主要为大家详细介绍了java将一个目录下的所有文件复制n次,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • Go Java算法之比较版本号方法详解

    Go Java算法之比较版本号方法详解

    这篇文章主要为大家介绍了Go Java算法之比较版本号方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Java 十大排序算法之计数排序刨析

    Java 十大排序算法之计数排序刨析

    计数排序是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法
    2021-11-11
  • java建立子类方法总结

    java建立子类方法总结

    在本篇文章里小编给大家分享了关于java建子类的步骤和方法,需要的朋友们跟着学习下。
    2019-05-05
  • 现代高效的java构建工具gradle的快速入门

    现代高效的java构建工具gradle的快速入门

    和Maven一样,Gradle只是提供了构建项目的一个框架,真正起作用的是Plugin,本文主要介绍了gradle入门,文中通过示例代码介绍的非常详细,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • springboot+kafka中@KafkaListener动态指定多个topic问题

    springboot+kafka中@KafkaListener动态指定多个topic问题

    这篇文章主要介绍了springboot+kafka中@KafkaListener动态指定多个topic问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • Java的Hibernate框架数据库操作中锁的使用和查询类型

    Java的Hibernate框架数据库操作中锁的使用和查询类型

    这篇文章主要介绍了Java的Hibernate框架数据库操作中锁的使用和查询类型,Hibernate是Java的SSH三大web开发框架之一,需要的朋友可以参考下
    2016-01-01
  • Java 并发编程中的锁机制示例详解

    Java 并发编程中的锁机制示例详解

    本文探讨了Java并发编程中的锁机制,包括锁的基本概念、Java中的锁类型如synchronized、ReentrantLock、ReadWriteLock、锁的优化策略以及如何避免死锁,文章强调了合理选择和优化锁使用对于提升程序并发性能的重要性,并提供了实际应用中的最佳实践,感兴趣的朋友一起看看吧
    2025-01-01

最新评论