这里说下我使用mybatis 应该没有人不知道这个东西了吧?

首先 json这个类型 在mysql 里是5.7才支持的 5.7以下不支持

有这么一张表

2024-06-22T04:14:13.png

  • 简单的不能在简单了
sql 操作
// 注意 数组需要加上''
INSERT INTO `sys_check` (id, assign_id ) VALUES (1, '[11111]' );

// 查询

SELECT
    * 
FROM
    `sys_check`
WHERE
    JSON_CONTAINS(assign_id ,'"11111"', '$')

-- 第一个参数是查询的JSON对象, 第二个参数是需要查找的JSON对象(在这里是包含一个字符串"2"的JSON数组), 第三个参数是$(表示查询应该从整个JSON对象开始)

可能会问 '"11111"' 怎么这么多字符串 '" "'

-- 例如, 如果想搜索数字11111, 在JSON格式中, 需要写成'11111'而不是原始数字 11111
-- 再比如 如果想搜索字符串 "11111" 在JSON格式中, 需要写成'"11111"'而不是原始数字 "11111"

总结: 在json格式中 都必须加上 `''`符号


接下来 上springboot 贴上我的实体类

@TableName(value ="sys_check", autoResultMap = true)
@Data
public class Check implements Serializable {

    @TableField(value = "id")
    private Long id;


    @TableField(value = "assign_id", typeHandler = JacksonTypeHandler.class)
    private List<String> assignIdList;


}

解释下比较关键的几个点

  • 必须声明 autoResultMap = true
  • 必须实现 Serializable接口
  • 和 必须加入json解析 typeHandler = JacksonTypeHandler.class
其中 JacksonTypeHandler这个json解析器需要和mapper.xml对应

2024-06-22T04:17:27.png

顺便说下 这个json解析器

@TableField(typeHandler = JacksonTypeHandler.class)

 
@TableField(typeHandler = FastjsonTypeHandler.class)

JacksonTypeHandler

  • 支持 MVC JSON 解析
  • 支持 MySQL JSON 解析

传统的方法是通过 XML SQL 的 resultMap 来做 typeHandler 映射处理,但是这样会影响 MP 的功能,所以 JacksonTypeHandler 正好可以兼容 MP 的功能和满足 支持 MySQL JSON 解析。

FastjsonTypeHandler

  • 支持 MVC JSON 解析
  • 不支持 MySQL JSON 解析

    注意: 可以通过 XML 支持,只是会失去 mybatis 特性

<resultMap id="xxxx" type="xxxx" >
    <result column="api_dataway" property="apiDataway" typeHandler="com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler" />
</resultMap>

注意事项:

MVC JSON 解析时,可以不用加 @TableName(value = "tableName", autoResultMap = true) 【高亮部分】,
但是 MySQL JSON 解析查询的时候,如果不加,查出来会为 null

MySQL JSON 解析查询时,只支持JSON格式:{"name":"Tom","age":12},

不支持:{\"name\":\"Tom\",\"age\":12} 和 "{\"name\":\"Tom\",\"age\":12}"

实践例子 :

  • 比如 我需要查询数据库 json 数组中是否包含某个值的数据
    废话不多少 直接上图
    2024-06-22T12:26:11.png
    2024-06-22T12:26:48.png
    2024-06-22T12:25:54.png
    <select id="findByIdCheck" parameterType="String" resultMap="BaseResultMap">
        select id, assign_id  FROM sys_check where JSON_CONTAINS(assign_id, CONCAT('"',#{assignId}, '"'), '$');
    </select>

注意 参数 assignId 前需要 拼接上 '
所以使用 sql 函数 CONCAT

再次说明下 在json格式中 都必须加上 `''`符号


最后 贴上我的个人博客

Likefr-Blog

最后修改:2024 年 06 月 22 日
如果觉得我的文章对你有用,请随意赞赏