当前位置: 首页 > news >正文

MyBatis-Plus12:JSON处理器

一、JSON 类型 在 Mysql中的使用

MySQL 5.7.8 版本开始就原生支持 JSON 类型了。


1-1、基本用法

建表时直接用JSON作为字段类型:

CREATE TABLE orders ( id INT PRIMARY KEY AUTO_INCREMENT, user_id INT, extra JSON -- JSON 类型字段 );

插入数据:

INSERT INTO orders (user_id, extra) VALUES (1, '{"color": "red", "size": "XL"}');

1-2、常用的 JSON 函数

查询 JSON 中的某个字段:

-- -> 返回 JSON 格式,->> 返回纯文本 SELECT extra->'$.color' FROM orders; -- 返回 "red"(带引号) SELECT extra->>'$.color' FROM orders; -- 返回 red(不带引号)

修改 JSON 中的某个字段:

UPDATE orders SET extra = JSON_SET(extra, '$.color', 'blue') WHERE id = 1;

按 JSON 字段的值来查询:

SELECT * FROM orders WHERE extra->>'$.color' = 'red';

1-3、和直接存 VARCHAR 字符串的区别

虽然你插入时写的是 JSON 字符串,但 MySQL 内部会把它解析并转换成二进制格式存储。

对比项JSON 类型VARCHAR 存 JSON 字符串
存储格式二进制(优化过的)普通字符串
格式校验✅ 插入时自动校验格式合法性❌ 不校验,存什么都行
查询字段✅ 支持->->>直接查内部字段❌ 只能整体查,或用字符串函数
索引✅ 支持对 JSON 内部字段建虚拟列索引❌ 不支持
性能读取内部字段更快每次都要解析整个字符串

所以本质上存的是二进制,只是展示给你看的时候会格式化成 JSON 字符串的样子。

1-4、MySQL 内置的 JSON 操作函数:JSON_SET

JSON_SET是 MySQL 内置的 JSON 操作函数,作用是修改 JSON 中某个字段的值,如果字段不存在就新增,存在就覆盖


1、语法

JSON_SET(json字段, 路径, 新值, 路径, 新值, ...)

支持一次修改多个字段


2、举个例子

假设extra字段当前值是:

{"color": "red", "size": "XL"}

修改已有字段:

UPDATE orders SET extra = JSON_SET(extra, '$.color', 'blue'); -- 结果:{"color": "blue", "size": "XL"}

新增不存在的字段:

UPDATE orders SET extra = JSON_SET(extra, '$.price', 99); -- 结果:{"color": "red", "size": "XL", "price": 99}

同时修改多个:

UPDATE orders SET extra = JSON_SET(extra, '$.color', 'blue', '$.size', 'M'); -- 结果:{"color": "blue", "size": "M"}

3、相似函数对比

函数作用
JSON_SET有则覆盖,无则新增
JSON_INSERT只新增,已存在的字段不覆盖
JSON_REPLACE只覆盖,不存在的字段不新增
JSON_REMOVE删除某个字段

大多数情况用JSON_SET就够了,因为它最灵活。


二、在 MyBatis-Plus 中使用

Java 实体类中对应字段用String或自定义对象接收,需要加json类型处理器

【注意】:

没有application.yml全局配置!!!

2-1、完整示例

1、定义json类型字段对应的java类

@Data @NoArgsConstructor @AllArgsConstructor(staticName = "of") public class JsonInfo { private String color; private String size; }

2、在对应的table entity类上添加两个注解:

3、postman测试

(1)查询

(2)插入

三、@TableName(autoResultMap = true) 详解

这是MyBatis-Plus框架中的注解属性,主要用于处理特殊类型字段的映射问题。

【备注】:

ResultMap是 MyBatis 中用于定义数据库查询结果与 Java 对象之间映射关系的核心配置。

数据库查询结果 (ResultSet) ↓ ResultMap (映射规则) ↓ Java 对象 (POJO/Entity)

简单说:ResultMap 告诉 MyBatis"如何把数据库的列映射到 Java 对象的属性"


ResultMap vs resultType

对比项resultTyperesultMap
配置方式自动映射手动配置映射规则
适用场景字段名=属性名字段名≠属性名/关联查询/类型转换
灵活性
代码量
TypeHandler不支持✅ 支持·

3-1、核心含义

属性默认值作用
autoResultMapfalse是否自动构建 resultMap 并使用 resultMap 映射

当设置为true时,MyBatis-Plus 会自动生成 ResultMap,支持自定义类型处理器(TypeHandler)生效。


3-2、典型使用场景

场景一:MySQL JSON 类型字段(最常见)

当数据库字段是JSON 类型,实体类属性是Java 对象/集合时:

// 实体类 @TableName(value = "users", autoResultMap = true) public class User { @TableId private Long id; // JSON 字段,需要类型转换 @TableField(typeHandler = JacksonTypeHandler.class) private UserInfo info; @TableField(typeHandler = JacksonTypeHandler.class) private List<String> tags; }
# application.yml 配置 mybatis-plus: type-handlers-package: com.example.demo.handler type-aliases-package: com.example.demo.entity

场景二:自定义 TypeHandler

// 自定义类型处理器 public class EncryptTypeHandler extends BaseTypeHandler<String> { @Override public void setParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) { ps.setString(i, encrypt(parameter)); } @Override public String getNullableResult(ResultSet rs, String columnName) { return decrypt(rs.getString(columnName)); } // ... 其他方法 }
// 实体类 @TableName(value = "users", autoResultMap = true) public class User { @TableField(typeHandler = EncryptTypeHandler.class) private String phone; // 数据库中加密存储 }

3-3、注意事项

问题说明
必须配合 TypeHandler只设置autoResultMap=true不够,字段上还需加@TableField(typeHandler=...)
XML 映射文件如果使用 XML,需要在 resultMap 中指定typeHandler
性能影响开启后会生成额外 ResultMap,轻微影响性能
MP 版本3.3.1+ 版本支持较好

3-4、完整示例

// 实体类 @TableName(value = "articles", autoResultMap = true) @Data public class Article { @TableId private Long id; private String title; // JSON 字段存储为对象 @TableField(typeHandler = JacksonTypeHandler.class) private ArticleContent content; // JSON 字段存储为列表 @TableField(typeHandler = JacksonTypeHandler.class) private List<String> tags; }
// JSON 对象 @Data public class ArticleContent { private String text; private String coverImage; private Integer wordCount; }
// Mapper 接口 @Mapper public interface ArticleMapper extends BaseMapper<Article> { // 自定义查询也需要 ResultMap 支持 @Select("SELECT * FROM articles WHERE id = #{id}") Article selectDetail(Long id); }

3-5、什么时候需要设置?

情况是否需要
普通字段映射❌ 不需要
数据库 JSON → Java 对象需要
数据库 JSON → Java 集合需要
使用自定义 TypeHandler需要
字段加密/脱敏处理需要

总结

autoResultMap = true ↓ 让 MyBatis-Plus 自动生成 ResultMap ↓ 使 @TableField(typeHandler = ...) 生效 ↓ 实现 数据库特殊类型 ↔ Java 对象 的转换

简单说:处理 JSON 字段或自定义类型转换时,必须开启这个选项!

http://www.jsqmd.com/news/397365/

相关文章:

  • 题解:AcWing 796 子矩阵的和
  • MyBatis-Plus13:自定义 TypeHandler
  • 2026年论文降AI率工具选型指南:多模型对比改写的核心逻辑与高效解决方案 - 小白条111
  • 深度学习算法之深度学习框架(PyTorch)的使用场景和使用方法及算法,优化方法,缺点_blog
  • [豪の算法奇妙冒险] 代码随想录算法训练营第四十三天 | 300-最长递增子序列、674-最长连续递增序列、718-最长重复子数组
  • 移动开发如何巧用 RxJava 优化代码
  • 深度强化学习TD方法:核心算法、实战场景与优化全解析
  • 深度学习框架MXNet深度解析:从核心算法到工业部署实战
  • 彻底禁止win11系统更新的方法,关闭win11自动更新的教程
  • 一键彻底禁止Win11自动更新6大方法,Win11系统的自动更新怎么彻底关闭?
  • 2026年论文赶due神器深度测评:一站式搞定全流程的多模型AI工作台选型指南 - 小白条111
  • 图像分类实战
  • 支持多语种的9个AI降重平台,提供改写、扩写、缩写全功能,满足不同场景文本优化需求
  • 并查集 - [JSOI2008] 星球大战
  • 2026年论文降AI味工具选型指南:多模型协同如何解决单一AI的“模板化陷阱” - 小白条111
  • 模拟与存根实战:unittest.mock深度使用指南
  • HarmonyOS 6.0分布式应用开发全解析:从架构革新到跨设备协同实战
  • 如何在豆包平台打广告,找哪个服务商? - 品牌2025
  • 手把手还你一个清爽的windows!---激活和清爽配置教程
  • 白血病细胞与正常细胞识别数据集:医学影像与智能诊断的细胞分析数据
  • 抢占AI流量新风口:doubaoAD如何助力企业实现豆包平台高效获客 - 品牌2025
  • 2026年论文急救AI工具选型指南:多模型协同如何解决due前3天的核心痛点 - 小白条111
  • 推荐9款高效AI降重工具,改写效果显著提升文本原创性,适用于论文及各类文稿的重复率优化需求
  • 9个超好用的AI降重网站,一键改写文章,效果惊艳。轻松解决重复率问题,写作必备工具清单
  • 这些AI降重网站绝了!9款工具改写效果拔群,三秒降低重复率,学术写作党赶紧收藏备用
  • 题解:AcWing 795 前缀和
  • 端侧AI爆发!AMD新芯片本地跑大模型,开发教程来了
  • 堆的基本存储
  • flask基于Spark的温布尔登特色赛赛事数据分析预测及算法实现
  • 空对象模式