iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MybatisPlus如何处理Mysql的json类型
  • 278
分享到

MybatisPlus如何处理Mysql的json类型

2024-04-02 19:04:59 278人浏览 独家记忆
摘要

目录mybatisPlus处理Mysql的JSON类型MyBatis Plus - xml中如何使用autoResultMap构造的ResultMapMyBatis-Plus - J

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> {
    
    @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")
@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 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字段

在这里插入图片描述

二、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);
        // --------------------------------------------------------
    }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

您可能感兴趣的文档:

--结束END--

本文标题: MybatisPlus如何处理Mysql的json类型

本文链接: https://www.lsjlt.com/news/153479.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MybatisPlus如何处理Mysql的json类型
    目录MybatisPlus处理Mysql的json类型MyBatis Plus - xml中如何使用autoResultMap构造的ResultMapMyBatis-Plus - J...
    99+
    2024-04-02
  • MybatisPlus怎么处理Mysql的json类型
    本文小编为大家详细介绍“MybatisPlus怎么处理Mysql的json类型”,内容详细,步骤清晰,细节处理妥当,希望这篇“MybatisPlus怎么处理Mysql的json类型”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来...
    99+
    2023-07-02
  • 使用mybatisplus接收mysql字段为json类型的数据
    一.数据库设计 CREATE TABLE `inv_learning_examination_questions` ( `id` bigint(20) NOT NULL, `title` varchar(255) CHARA...
    99+
    2023-08-31
    sql 数据库
  • MariaDB中如何处理JSON数据类型
    在MariaDB中,JSON数据类型可以用来存储和查询JSON格式的数据。要处理JSON数据类型,可以使用各种函数和操作符来操作JS...
    99+
    2024-04-09
    MariaDB
  • MybatisPlus如何自定义TypeHandler映射JSON类型为List
    目录自定义TypeHandler映射JSON类型为List1. 实体类2. ListTypeHandler3. ReportUserListTypeHandler4. Java 泛型...
    99+
    2024-04-02
  • Mybatis和Mybatis-Plus对MySQL中json类型处理
    文章目录 1 MySQL中json类型处理1.1 引言1.2 准备建表1.3 Mybatis1.3.1 实体类1.3.2 BaseTypeHandler1.3.3 application.ym...
    99+
    2023-10-10
    mybatis mysql json
  • MySQL中的JSON类型
    MySQL中的JSON类型是一种数据类型,用于存储和处理JSON(JavaScript Object Notation)格式的数据。JSON是一种轻量级的数据交换格式,它以简洁的格式表示复杂的数据结构,包括数组和对象等。 MySQL支持JS...
    99+
    2023-10-11
    mysql
  • mybatis-plus读取JSON类型并处理JSON中数据
    mybatis-plus读取JSON类型 本文总共三个步骤: 1、在数据库表定义JSON字段; 2、在实体类加上@TableName(value = “extra_info”, autoResultM...
    99+
    2023-09-04
    json spring boot mybatis mysql
  • mybatis 自动化处理 mysql 的json类型字段 终极方案
    文章目录 mybatis 自动化处理 mysql 的json类型字段 终极方案why json简介mysql 建表 json 字段,添加1条json 数据对应的java对象 `JsonEnti...
    99+
    2023-09-10
    mybatis mysql json
  • python如何处理大型json文件
    这篇文章主要为大家展示了“python如何处理大型json文件”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“python如何处理大型json文件”这篇文章吧。如图所示,要处理的数据是一个json...
    99+
    2023-06-29
  • mysql的json处理
    写在前面 需要注意,5.7以上版本才支持,但如果是生产环境需要使用的话,尽量使用8.0版本,因为8.0版本对json处理做了比较大的性能优化。你你可以使用select version();来查看版本信息。 本文看下MySQL...
    99+
    2023-08-19
    mysql json json处理
  • Mysql中如何处理JSON字段
    这篇文章给大家分享的是有关Mysql中如何处理JSON字段的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。mysql能处理json。Mysql中处理JSON字段,可以用json_e...
    99+
    2024-04-02
  • MybatisPlus字段类型转换如何实现
    本文小编为大家详细介绍“MybatisPlus字段类型转换如何实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“MybatisPlus字段类型转换如何实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。resul...
    99+
    2023-07-05
  • MybatisPlus如何完成字段类型转换
    先来回忆下在mybatis中的resultMap作用和是什么 resultMap的作用是什么 在使用传统的mybatis时,我们一般都会在xml文件定义一个ResultMap 对每个字段都有自己的定义都有两个类型 javaType可以不显...
    99+
    2023-08-16
    mybatis java 开发语言
  • 如何理解数据类型和Json格式
    如何理解数据类型和Json格式,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。前几天,我才知道有一种简化的数据交换格式,叫做ya...
    99+
    2024-04-02
  • MySQL的JSON 数据类型有哪些
    小编给大家分享一下MySQL的JSON 数据类型有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!MySQL 5.7 增加了 ...
    99+
    2024-04-02
  • PostgreSQL中怎么处理JSON和XML数据类型
    在PostgreSQL中,可以使用JSON和XML数据类型来存储和操作相应格式的数据。 处理JSON数据类型: 创建JSON类型的...
    99+
    2024-03-12
    PostgreSQL
  • MySQL中geometry类型如何处理经纬度距离
    这篇文章给大家分享的是有关MySQL中geometry类型如何处理经纬度距离的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。建表CREATE TABLE `map` ( `id...
    99+
    2024-04-02
  • JSON传递bool类型数据的处理方式介绍
    ajax中使用json传递数据时,其它数据类型都不是问题,但是如果服务器端生成的JSON中有bool类型的数据时,到客户端解析时出现了小小的问题,总结如下: 服务器返回的JSON为:...
    99+
    2022-11-15
    JSON传递bool bool类型数据
  • 如何将 MySQL 表字段类型从 BLOB 转换为 JSON?
    简介 如果 MySQL 中有一个包含 BLOB 字段的表,您希望将其转换为 JSON 字段,则可以通过执行一系列 ALTER TABLE 语句来完成。该过程包括创建具有所需数据类型 (JSON) 的新列、将数据从旧列复制到新列、删除旧列以及...
    99+
    2023-10-22
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作