MybatisPlus如何處理Mysql的json類(lèi)型
MybatisPlus處理Mysql的json類(lèi)型
1、在數(shù)據(jù)庫(kù)表定義JSON字段;
2、在實(shí)體類(lèi)加上@TableName(autoResultMap = true)、在JSON字段映射的屬性加上@TableField(typeHandler = JacksonTypeHandler.class);
1.實(shí)體類(lèi)中有個(gè)屬性是其他對(duì)象,或者是List;在數(shù)據(jù)庫(kù)中存儲(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)沒(méi)有使用到xml時(shí):
@Data @TableName(value = "person",autoResultMap = true)
b:當(dāng)使用了xml文件時(shí):
<result property="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í)體類(lèi)上增加注解@TableName(autoResultMap = true)。但是這個(gè)autoResultMap并不能使用在自定義的方法上,只在MyBatis Plus內(nèi)置方法上生效。
展示autoResultMap存在的問(wèn)題
實(shí)體類(lèi)Person
該實(shí)體類(lèi)中有自定義的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> { ? ? /** ? ? ?* 自定義的根據(jù)Id獲取Person的方法,與MyBatis-Plus中的selectById相同的功能(但是不能使用autoResultMap生成的ResultMap). ? ? ?*/ ? ? @Select("SELECT * FROM person WHERE id=#{id}") ? ? Person selectOneById(int id); }
- 自定義方法拿不到一些字段
因?yàn)镻erson中的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()));
改進(jìn)
設(shè)置@ResultMap(“mybatis-plus_Person”)
/** ?* 設(shè)置了ResultMap為`mybatis-plus_Person`后就可以拿到正確的值. ?*/ @ResultMap("mybatis-plus_Person") @Select("SELECT * FROM person WHERE id=#{id}") Person selectOneById(int id);
命名規(guī)則就是:mybatis-plus_{實(shí)體類(lèi)名}
- 個(gè)人理解
MyBatis Plus本身并不是一個(gè)動(dòng)態(tài)的ORM,而只是在mybatis初始化的時(shí)候,為mybatis提供常用的SQL語(yǔ)句,resultMap設(shè)置,并不會(huì)改變MyBatis本身的行為
- 常見(jiàn)問(wèn)題
@TableField(typeHandler = IntegerListTypeHandler.class)沒(méi)有生效:自定義的方法上沒(méi)有配置resultType
MyBatis-Plus - JacksonTypeHandler VS FastjsonTypeHandler
JacksonTypeHandler
- 支持 MVC JSON 解析
- 支持 MySQL JSON 解析
傳統(tǒng)的方法是通過(guò) XML SQL 的 resultMap 來(lái)做 typeHandler 映射處理,但是這樣會(huì)影響 MP 的功能,所以 JacksonTypeHandler 正好可以兼容 MP 的功能和滿(mǎn)足 支持 MySQL JSON 解析。
FastjsonTypeHandler
- 支持 MVC JSON 解析
- 不支持 MySQL JSON 解析
可以通過(guò) XML 支持,只是會(huì)失去 MP 特性。
<resultMap id="rxApiVO" type="RxApiVO" > ?? ?<result column="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 解析查詢(xún)的時(shí)候,如果不加,查出來(lái)為 null
MySQL JSON 解析查詢(xún)時(shí),只支持JSON格式:{“name”:“Tom”,“age”:12},不支持:{“name”:“Tom”,“age”:12} 和 “{“name”:“Tom”,“age”:12}”
MybatisPlus讀寫(xiě)Mysql的json字段
前置條件
確保mysql的版本是5.7+
一、新建mysql表增加json字段
二、pojo類(lèi)
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; }
三、測(cè)試類(lèi)
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("計(jì)算機(jī)安全技術(shù)與方法"); data.setPublisher("<<計(jì)算機(jī)技術(shù)>>編輯部出版"); JSONObject jb = new JSONObject(); jb.put("searchKey", "英格"); jb.put("curPage", "1"); JSONArray js = new JSONArray(); js.add("西北政法大學(xué)"); js.add("西安理工大學(xué)"); 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); // -------------------------------------------------------- } }
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java多線(xiàn)程事務(wù)回滾@Transactional失效處理方案
這篇文章主要介紹了Java多線(xiàn)程事務(wù)回滾@Transactional失效處理方案,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-08-08Mybatis Plus框架項(xiàng)目落地實(shí)踐分析總結(jié)
這篇文章主要為大家介紹了Mybatis Plus框架項(xiàng)目落地實(shí)踐分析總結(jié),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03java實(shí)現(xiàn)可視化界面肯德基(KFC)點(diǎn)餐系統(tǒng)代碼實(shí)例
這篇文章主要介紹了java肯德基點(diǎn)餐系統(tǒng),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05詳解java8在Collection中新增加的方法removeIf
這篇文章主要介紹了詳解java8在Collection中新增加的方法removeIf的相關(guān)資料,需要的朋友可以參考下2018-01-01Spring的@ConfigurationProperties注解詳解
這篇文章主要介紹了Spring的@ConfigurationProperties注解詳解,@ConfigurationProperties該注解是用來(lái)獲取yml或者properties配置文件的配置信息,下面根據(jù)一些配置信息給出案例代碼進(jìn)行講解,需要的朋友可以參考下2023-11-11java基于swing實(shí)現(xiàn)的連連看代碼
這篇文章主要介紹了java基于swing實(shí)現(xiàn)的連連看代碼,包含了游戲中涉及的事件處理與邏輯功能,需要的朋友可以參考下2014-11-11springboot+vue實(shí)現(xiàn)驗(yàn)證碼功能
這篇文章主要為大家詳細(xì)介紹了springboot+vue實(shí)現(xiàn)驗(yàn)證碼功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08