Mybatis-Plus处理Mysql Json类型字段的详细教程

 更新时间:2024年01月15日 09:55:52   作者:jasonspace2012  
这篇文章主要给大家介绍了关于Mybatis-Plus处理Mysql Json类型字段的详细教程,Mybatis-Plus可以很方便地处理JSON字段,在实体类中可以使用@JSONField注解来标记JSON字段,同时在mapper.xml中使用json函数来操作JSON字段,需要的朋友可以参考下

概要

Mysql 5.7.8开始支持Json对象和Json数组,但在Mysql 8版本中使用Json性能更佳。

使用Json格式的好处:

  • 无须预定义字段:字段可以无限拓展,避免了ALTER ADD COLUMN的操作,使用更加灵活。
  • 处理稀疏字段:避免了稀疏字段的NULL值,避免冗余存储。
  • 支持索引:相比于字符串格式的JSON,JSON类型支持索引做特定的查询优化。

整体实现流程

1、查看Mysql版本

SELECT VERSION();

2、创建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层实现

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("根据Id获取对象")
    @GetMapping("/getById/{id}")
    public R<Test> getById(@PathVariable("id") Integer id) {
        return R.ok(testService.getById(id));
    }

    @ApiOperation("根据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());
    }

技术细节

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

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

SELECT * FROM TEST WHERE text -> '$[1].name' like '%测%'
  • Json字段精确查询

  • 使用箭头函数

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 函数,带双引号
SELECT id, JSON_EXTRACT( text, '$[*].name' ) AS name FROM TEST;
  • 使用 JSON_UNQUOTE 函数,不带双引号
SELECT id, JSON_UNQUOTE(text, '$[*].name' ) AS name FROM TEST;
  • 查询Json字段中所有的值,用 “*”
SELECT id, text -> '$[*].*' AS name FROM TEST;

Mybatis Plus使用LambdaQueryChainWrapper查询

提示:使用apply方法拼接sql片段,apply 是可以通过占位符的形式,传入多个参数。

例如:

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());//精确查询

总结 

到此这篇关于Mybatis-Plus处理Mysql Json类型字段的文章就介绍到这了,更多相关Mybatis-Plus处理Mysql Json字段内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot事务注解超详细讲解

    SpringBoot事务注解超详细讲解

    这篇文章主要给大家介绍了关于SpringBoot事务注解的相关资料,在Spring Boot中,事务管理是一个非常重要的概念,我们可以使用事务注解来控制事务的行为,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • JAVA遍历Map集合的几种方法汇总

    JAVA遍历Map集合的几种方法汇总

    这篇文章主要给大家介绍了关于JAVA遍历Map集合的几种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Maven配置多仓库无效的解决

    Maven配置多仓库无效的解决

    在项目中使用Maven管理jar包依赖往往会出现很多问题,所以这时候就需要配置Maven多仓库,本文介绍了如何配置以及问题的解决
    2021-05-05
  • Java Properties作为集合三个方法详解

    Java Properties作为集合三个方法详解

    Properties是JDK1.0中引入的java类,目前也在项目中大量使用,主要用来读取外部的配置,那除了这个,你对它其他的一些api也了解吗? 你了解它是怎么实现的吗? 如果不清楚的话,就通过本篇文章带你一探究竟
    2022-11-11
  • Java调用python代码的五种方式总结

    Java调用python代码的五种方式总结

    这篇文章主要给大家介绍了关于Java调用python代码的五种方式,在Java中调用Python函数的方法有很多种,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-09-09
  • SpringBoot 在项目启动之后执行自定义方法的两种方式小结

    SpringBoot 在项目启动之后执行自定义方法的两种方式小结

    这篇文章主要介绍了SpringBoot 在项目启动之后执行自定义方法的两种方式小结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Java中Stream流的常用方法代码示例

    Java中Stream流的常用方法代码示例

    这篇文章主要介绍了Java中Stream流的常用方法代码示例,Stream类中每一个方法都对应集合上的一种操作,将真正的函数式编程引入到Java中,能 让代码更加简洁,极大地简化了集合的处理操作,提高了开发的效率和生产力,需要的朋友可以参考下
    2023-10-10
  • SpringBoot快速搭建web项目详细步骤总结

    SpringBoot快速搭建web项目详细步骤总结

    这篇文章主要介绍了SpringBoot快速搭建web项目详细步骤总结 ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • MyBatis的⾼级映射及延迟加载过程详解

    MyBatis的⾼级映射及延迟加载过程详解

    这篇文章主要介绍了MyBatis的⾼级映射及延迟加载,包括多对一延时加载方式及一对多,本文结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • 远程连接Jedis和整合SpringBoot的详细过程

    远程连接Jedis和整合SpringBoot的详细过程

    这篇文章主要介绍了远程连接Jedis和整合SpringBoot的详细过程,本文通过图文实例相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08

最新评论