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 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;
}
@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中的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本身的行为

  • 常见问题

    AILOGO AILOGO

    LOGO123旗下的AI智能LOGO生成器,只需输入品牌名称就能免费在线生成公司logo设计及配套企业VI,轻松打造您的个性品牌!

    AILOGO 139 查看详情 AILOGO

@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 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 j*a.io.Serializable;
import j*a.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 j*a.util.ArrayList;
import j*a.util.Date;
import j*a.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);
        // --------------------------------------------------------
    }
}

以上就是MybatisPlus怎么处理Mysql的json类型的详细内容,更多请关注其它相关文章!


# 都是  # seo电话多少  # 服务器租赁网站建设  # 格力空调营销推广  # b2b网站建设方案  # seo页面状态检测  # 新塘网站营销推广  # 辽源seo培训如何获客  # 相城网站建设系统方案  # 网站建设 腾讯  # 天津定制型网站推广公司  # 如何设置  # MySQL  # 政法大学  # 就可以  # 不支持  # 怎么处理  # 实体类  # 的是  # 自定义  # 镜像  # mybatisplus  # JSON 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894 】


相关推荐: 小红书网页版怎么进 小红书网页版通用入口  Win10截图远程协助 Win10远程桌面截屏法【场景应用】  无人机考证官网 中国民航无人机考证官网登录入口  太平年在哪个平台播出  易车网官网直达入口 易车网在线登录入口  如何修改Windows截图的默认保存位置_告别C盘让桌面更整洁【教程】  重返未来:1999卡戎全方位攻略  《异星探险家》古怪的物品作用介绍  《下一站江湖2》独孤剑诀习得方法  百度网盘网页入口链接分享 百度网盘官网入口网页登录  高德地图导航路线偏差报警频繁怎么办 高德地图路线偏差修复与优化方法  火狐浏览器如何刷新修复浏览器 火狐浏览器“重置Firefox”功能详解  PHP中获取HTTP响应状态消息:方法与限制  J*aScript:从子元素中批量移除特定CSS类  暴风影音官网正式版_暴风影音手机版官网下载安卓  在Peewee中处理PostgreSQL记录重复:一站式数据摄取教程  《kimi智能助手》制作ppt教程  《tt语音》超级玩家开通方法  Win10锁屏时间怎么设置 Win10调整自动锁屏时间方法  韩剧圈正版官网入口_韩剧圈官方指定登录  《红果免费短剧》下载观看方法  t3出行如何使用微信支付  《土豆雅思》修改密码方法  手机耗电快是什么原因 延长手机电池续航时间的设置方法【详解】  C++如何使用CMake构建项目_C++ CMakeLists.txt编写入门教程  Windows Audio服务启动失败怎么办_电脑没声音的终极服务修复法【修复】  QQ网页版入口导航 QQ网页版在线访问通道  VBA Outlook邮件自动化:高效集成Excel数据与列标题的策略  《漫蛙manwa2》防走失网页版链接2025  知乎APP怎么查看自己被邀请的问题_知乎APP邀请回答记录查看与参与方法  Golang中的rune与byte类型区别是什么_Golang字符与字节处理详解  钉钉任务无法提醒如何处理 钉钉任务提醒优化方法  《画加》约稿流程  咸鱼怎么设置仅粉丝可见的动态_咸鱼动态粉丝可见设置方法  《360浏览器》自动保存账号密码设置方法  J*a实现任务清单管理_集合框架综合入门练手  j*a中ArrayBlockingQueue的使用  C++ cast类型转换总结_C++ reinterpret_cast与const_cast的使用  《百果园》充值余额方法  如何在CSS中使用伪类:valid实现表单验证提示_结合:valid改变边框颜色  微星主板BIOS怎么调整内存时序_内存参数手动优化BIOS设置教程  Linux如何优化系统启动流程_Linux启动项优化方案  告别繁琐SEO!如何使用SyliusSitemap插件自动化生成网站地图,提升搜索引擎排名  视频号视频怎么提取文案?提取的文案如何优化与使用?  《虎扑》取消评分记录方法  Dagster资产间数据传递与用户配置管理教程  OTT月报 | 2025年9月智能电视大数据报告  J*aScript大数运算_BigInt使用指南  《火影忍者:木叶高手》快速升级攻略  申通快件单号查询平台 申通包裹物流动态跟踪 

 2023-05-27

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.