网络编程
位置:首页>> 网络编程>> 数据库>> MybatisPlus如何处理Mysql的json类型

MybatisPlus如何处理Mysql的json类型

作者:AH_HH  发布时间:2024-01-27 14:23:19 

标签: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(&ldquo;mybatis-plus_Person&rdquo;)

/**
 * 设置了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 = &ldquo;t_test&rdquo;, autoResultMap = true) 【高亮部分】,但是 MySQL JSON 解析查询的时候,如果不加,查出来为 null

MySQL JSON 解析查询时,只支持JSON格式:{&ldquo;name&rdquo;:&ldquo;Tom&rdquo;,&ldquo;age&rdquo;:12},不支持:{&ldquo;name&rdquo;:&ldquo;Tom&rdquo;,&ldquo;age&rdquo;:12} 和 &ldquo;{&ldquo;name&rdquo;:&ldquo;Tom&rdquo;,&ldquo;age&rdquo;:12}&rdquo;

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;
@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

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com