文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

MybatisPlus怎么处理Mysql的json类型

2023-07-02 15:35

关注

本文小编为大家详细介绍“MybatisPlus怎么处理Mysql的json类型”,内容详细,步骤清晰,细节处理妥当,希望这篇“MybatisPlus怎么处理Mysql的json类型”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

MybatisPlus处理Mysql的json类型

在数据库表定义JSON字段;

在实体类加上@TableName(autoResultMap = true)、在JSON字段映射的属性加上@TableField(typeHandler = JacksonTypeHandler.class);

实体类中有个属性是其他对象,或者是List;在数据库中存储时使用的是mysql的json格式,此时可以用mybatis plus的一个注解@TableField(typeHandler = JacksonTypeHandler.class)

@TableField(typeHandler = JacksonTypeHandler.class)

这样在存入是就可以把对象自动转换为json格式

那么取出时怎么进行映射呢,有分为两种情况

a:当没有使用到xml时:

@Data@TableName(value = "person",autoResultMap = true)

b:当使用了xml文件时:

<result property="advance" column="advance" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>

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;}
@Mapperpublic interface PersonMapper extends BaseMapper<Person> {        @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")@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

传统的方法是通过 XML SQL 的 resultMap 来做 typeHandler 映射处理,但是这样会影响 MP 的功能,所以 JacksonTypeHandler 正好可以兼容 MP 的功能和满足 支持 MySQL JSON 解析。

FastjsonTypeHandler

可以通过 XML 支持,只是会失去 MP 特性。

<resultMap id="rxApiVO" type="RxApiVO" >    <result column="api_dataway" property="apiDataway" typeHandler="com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler" /></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字段

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 = "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 {    @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);        // --------------------------------------------------------    }}

读到这里,这篇“MybatisPlus怎么处理Mysql的json类型”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯