MybatisPlus怎麼處理Mysql的json類型

王林
發布: 2023-05-27 17:07:28
轉載
4791 人瀏覽過

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檔時:

登入後複製

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 orgIds; @TableField(typeHandler = StringListTypeHandler.class) private List hobbies; }
登入後複製
@Mapper public interface PersonMapper extends BaseMapper { /** * 自定义的根据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

  • ##11 ##支援MVC JSON 解析
  • 支援MySQL JSON 解析

傳統的方法是透過XML SQL 的resultMap 來做typeHandler 映射處理,但是這樣會影響MP 的功能,所以JacksonTypeHandler 剛好可以相容MP 的功能和滿足支援MySQL JSON 解析。

FastjsonTypeHandler

#支援MVC JSON 解析

不支援MySQL JSON 解析

可以透過XML 支持,只是會失去MP 特性。

  
登入後複製
MybatisPlus怎麼處理Mysql的json類型

注意事項:

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 lqw = new LambdaQueryWrapper<>(); lqw.select(Data::getAggJson); lqw.groupBy(Data::getAggJson); List dataList = dataMapper.selectList(lqw); System.out.println(dataList); // -------------------------------------------------------- } }
登入後複製

以上是MybatisPlus怎麼處理Mysql的json類型的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:yisu.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!