91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MybatisPlus怎么處理Mysql的json類型

發布時間:2022-07-05 13:47:07 來源:億速云 閱讀:2487 作者:iii 欄目:開發技術

本文小編為大家詳細介紹“MybatisPlus怎么處理Mysql的json類型”,內容詳細,步驟清晰,細節處理妥當,希望這篇“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 - 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;
}
@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

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>

注意事項:

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字段

MybatisPlus怎么處理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<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類型”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

高淳县| 新乡县| 乌苏市| 车险| 启东市| 浦城县| 武城县| 于都县| 星子县| 运城市| 平顺县| 浏阳市| 肇州县| 新民市| 博湖县| 武汉市| 新巴尔虎右旗| 铁岭市| 平舆县| 拉孜县| 十堰市| 安康市| 石景山区| 桑植县| 长沙市| 都江堰市| 隆林| 嵊州市| 蒙阴县| 梅州市| 甘洛县| 榆林市| 湄潭县| 福贡县| 樟树市| 西乌珠穆沁旗| 兴海县| 天全县| 永顺县| 江西省| 霍林郭勒市|