欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Mybatis-Plus處理Mysql?Json類型字段的詳細教程

 更新時間:2024年01月15日 09:55:52   作者:jasonspace2012  
這篇文章主要給大家介紹了關(guān)于Mybatis-Plus處理Mysql?Json類型字段的詳細教程,Mybatis-Plus可以很方便地處理JSON字段,在實體類中可以使用@JSONField注解來標記JSON字段,同時在mapper.xml中使用json函數(shù)來操作JSON字段,需要的朋友可以參考下

概要

Mysql 5.7.8開始支持Json對象和Json數(shù)組,但在Mysql 8版本中使用Json性能更佳。

使用Json格式的好處:

  • 無須預(yù)定義字段:字段可以無限拓展,避免了ALTER ADD COLUMN的操作,使用更加靈活。
  • 處理稀疏字段:避免了稀疏字段的NULL值,避免冗余存儲。
  • 支持索引:相比于字符串格式的JSON,JSON類型支持索引做特定的查詢優(yōu)化。

整體實現(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、定義實體類

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
//開啟自動映射
@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層實現(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獲取對象")
    @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("條件查詢")
    @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ù)細節(jié)

  • Json字段模糊查詢
SELECT * FROM TEST WHERE text -> '$[*].name' like '%測%'

或 上面的"*"也可以使用下標

SELECT * FROM TEST WHERE text -> '$[1].name' like '%測%'
  • Json字段精確查詢

  • 使用箭頭函數(shù)

SELECT * FROM TEST WHERE text -> '$.name' = '測試'
  • 使用 JSON_CONTAINS
SELECT * FROM TEST WHERE JSON_CONTAINS(text,JSON_OBJECT('name', '測試'))
  • 查詢json中的name字段
SELECT id, text -> '$[*].name' AS name FROM TEST;
  • 使用JSON_EXTRACT 函數(shù),帶雙引號
SELECT id, JSON_EXTRACT( text, '$[*].name' ) AS name FROM TEST;
  • 使用 JSON_UNQUOTE 函數(shù),不帶雙引號
SELECT id, JSON_UNQUOTE(text, '$[*].name' ) AS name FROM TEST;
  • 查詢Json字段中所有的值,用 “*”
SELECT id, text -> '$[*].*' AS name FROM TEST;

Mybatis Plus使用LambdaQueryChainWrapper查詢

提示:使用apply方法拼接sql片段,apply 是可以通過占位符的形式,傳入多個參數(shù)。

例如:

LambdaQueryChainWrapper<Test> queryWrapper =  testService.lambdaQuery();
        queryWrapper
.apply(Objects.nonNull(test.getText()),"text -> '$.name' LIKE CONCAT('%',{0},'%')",test.getText().getName())//模糊查詢
.apply(Objects.nonNull(test.getText()), "text -> '$.age' = {0}", test.getText().getAge());//精確查詢

總結(jié) 

到此這篇關(guān)于Mybatis-Plus處理Mysql Json類型字段的文章就介紹到這了,更多相關(guān)Mybatis-Plus處理Mysql Json字段內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java中File類的使用方法

    java中File類的使用方法

    本篇文章介紹了,在java中File類的使用方法。需要的朋友參考下
    2013-04-04
  • Java?agent的入門與demo演示詳解

    Java?agent的入門與demo演示詳解

    Java?Agent?是?Java?1.5?版本之后引?的特性,其主要作?是在class被加載之前對其攔截,這篇文章主要介紹了agent的簡單使用,需要的可以參考下
    2023-05-05
  • SpringMVC實現(xiàn)注解式權(quán)限驗證的實例

    SpringMVC實現(xiàn)注解式權(quán)限驗證的實例

    本篇文章主要介紹了SpringMVC實現(xiàn)注解式權(quán)限驗證的實例,可以使用Spring MVC中的action攔截器來實現(xiàn),具有一定的參考價值,有興趣的可以了解下。
    2017-02-02
  • Mybatis-plus多數(shù)據(jù)源配置的兩種方式總結(jié)

    Mybatis-plus多數(shù)據(jù)源配置的兩種方式總結(jié)

    這篇文章主要為大家詳細介紹了Mybatis-plus中多數(shù)據(jù)源配置的兩種方式,文中的示例代碼簡潔易懂,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-10-10
  • Java通過python命令執(zhí)行DataX任務(wù)的實例

    Java通過python命令執(zhí)行DataX任務(wù)的實例

    今天小編就為大家分享一篇Java通過python命令執(zhí)行DataX任務(wù)的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • 淺談Spring解決jar包依賴的bom

    淺談Spring解決jar包依賴的bom

    這篇文章主要介紹了淺談Spring解決jar包依賴的bom,具有一定借鑒價值,需要的朋友可以參考下
    2017-12-12
  • Java緩存框架之Caffeine源碼解析

    Java緩存框架之Caffeine源碼解析

    這篇文章主要介紹了Java緩存框架之Caffeine源碼解析,Caffeine?是一個基于Java?8的高性能本地緩存框架,其結(jié)構(gòu)和?Guava?Cache?基本一樣,api也一樣,基本上很容易就能替換,需要的朋友可以參考下
    2023-11-11
  • MapTask階段shuffle源碼分析

    MapTask階段shuffle源碼分析

    今天小編就為大家分享一篇關(guān)于MapTask階段shuffle源碼分析,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • Java中幾個Reference常見的作用詳解

    Java中幾個Reference常見的作用詳解

    這篇文章主要給大家介紹了Java中關(guān)于Reference多個作用的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)吧。
    2017-06-06
  • Java8中用foreach循環(huán)獲取對象的index下標詳解

    Java8中用foreach循環(huán)獲取對象的index下標詳解

    這篇文章主要給大家介紹了關(guān)于Java8中用foreach循環(huán)獲取對象的index下標的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04

最新評論