您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“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有一個很大的缺陷,就是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
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}”
確保mysql的版本是5.7+
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); // -------------------------------------------------------- } }
讀到這里,這篇“MybatisPlus怎么處理Mysql的json類型”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。