MybatisPlus如何处理Mysql的json类型

目录

  • MybatisPlus处理Mysql的json类型
    • MyBatis Plus - xml中如何使用autoResultMap构造的ResultMap
    • MyBatis-Plus - JacksonTypeHandler VS FastjsonTypeHandler
  • MybatisPlus读写Mysql的json字段
    • 前置条件
    • 一、新建mysql表增加json字段
    • 二、pojo类
    • 三、测试类

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 = "https://www.it610.com/article/person",autoResultMap = true)

b:当使用了xml文件时:


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 orgIds; @TableField(typeHandler = StringListTypeHandler.class)private List hobbies; }

@Mapperpublic interface PersonMapper extends BaseMapper {/*** 自定义的根据Id获取Person的方法,与MyBatis-Plus中的selectById相同的功能(但是不能使用autoResultMap生成的ResultMap).*/@Select("SELECT * FROM person WHERE id=#{id}")Person selectOneById(int id); }

  • 自定义方法拿不到一些字段
因为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都为nullpersonInDb = 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 特性。

注意事项:
MVC JSON 解析时,可以不用加 @TableName(value = https://www.it610.com/article/“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字段
MybatisPlus如何处理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 = "https://www.it610.com/article/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; @SpringBootTestclass OrderApplicationTests {@AutowiredDataMapper dataMapper; @Testvoid testJson() {// insert -----------------------------------Data data = https://www.it610.com/article/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 lqw = new LambdaQueryWrapper<>(); lqw.select(Data::getAggJson); lqw.groupBy(Data::getAggJson); List dataList = dataMapper.selectList(lqw); System.out.println(dataList); // --------------------------------------------------------}}

【MybatisPlus如何处理Mysql的json类型】以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

    推荐阅读