一、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_SETJSON_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 ListString tags; }# application.yml 配置 mybatis-plus: type-handlers-package: com.example.demo.handler type-aliases-package: com.example.demo.entity场景二自定义 TypeHandler// 自定义类型处理器 public class EncryptTypeHandler extends BaseTypeHandlerString { 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只设置autoResultMaptrue不够字段上还需加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 ListString tags; }// JSON 对象 Data public class ArticleContent { private String text; private String coverImage; private Integer wordCount; }// Mapper 接口 Mapper public interface ArticleMapper extends BaseMapperArticle { // 自定义查询也需要 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 字段或自定义类型转换时必须开启这个选项