这里说下我使用mybatis 应该没有人不知道这个东西了吧?
- (MyBatis-Plus官网)[https://baomidou.com/introduce/]
首先 json这个类型 在mysql 里是5.7才支持的 5.7以下不支持
有这么一张表
- 简单的不能在简单了
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对应
顺便说下 这个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 数组中是否包含某个值的数据
废话不多少 直接上图
<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格式中 都必须加上 `''`符号
最后 贴上我的个人博客