MybatisPlus怎么处理Mysql的json类型
本文小編為大家詳細(xì)介紹“MybatisPlus怎么處理Mysql的json類型”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“MybatisPlus怎么處理Mysql的json類型”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識(shí)吧。
MybatisPlus處理Mysql的json類型
1、在數(shù)據(jù)庫表定義JSON字段;
2、在實(shí)體類加上@TableName(autoResultMap = true)、在JSON字段映射的屬性加上@TableField(typeHandler = JacksonTypeHandler.class);
1.實(shí)體類中有個(gè)屬性是其他對(duì)象,或者是List;在數(shù)據(jù)庫中存儲(chǔ)時(shí)使用的是mysql的json格式,此時(shí)可以用mybatis plus的一個(gè)注解@TableField(typeHandler = JacksonTypeHandler.class)
@TableField(typeHandler=JacksonTypeHandler.class)
這樣在存入是就可以把對(duì)象自動(dòng)轉(zhuǎn)換為json格式
2.那么取出時(shí)怎么進(jìn)行映射呢,有分為兩種情況
a:當(dāng)沒有使用到xml時(shí):
@Data @TableName(value="person",autoResultMap=true)
b:當(dāng)使用了xml文件時(shí):
<resultproperty="advance"column="advance"typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>
MyBatis Plus - xml中如何使用autoResultMap構(gòu)造的ResultMap
MyBatis Plus有一個(gè)很大的缺陷,就是insert和select的時(shí)候使用的ResultMap是不同的,修復(fù)的辦法就是在實(shí)體類上增加注解@TableName(autoResultMap = true)。但是這個(gè)autoResultMap并不能使用在自定義的方法上,只在MyBatis Plus內(nèi)置方法上生效。
展示autoResultMap存在的問題
實(shí)體類Person
該實(shí)體類中有自定義的typehandler: IntegerListTypeHandler, StringListTypeHandler
@TableName(autoResultMap=true)
publicclassPerson{
privateIntegerid;
privateStringname;
privateIntegerage;
@TableField(typeHandler=IntegerListTypeHandler.class)
privateList<Integer>orgIds;
@TableField(typeHandler=StringListTypeHandler.class)
privateList<String>hobbies;
}
@Mapper
publicinterfacePersonMapperextendsBaseMapper<Person>{
/**
*自定義的根據(jù)Id獲取Person的方法,與MyBatis-Plus中的selectById相同的功能(但是不能使用autoResultMap生成的ResultMap).
*/
@Select("SELECT*FROMpersonWHEREid=#{id}")
PersonselectOneById(intid);
}
-
自定義方法拿不到一些字段
因?yàn)镻erson中的orgIds和hobbies需要自定義的typeHandler,自定義的方法使用的是resultType=Person,而不是生成的ResultMap,所以都是null
Personperson=newPerson();
person.setAge(1);
person.setName("tim");
person.setOrgIds(Lists.newArrayList(1,2,3));
person.setHobbies(Lists.newArrayList("basketball","pingpong"));
personMapper.insert(person);
#可以得到正確的字段值
PersonpersonInDb=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()));
改進(jìn)
設(shè)置@ResultMap(“mybatis-plus_Person”)
/**
*設(shè)置了ResultMap為`mybatis-plus_Person`后就可以拿到正確的值.
*/
@ResultMap("mybatis-plus_Person")
@Select("SELECT*FROMpersonWHEREid=#{id}")
PersonselectOneById(intid);
命名規(guī)則就是:mybatis-plus_{實(shí)體類名}
-
個(gè)人理解
MyBatis Plus本身并不是一個(gè)動(dòng)態(tài)的ORM,而只是在mybatis初始化的時(shí)候,為mybatis提供常用的SQL語句,resultMap設(shè)置,并不會(huì)改變MyBatis本身的行為
-
常見問題
@TableField(typeHandler = IntegerListTypeHandler.class)沒有生效:自定義的方法上沒有配置resultType
MyBatis-Plus - JacksonTypeHandler VS FastjsonTypeHandler
JacksonTypeHandler
-
支持 MVC JSON 解析
-
支持 MySQL JSON 解析
傳統(tǒng)的方法是通過 XML SQL 的 resultMap 來做 typeHandler 映射處理,但是這樣會(huì)影響 MP 的功能,所以 JacksonTypeHandler 正好可以兼容 MP 的功能和滿足 支持 MySQL JSON 解析。
FastjsonTypeHandler
-
支持 MVC JSON 解析
-
不支持 MySQL JSON 解析
可以通過 XML 支持,只是會(huì)失去 MP 特性。
<resultMapid="rxApiVO"type="RxApiVO"> <resultcolumn="api_dataway"property="apiDataway"typeHandler="com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler"/> </resultMap>
注意事項(xiàng):
MVC JSON 解析時(shí),可以不用加 @TableName(value = “t_test”, autoResultMap = true) 【高亮部分】,但是 MySQL JSON 解析查詢的時(shí)候,如果不加,查出來為 null
MySQL JSON 解析查詢時(shí),只支持JSON格式:{“name”:“Tom”,“age”:12},不支持:{“name”:“Tom”,“age”:12} 和 “{“name”:“Tom”,“age”:12}”
MybatisPlus讀寫Mysql的json字段
前置條件
確保mysql的版本是5.7+
一、新建mysql表增加json字段
二、pojo類
packagecom.cxstar.domain;
importcom.alibaba.fastjson.JSONObject;
importcom.baomidou.mybatisplus.annotation.IdType;
importcom.baomidou.mybatisplus.annotation.TableField;
importcom.baomidou.mybatisplus.annotation.TableId;
importcom.baomidou.mybatisplus.annotation.TableName;
importcom.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
importjava.io.Serializable;
importjava.util.Date;
@lombok.Data
@TableName(autoResultMap=true)
publicclassDataimplementsSerializable{
@TableId(value="id",type=IdType.AUTO)
privateIntegerid;
//部分字段省略-------------
privateStringtitle;
privateStringauthor;
privateStringpublisher;
//-----------------------
@TableField(typeHandler=FastjsonTypeHandler.class)
privateJSONObjectaggJson;
}
三、測試類
packagecom.cxstar;
importcom.alibaba.fastjson.JSONArray;
importcom.alibaba.fastjson.JSONObject;
importcom.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
importcom.cxstar.domain.Data;
importcom.cxstar.domain.SearchMsg;
importcom.cxstar.mapper.DataMapper;
importcom.cxstar.service.OrderService;
importcom.cxstar.service.spider.impl.*;
importcom.cxstar.service.utils.ExecutorThread;
importcom.cxstar.service.utils.SpiderThread;
importcom.cxstar.service.utils.SynContainer;
importorg.junit.jupiter.api.Test;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.boot.test.context.SpringBootTest;
importjava.util.ArrayList;
importjava.util.Date;
importjava.util.UUID;
@SpringBootTest
classOrderApplicationTests{
@Autowired
DataMapperdataMapper;
@Test
voidtestJson(){
//insert-----------------------------------
Datadata=newData();
data.setTitle("計(jì)算機(jī)安全技術(shù)與方法");
data.setPublisher("<<計(jì)算機(jī)技術(shù)>>編輯部出版");
JSONObjectjb=newJSONObject();
jb.put("searchKey","英格");
jb.put("curPage","1");
JSONArrayjs=newJSONArray();
js.add("西北政法大學(xué)");
js.add("西安理工大學(xué)");
jb.put("source",js);
data.setAggJson(jb);
dataMapper.insert(data);
//------------------------------------------
//select--------------------------------------
Datadata1=dataMapper.selectById(5837);
JSONObjectjb2=data1.getAggJson();
System.out.println(jb2.getJSONArray("source"));
//---------------------------------------------
//groupby-----------------------------------------------
LambdaQueryWrapper<Data>lqw=newLambdaQueryWrapper<>();
lqw.select(Data::getAggJson);
lqw.groupBy(Data::getAggJson);
List<Data>dataList=dataMapper.selectList(lqw);
System.out.println(dataList);
//--------------------------------------------------------
}
}
總結(jié)
以上是生活随笔為你收集整理的MybatisPlus怎么处理Mysql的json类型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 拼多多怎么查看评价记录 拼多多查看评价记
- 下一篇: 拼多多农场怎么种植土豆 拼多多农场种植土