Mybatis-Plus處理Mysql?Json類(lèi)型字段的詳細(xì)教程
概要
Mysql 5.7.8開(kāi)始支持Json對(duì)象和Json數(shù)組,但在Mysql 8版本中使用Json性能更佳。
使用Json格式的好處:
- 無(wú)須預(yù)定義字段:字段可以無(wú)限拓展,避免了ALTER ADD COLUMN的操作,使用更加靈活。
- 處理稀疏字段:避免了稀疏字段的NULL值,避免冗余存儲(chǔ)。
- 支持索引:相比于字符串格式的JSON,JSON類(lèi)型支持索引做特定的查詢(xún)優(yōu)化。
整體實(shí)現(xiàn)流程
1、查看Mysql版本
SELECT VERSION();

2、創(chuàng)建mysql表
CREATE TABLE `test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `text` json DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;

3、定義實(shí)體類(lèi)
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 lombok.Data;
@Data
//開(kāi)啟自動(dòng)映射
@TableName(value = "test",autoResultMap = true)
public class Test {
@TableId(type = IdType.AUTO)
private Integer id;
//定義Json字段handler
@TableField(typeHandler = FastjsonTypeHandler.class)
private JsonNode text;
}
import lombok.Data;
import java.io.Serializable;
@Data
public class JsonNode implements Serializable {
private Integer id;
private String name;
private Integer age;
}4、定義Mapper、Service、ServiceImpl
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yiyou.base.entity.Test;
public interface TestMapper extends BaseMapper<Test> {
}
import com.baomidou.mybatisplus.extension.service.IService;
import com.yiyou.base.entity.Test;
public interface TestService extends IService<Test> {
boolean insert(Test test);
}
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yiyou.base.entity.Test;
import com.yiyou.base.mapper.TestMapper;
import com.yiyou.base.service.TestService;
import org.springframework.stereotype.Service;
@Service
public class TestServiceImpl extends ServiceImpl<TestMapper, Test> implements TestService {
@Override
public boolean insert(Test test) {
return this.saveOrUpdate(test);
}
}
5、Controller層實(shí)現(xiàn)
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.yiyou.base.entity.Test;
import com.yiyou.base.service.TestService;
import com.yiyou.model.R;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Objects;
@Slf4j
@Api(tags = "test")
@RestController
@RequestMapping("/test")
public class TestController {
@Autowired
private TestService testService;
@ApiOperation("新增")
@PostMapping("/save")
public R<Boolean> save(@RequestBody Test test) {
return R.ok(testService.insert(test));
}
@ApiOperation("根據(jù)Id獲取對(duì)象")
@GetMapping("/getById/{id}")
public R<Test> getById(@PathVariable("id") Integer id) {
return R.ok(testService.getById(id));
}
@ApiOperation("根據(jù)Id刪除")
@DeleteMapping("/deleteById/{id}")
public R<Boolean> deleteById(@PathVariable("id") Integer id) {
return R.ok(testService.removeById(id));
}
@ApiOperation("條件查詢(xún)")
@PostMapping("/findList")
public R<List<Test>> findList(@RequestBody Test test) {
LambdaQueryChainWrapper<Test> queryWrapper = testService.lambdaQuery();
queryWrapper
.eq(Objects.nonNull(test.getId()),Test::getId,test.getId())
// .apply(Objects.nonNull(test.getText()),"text -> '$.name' LIKE CONCAT('%',{0},'%')",test.getText().getName())
.apply(Objects.nonNull(test.getText()), "text -> '$.age' = {0}", test.getText().getAge());
// .like(Objects.nonNull(test.getText()),Test::getText,test.getText());
return R.ok(queryWrapper.list());
}
技術(shù)細(xì)節(jié)
- Json字段模糊查詢(xún)
SELECT * FROM TEST WHERE text -> '$[*].name' like '%測(cè)%'
或 上面的"*"也可以使用下標(biāo)
SELECT * FROM TEST WHERE text -> '$[1].name' like '%測(cè)%'
Json字段精確查詢(xún)
使用箭頭函數(shù)
SELECT * FROM TEST WHERE text -> '$.name' = '測(cè)試'
- 使用 JSON_CONTAINS
SELECT * FROM TEST WHERE JSON_CONTAINS(text,JSON_OBJECT('name', '測(cè)試'))
- 查詢(xún)json中的name字段
SELECT id, text -> '$[*].name' AS name FROM TEST;
- 使用JSON_EXTRACT 函數(shù),帶雙引號(hào)
SELECT id, JSON_EXTRACT( text, '$[*].name' ) AS name FROM TEST;
- 使用 JSON_UNQUOTE 函數(shù),不帶雙引號(hào)
SELECT id, JSON_UNQUOTE(text, '$[*].name' ) AS name FROM TEST;
- 查詢(xún)Json字段中所有的值,用 “*”
SELECT id, text -> '$[*].*' AS name FROM TEST;
Mybatis Plus使用LambdaQueryChainWrapper查詢(xún)
提示:使用apply方法拼接sql片段,apply 是可以通過(guò)占位符的形式,傳入多個(gè)參數(shù)。
例如:
LambdaQueryChainWrapper<Test> queryWrapper = testService.lambdaQuery();
queryWrapper
.apply(Objects.nonNull(test.getText()),"text -> '$.name' LIKE CONCAT('%',{0},'%')",test.getText().getName())//模糊查詢(xún)
.apply(Objects.nonNull(test.getText()), "text -> '$.age' = {0}", test.getText().getAge());//精確查詢(xún)總結(jié)
到此這篇關(guān)于Mybatis-Plus處理Mysql Json類(lèi)型字段的文章就介紹到這了,更多相關(guān)Mybatis-Plus處理Mysql Json字段內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Boot4使用Sentinel進(jìn)行限流的操作方法
Sentinel是阿里巴巴開(kāi)源的流量控制組件,用于保障微服務(wù)架構(gòu)的穩(wěn)定性,它提供了多種規(guī)則類(lèi)型,本文還介紹了如何在Spring Boot 4中集成Sentinel,以及Sentinel在不同版本的Spring Boot和Spring Cloud中的兼容性情況,感興趣的朋友跟隨小編一起看看吧2025-12-12
Spring Security跳轉(zhuǎn)頁(yè)面失敗問(wèn)題解決
這篇文章主要介紹了Spring Security跳轉(zhuǎn)頁(yè)面失敗問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01
springboot集成kafka消費(fèi)手動(dòng)啟動(dòng)停止操作
這篇文章主要介紹了springboot集成kafka消費(fèi)手動(dòng)啟動(dòng)停止操作,本文給大家介紹項(xiàng)目場(chǎng)景及解決分析,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09
JavaWeb實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)(3)
這篇文章主要為大家詳細(xì)介紹了JavaWeb實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)第三篇,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
解決springboot 啟動(dòng)找不到主類(lèi)的問(wèn)題
這篇文章主要介紹了解決springboot 啟動(dòng)找不到主類(lèi)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
Java MySQL動(dòng)態(tài)語(yǔ)句編寫(xiě)實(shí)現(xiàn)方式
這篇文章主要介紹了Java MySQL動(dòng)態(tài)語(yǔ)句編寫(xiě)實(shí)現(xiàn)方式,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2025-04-04
Java list.remove( )方法注意事項(xiàng)
這篇文章主要介紹了Java list.remove( )方法注意事項(xiàng),非常簡(jiǎn)單易懂,需要的朋友可以參考下2018-08-08
Java CAS底層實(shí)現(xiàn)原理實(shí)例詳解
這篇文章主要介紹了Java CAS底層實(shí)現(xiàn)原理實(shí)例詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01
Mybatisplus實(shí)現(xiàn)JSON處理器的示例代碼
Mybatisplusjson是基于Mybatisplus開(kāi)發(fā)的一個(gè)json工具庫(kù),本文主要介紹了Mybatisplus實(shí)現(xiàn)JSON處理器的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03
springCloud gateWay 統(tǒng)一鑒權(quán)的實(shí)現(xiàn)代碼
這篇文章主要介紹了springCloud gateWay 統(tǒng)一鑒權(quán)的實(shí)現(xiàn)代碼,統(tǒng)一鑒權(quán)包括鑒權(quán)邏輯和代碼實(shí)現(xiàn),本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-02-02

