MybatisPlus 如何处理 MySQL 中的 JSON 类型?
来源:亿速云
时间:2023-04-30 07:23:59 125浏览 收藏
golang学习网今天将给大家带来《MybatisPlus 如何处理 MySQL 中的 JSON 类型?》,感兴趣的朋友请继续看下去吧!以下内容将会涉及到等等知识点,如果你是正在学习数据库或者已经是大佬级别了,都非常欢迎也希望大家都能给我建议评论哈~希望能帮助到大家!
MybatisPlus处理Mysql的json类型
1、在数据库表定义JSON字段;
2、在实体类加上@TableName(autoResultMap = true)、在JSON字段映射的属性加上@TableField(typeHandler = JacksonTypeHandler.class);
1.实体类中有个属性是其他对象,或者是List;在数据库中存储时使用的是mysql的json格式,此时可以用mybatis plus的一个注解@TableField(typeHandler = JacksonTypeHandler.class)
@TableField(typeHandler = JacksonTypeHandler.class)
这样在存入是就可以把对象自动转换为json格式
2.那么取出时怎么进行映射呢,有分为两种情况
a:当没有使用到xml时:
@Data @TableName(value = "person",autoResultMap = true)
b:当使用了xml文件时:
<result></result>
MyBatis Plus - xml中如何使用autoResultMap构造的ResultMap
MyBatis Plus有一个很大的缺陷,就是insert和select的时候使用的ResultMap是不同的,修复的办法就是在实体类上增加注解@TableName(autoResultMap = true)。但是这个autoResultMap并不能使用在自定义的方法上,只在MyBatis Plus内置方法上生效。
展示autoResultMap存在的问题
实体类Person
该实体类中有自定义的typehandler: IntegerListTypeHandler, StringListTypeHandler
@TableName(autoResultMap = true)
public class Person {
private Integer id;
private String name;
private Integer age;
@TableField(typeHandler = IntegerListTypeHandler.class)
private List<integer> orgIds;
@TableField(typeHandler = StringListTypeHandler.class)
private List<string> hobbies;
}</string></integer>@Mapper
public interface PersonMapper extends BaseMapper<person> {
/**
* 自定义的根据Id获取Person的方法,与MyBatis-Plus中的selectById相同的功能(但是不能使用autoResultMap生成的ResultMap).
*/
@Select("SELECT * FROM person WHERE id=#{id}")
Person selectOneById(int id);
}</person>自定义方法拿不到一些字段
因为Person中的orgIds和hobbies需要自定义的typeHandler,自定义的方法使用的是resultType=Person,而不是生成的ResultMap,所以都是null
Person person = new Person();
person.setAge(1);
person.setName("tim");
person.setOrgIds(Lists.newArrayList(1,2,3));
person.setHobbies(Lists.newArrayList("basketball", "pingpong"));
personMapper.insert(person);
# 可以得到正确的字段值
Person personInDb = personMapper.selectById(person.getId());
# orgIds和hobbies都为null
personInDb = personMapper.selectOneById(person.getId());
Preconditions.checkArgument(personInDb.getHobbies().equals(person.getHobbies()));
Preconditions.checkArgument(personInDb.getName().equals(person.getName()));
Preconditions.checkArgument(personInDb.getAge().equals(person.getAge()));
Preconditions.checkArgument(personInDb.getOrgIds().equals(person.getOrgIds()));改进
设置@ResultMap(“mybatis-plus_Person”)
/**
* 设置了ResultMap为`mybatis-plus_Person`后就可以拿到正确的值.
*/
@ResultMap("mybatis-plus_Person")
@Select("SELECT * FROM person WHERE id=#{id}")
Person selectOneById(int id);命名规则就是:mybatis-plus_{实体类名}
个人理解
MyBatis Plus本身并不是一个动态的ORM,而只是在mybatis初始化的时候,为mybatis提供常用的SQL语句,resultMap设置,并不会改变MyBatis本身的行为
常见问题
@TableField(typeHandler = IntegerListTypeHandler.class)没有生效:自定义的方法上没有配置resultType
MyBatis-Plus - JacksonTypeHandler VS FastjsonTypeHandler
JacksonTypeHandler
支持 MVC JSON 解析
支持 MySQL JSON 解析
传统的方法是通过 XML SQL 的 resultMap 来做 typeHandler 映射处理,但是这样会影响 MP 的功能,所以 JacksonTypeHandler 正好可以兼容 MP 的功能和满足 支持 MySQL JSON 解析。
FastjsonTypeHandler
支持 MVC JSON 解析
不支持 MySQL JSON 解析
可以通过 XML 支持,只是会失去 MP 特性。
<resultmap> <result></result></resultmap>
注意事项:
MVC JSON 解析时,可以不用加 @TableName(value = “t_test”, autoResultMap = true) 【高亮部分】,但是 MySQL JSON 解析查询的时候,如果不加,查出来为 null
MySQL JSON 解析查询时,只支持JSON格式:{“name”:“Tom”,“age”:12},不支持:{“name”:“Tom”,“age”:12} 和 “{“name”:“Tom”,“age”:12}”
MybatisPlus读写Mysql的json字段
前置条件
确保mysql的版本是5.7+
一、新建mysql表增加json字段

二、pojo类
package com.cxstar.domain;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
import java.io.Serializable;
import java.util.Date;
@lombok.Data
@TableName(autoResultMap = true)
public class Data implements Serializable {
@TableId(value = "id",type = IdType.AUTO)
private Integer id;
// 部分字段省略-------------
private String title;
private String author;
private String publisher;
// -----------------------
@TableField(typeHandler = FastjsonTypeHandler.class)
private JSONObject aggJson;
}三、测试类
package com.cxstar;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.cxstar.domain.Data;
import com.cxstar.domain.SearchMsg;
import com.cxstar.mapper.DataMapper;
import com.cxstar.service.OrderService;
import com.cxstar.service.spider.impl.*;
import com.cxstar.service.utils.ExecutorThread;
import com.cxstar.service.utils.SpiderThread;
import com.cxstar.service.utils.SynContainer;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.ArrayList;
import java.util.Date;
import java.util.UUID;
@SpringBootTest
class OrderApplicationTests {
@Autowired
DataMapper dataMapper;
@Test
void testJson() {
// insert -----------------------------------
Data data = new Data();
data.setTitle("计算机安全技术与方法");
data.setPublisher(">编辑部出版");
JSONObject jb = new JSONObject();
jb.put("searchKey", "英格");
jb.put("curPage", "1");
JSONArray js = new JSONArray();
js.add("西北政法大学");
js.add("西安理工大学");
jb.put("source", js);
data.setAggJson(jb);
dataMapper.insert(data);
// ------------------------------------------
// select --------------------------------------
Data data1 = dataMapper.selectById(5837);
JSONObject jb2 = data1.getAggJson();
System.out.println(jb2.getJSONArray("source"));
// ---------------------------------------------
// group by -----------------------------------------------
LambdaQueryWrapper<data> lqw = new LambdaQueryWrapper();
lqw.select(Data::getAggJson);
lqw.groupBy(Data::getAggJson);
List<data> dataList = dataMapper.selectList(lqw);
System.out.println(dataList);
// --------------------------------------------------------
}
}</data></data>以上就是《MybatisPlus 如何处理 MySQL 中的 JSON 类型?》的详细内容,更多关于mysql,JSON,mybatisplus的资料请关注golang学习网公众号!
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
406 收藏
-
486 收藏
-
294 收藏
-
117 收藏
-
411 收藏
-
420 收藏
-
264 收藏
-
266 收藏
-
392 收藏
-
333 收藏
-
234 收藏
-
448 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习