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)
1
這樣在存入是就可以把對象自動轉換爲json格式

2.那麼取出時怎麼進行映射呢,有分爲兩種情況

​ a:當沒有使用到xml時:

@Data
@TableName(value = "person",autoResultMap = true)
1
2
​ b:當使用了xml文件時:

<result property="advance" column="advance" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>
1
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;
}
1
2
3
4
5
6
7
8
9
10
@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);
}
1
2
3
4
5
6
7
8
自定義方法拿不到一些字段
因爲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()));
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
改進
設置@ResultMap(“mybatis-plus_Person”)

/**
* 設置了ResultMap爲`mybatis-plus_Person`後就可以拿到正確的值.
*/
@ResultMap("mybatis-plus_Person")
@Select("SELECT * FROM person WHERE id=#{id}")
Person selectOneById(int id);
1
2
3
4
5
6
命名規則就是: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>
1
2
3
注意事項
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}”
————————————————
版權聲明:本文爲CSDN博主「AH_HH」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_35098526/article/details/117912886

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章