MyBatis TypeHandler 详解与实战:FastJson 实现字符串转 List

在 MyBatis 中,TypeHandler 是实现 Java 类型与数据库类型双向转换 的核心组件。无论是处理基础数据类型还是复杂的 JSON、枚举或自定义对象,它都能通过灵活的扩展机制满足开发需求。本文将通过一个 将数据库 JSON 字符串转换为 List<User> 的案例,详解 TypeHandler 的原理与实践。


一、TypeHandler 的作用与原理

1. 核心功能

  • 类型转换桥梁:将 Java 对象属性转换为 JDBC 参数(如 PreparedStatement 设置值);
  • 结果集映射:将数据库查询结果(如 ResultSet)转换为 Java 对象属性;
  • 空值处理:统一处理 Java 对象与数据库字段的 NULL 值逻辑。

2. 应用场景

  • 内置类型处理:MyBatis 已支持 StringIntegerDate 等常见类型的转换;
  • 复杂类型处理:如 JSON 字符串与对象互转、枚举值与数据库标记映射、CSV 字符串与集合转换等。

二、TypeHandler 的配置与扩展

1. 内置 TypeHandler

MyBatis 默认提供多种 TypeHandler,例如:

  • StringTypeHandler:处理 VARCHARString
  • EnumTypeHandler:处理枚举与数据库标记(如 disabled0);
  • DateTypeHandler:处理日期类型与 TIMESTAMP 的转换。

2. 自定义 TypeHandler 步骤

  1. 继承 BaseTypeHandler:实现 setNonNullParameter(Java→JDBC)和 getNullableResult(JDBC→Java)方法;
  2. 注册处理器
    • 全局注册:在 mybatis-config.xml 中通过 <typeHandlers> 标签配置;
    • 局部指定:在 Mapper XML 或注解中通过 typeHandler 属性标记;
  3. 应用转换逻辑:在实体类字段或 SQL 映射中声明使用自定义 TypeHandler。

三、实战:FastJson 实现 JSON 字符串与 List 转换

1. 场景描述

假设数据库表 user_groupusers 字段存储 JSON 字符串,需在 Java 中映射为 List<User> 对象:

CREATE TABLE user_group (id BIGINT PRIMARY KEY,users VARCHAR(2048)  -- 存储格式:[{"id":1,"name":"Alice","age":25},...]
);

2. 实现步骤

① 引入依赖
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.83</version>
</dependency>
② 定义 User 实体
public class User {private Long id;private String name;private Integer age;// getters/setters
}
③ 自定义 TypeHandler
public class ListUserTypeHandler extends BaseTypeHandler<List<User>> {@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, List<User> users, JdbcType jdbcType) throws SQLException {ps.setString(i, JSON.toJSONString(users));  // Java→JSON字符串}@Overridepublic List<User> getNullableResult(ResultSet rs, String columnName) throws SQLException {String json = rs.getString(columnName);return parseJson(json);}private List<User> parseJson(String json) {return json == null ? null : JSON.parseObject(json, new TypeReference<List<User>>(){});}// 其他重写方法略...
}
④ 全局注册 TypeHandler
<!-- mybatis-config.xml -->
<typeHandlers><typeHandler handler="com.example.ListUserTypeHandler" javaType="java.util.List" jdbcType="VARCHAR"/>
</typeHandlers>
⑤ 实体类与 Mapper 映射
public class UserGroup {private Long id;@TableField(typeHandler = ListUserTypeHandler.class)private List<User> users;// getters/setters
}
<!-- UserGroupMapper.xml -->
<select id="selectUserGroup" resultType="UserGroup">SELECT * FROM user_group WHERE id = #{id}
</select>

四、测试与验证

UserGroup group = sqlSession.selectOne("selectUserGroup", 1L);
System.out.println(group.getUsers()); 
// 输出:[User{id=1, name='Alice', age=25}, User{id=2, name='Bob', age=30}]

五、总结与扩展

  1. 优势

    • 解耦业务与持久化逻辑:将类型转换代码集中管理,提升可维护性;
    • 支持复杂场景:通过自定义逻辑处理加密数据、多语言字段等特殊需求。
  2. 扩展方向

    • 泛型支持:抽象通用 JSON TypeHandler,通过 TypeReference 适配不同泛型类;
    • 性能优化:针对高频转换类型缓存解析结果,减少重复计算。

通过合理使用 TypeHandler,开发者可以显著提升 MyBatis 在处理复杂数据类型时的灵活性与代码整洁度,是高效 ORM 实践的重要工具。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/72276.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《HelloGitHub》第 107 期

兴趣是最好的老师&#xff0c;HelloGitHub 让你对编程感兴趣&#xff01; 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等&#xff0c;涵盖多种编程语言 Python、…

【每日一题 | 2025】2.24 ~ 3.2

个人主页&#xff1a;Guiat 归属专栏&#xff1a;每日一题 文章目录 1. 【2.24】P10424 [蓝桥杯 2024 省 B] 好数2. 【2.25】P8665 [蓝桥杯 2018 省 A] 航班时间3. 【2.26】P10905 [蓝桥杯 2024 省 C] 回文字符串4. 【2.27】P10425 [蓝桥杯 2024 省 B] R 格式5. 【2.28】P10426…

【03】STM32F407 HAL 库框架设计学习

【03】STM32F407 HAL 库框架设计学习 摘要 本文旨在为初学者提供一个关于STM32F407微控制器HAL&#xff08;Hardware Abstraction Layer&#xff09;库框架设计的详细学习教程。通过本文&#xff0c;读者将从零开始&#xff0c;逐步掌握STM32F407的基本知识、HAL库的配置步骤…

跟着官方文档学习UE C++ TArray容器系列 迭代 和 排序

一.首先测试下&#xff0c;官方案例 迭代器的方法&#xff0c;有点不常见。有点像个指针&#xff0c;迭代完还自带break. oid AWXTArrayActor::WXLoopArray() {FString JoinedStr1;FString JoinedStr2;TArray<FString> StrArr { "Hello","Baby",&q…

C++中的“结界”机制:作用域与变量可见性探秘

一、编程世界的“结界”概念 源自佛学的结界概念&#xff0c;在C中体现为作用域机制。程序中的每个函数都会形成独立的作用域屏障&#xff0c;如同魔法结界般保护内部变量&#xff0c;使其与外界的同名变量互不干扰。这种机制保证了代码模块的独立性和安全性&#xff0c;但当存…

3-6 WPS JS宏 工作表移动复制实例-1(工作表的拆分操作)学习笔记

************************************************************************************************************** 点击进入 -我要自学网-国内领先的专业视频教程学习网站 *******************************************************************************************…

Qt 对象树详解:从原理到运用

1. 什么是对象树&#xff1f; 对象树是一种基于父子关系的对象管理机制。在 Qt 中&#xff0c;所有继承自 QObject 的类都可以参与到对象树中。 当一个对象被设置为另一个对象的父对象时&#xff0c;子对象会被添加到父对象的内部列表中&#xff0c;形成一种树状结构。 Qt 提…

使用hutool将json集合对象转化为对象

集合之间相互转化 //List转Json&#xff0c;maps是List类型的参数 String json JSONUtil.toJsonStr(maps); System.out.println("这是json字符串: "json);//Json转List JSONArray objects JSONUtil.parseArray(json); List<Map> maps1 JSONUtil.toList(objec…

Qt关于平滑滚动的使用QScroller及QScrollerProperties类说明

一、触控时代的滚动工具&#xff1a;QScroller类设计介绍 1.1 从机械滚轮到数字惯性 在触控设备普及前&#xff0c;滚动操作如同老式打字机的滚轴&#xff0c;只能通过鼠标滚轮或滚动条进行离散式控制。QScroller的出现如同给数字界面装上了"惯性飞轮"&#xff0c;…

JavaAPI(网络编程)

网络通信协议 通信协议 ‌所谓通信协议&#xff0c;是指通信双方在进行数据交换时必须遵守的规则和约定。‌这些规则确保了双方能够有效地进行通信&#xff0c;实现信息的交换和资源共享。通信协议定义了传输时的数据格式、控制信息以及传输顺序和速度等&#xff0c;确保双方…

Java---入门基础篇(下)---方法与数组

前言 本篇文章主要讲解有关方法与数组的知识点 ,是基础篇的一部分 , 而在下一篇文章我会讲解类和对象的知识点 入门基础篇上的链接给大家放在下面啦 ! Java---入门基础篇(上)-CSDN博客 感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb; 欢迎各位大佬指点…

Python 爬虫 – BeautifulSoup

Python 爬虫&#xff08;Web Scraping&#xff09;是指通过编写 Python 程序从互联网上自动提取信息的过程。 爬虫的基本流程通常包括发送 HTTP 请求获取网页内容、解析网页并提取数据&#xff0c;然后存储数据。 Python 的丰富生态使其成为开发爬虫的热门语言&#xff0c;特…

图像分类项目1:基于卷积神经网络的动物图像分类

一、选题背景及动机 在现代社会中&#xff0c;图像分类是计算机视觉领域的一个重要任务。动物图像分类具有广泛的应用&#xff0c;例如生态学研究、动物保护、农业监测等。通过对动物图像进行自动分类&#xff0c;可以帮助人们更好地了解动物种类、数量和分布情况&#xff0c;…

物联网 智慧园区井盖管理办法和功能介绍

在园区内实现 智慧井盖 的定位、内部气体检测和红外监测等顶级功能&#xff0c;可以显著提升园区的安全管理水平和运维效率。以下是智慧井盖系统的详细设计方案和功能实现&#xff1a; 一、系统架构 智慧井盖系统可以分为以下层次&#xff1a; 1. 感知层 定位模块&#xff1…

零基础deep seek+剪映,如何制作高品质的视频短片

以下是专为零基础学习者设计的 剪映专业版详细教程&#xff0b;Deep seek配合制 &#xff0c;包含从入门到精通的系统化教学&#xff0c;配合具体操作步骤与实用技巧&#xff1a; 基于DeepSeek与剪映协同制作高品质视频短片的专业流程指南&#xff08;2025年最新实践版&#x…

PHP:IDEA开发工具配置XDebug,断点调试

文章目录 一、php.ini配置二、IDEA配置 一、php.ini配置 [xdebug] zend_extension"F:\wamp64\bin\php\php7.4.0\ext\php_xdebug-2.8.0-7.4-vc15-x86_64.dll" xdebug.remote_enable on xdebug.remote_host 127.0.0.1 xdebug.remote_port 9001 xdebug.idekey"…

改进YOLOv8模型的空间注意力机制研究:RFAConv的贡献与实现

文章目录 1. 背景介绍2. 什么是RFAConv?3. YOLOv8中的RFAConv实现3.1 RFAConv模块设计3.2 在YOLOv8中集成RFAConv4. 性能对比与实验结果4.1 实验设置4.2 实验结果5. 模型优化与调优5.1 调整RFAConv模块的超参数5.2 数据增强策略5.3 更深层的注意力机制5.4 混合卷积与优化计算图…

【Java】使用jdk自带的zip压缩实现任意文件压缩打包下载功能(复制即用)

前言 在实际项目中&#xff0c;我们可能会接到将文件或者资料打包压缩导出的需求&#xff0c;例如将系统中某些生成的文件一起打包压缩下载提供给客户使用&#xff0c;今天提供一个jdk自带的工具类快速实现打包压缩的功能&#xff0c;方法我已经封装好&#xff0c;大家如果在项…

腾讯云扩容记录

腾讯云扩容&#xff1a; sudo yum install -y cloud-utils-growpart 安装扩容工具 sudo file -s /dev/vda1 有数据 sudo LC_ALLen_US.UTF-8 growpart /dev/vda 1 sudo resize2fs /dev/vda1 df -Th 完毕 以下是对执行的命令的详细解释以及背后的原理&#xff1a; 1. 安装 cloud…

服务流程设计和服务或端口重定向及其websocket等应用示例

服务流程设计和服务或端口重定向及其websocket等应用示例 目录 服务或端口重定向的服务设计和websocket等应用示例 一、通用请求控制流程 1.1、入口 1.2、所有GET请求首先预检控制单元 1.3、http请求会分别自动307重定向 1.4、所有请求首先执行跨源控制单元 1.5、然后…