MybatisPlus如何处理Mysql的json类型
作者:AH_HH 发布时间:2024-01-27 14:23:19
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本身的行为
常见问题
@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);
// --------------------------------------------------------
}
}
来源:https://blog.csdn.net/qq_35098526/article/details/117912886


猜你喜欢
- 目前整个开发社区对AOP(Aspect Oriented Programing)推崇备至,也涌现出大量支持AOP的优秀Framework,-
- vue要绑定下拉列表会稍微有点不同。因为下拉列表不是一个标签能搞掂的。原生的html写法如下<select> <optio
- 如题,首先当然是要打开京东的手机页面因为要获取不同页面的所有手机图片,所以我们要跳转到不同页面观察页面地址的规律,这里观察第二页页面由观察可
- js监听浏览器回车事件,可以支持ie6+,火狐,谷歌等浏览器。<html><head><script type
- 用字符串就可以轻松地获取每一个文件的名称和扩展名,但不要乱用:<%Function getFilename(text)tex
- 等差数列末项计算题目内容:给出一个等差数列的前两项a1,a2,求第n项是多少可以使用以下语句实现非负整数n的输入:n=int(input()
- 本文实例讲述了基于python编写的微博应用,分享给大家供大家参考。具体如下:在编写自己的微博应用之前,先要到weibo开放平台申请应用的公
- 一个网站的一个页面download.asp通过判断referer来确定是不是从他本站点过来的链接,使用这个功能我们可以用来防止下载盗链,当然
- 一、使用docker部署mysql主从 实现主从复制此次使用的是windows版本docker,mysql版本是5.71、使用docker获
- 前言:其实很简单!举一个简单的例子!这是一个简单的显示时刻的温度折线图:from matplotlib import pyplot as p
- #!/usr/bin/env python3# -*- coding: utf-8 -*-import globfrom os import
- 概述:前段时间在跟其他公司DBA交流时谈到了mysql跟PG之间在多表关联查询上的一些区别,相比之下mysql只有一种表连接类型:嵌套循环连
- 结构图:为什么?var data [][]intfor _, rangeSlice := range [][]int{{1}, {2}, {
- 本文实例为大家分享了python实现排序算法的具体代码,供大家参考,具体内容如下一、冒泡排序def bububle_sort(alist):
- CONVERT函数用于将值转换为指定的数据类型或字符集1.转换指定字符集CONVERT函数用于将字符串expr的字符集变成transcodi
- PHP get_html_translation_table() 函数实例输出 htmlspecialchars 函数使用的翻译表:<
- 本文实例讲述了MySQL无法存储Emoji表情问题的解决方法。分享给大家供大家参考,具体如下:数据插入的时候报错:1366 - Incorr
- 本文实例讲述了php逐行读取txt文件写入数组的方法。分享给大家供大家参考。具体如下:假设有user.txt文件如下:user01user0
- Cookie用于服务器实现会话,用户登录及相关功能时进行状态管理。要在用户浏览器上安装cookie,HTTP服务器向HTTP响应添加类似以下
- 起因很单纯,就是给我1年级小豆包的女儿标注三国和西游章节的汉语拼音,我女儿每天