mybatis-plus 操作json字段

Posted 阿拉的梦想

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis-plus 操作json字段相关的知识,希望对你有一定的参考价值。

mybatis-plus 操作json字段

1. 演示表格准备

demo表

CREATE TABLE `demo` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `tag` json DEFAULT NULL,
  PRIMARY KEY (`id`)
)

数据:

idtag
1[3, 4, 5]
2[“abc”]
3[“a”, “b”, “c”]

2. SQL操作JSON

2.1.精确查询

从数组中查询是否包含某个特定元素
注意 ,字符串必须使用单引号+双引号

select * from demo where json_contains(tag,'"a"');
id|tag            |
--+---------------+
 3|["a", "b", "c"]|

2.2.模糊查询

select json_search(‘“a”:“xyzf”,“b”:“c”:“sdf”’,‘all’,‘%f%’)

select * from doc where json_search(tag,‘all’,‘%d%’)

其他的不再赘述

3.mybatis-plus中操作JSON字段

3.1自带方法的JSON处理

实体类上要加上自动映射

@TableName(value="doc",autoResultMap = true)

json字段上加上json处理器

@TableName(value="doc",autoResultMap = true)
public class Doc
	@TableField(value="tag",typeHandler = FastjsonTypeHandler.class)
    private Set<String> tag;
   

这样,使用mybatis-plus自带的数据库操作方法时,就可以自动映射了。自己写的方法或SQL不管用。

3.2 QueryWrapper查询的JSON处理

数组模糊查询,模糊查询tag字段数组中是否有指定的值。

QueryWrapper<Doc> wrapper = new QueryWrapper<>();
wrapper.isNotNull("json_search(tag,'all',concat('%','" + param.getTag() + "','%'))");

3.3 自定义SQL操作

查询结果需要自定义映射,json字段需要使用typeHandler。

<resultMap id="resourceMap" type="com.demo.common.params.response.Resource" autoMapping="true" >
    <result column="tag" jdbcType="JAVA_OBJECT" property="tag" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler" javaType="java.util.ArrayList"/>
</resultMap>
<select id="pageOfSearchKey" resultMap="resourceMap"
            parameterType="com.demo.common.params.request.doc.DocPageParam">
	select * from doc where json_search(tag,'all',concat('%',#param.searchKey,'%'))
</select>

新增JSON中的元素,若已存在则不新增

<update id="addTag" parameterType="com.demo.common.params.request.doc.DocTagParam">
    update doc set tag =json_Array_append(tag,'$',#param.tag) , update_time=update_time
    where
    doc_no in
    <foreach collection="param.docNoList" item="docNo" open="(" separator="," close=")">
        #docNo
    </foreach>
    and !JSON_CONTAINS(tag,concat('"',#param.tag,'"'))
</update>

删除JSON中的元素,删除已存在的元素,元素不存在则不删除

    <update id="removeTag">
        UPDATE doc SET tag = JSON_REMOVE(tag, JSON_UNQUOTE(JSON_SEARCH(tag, 'all', #param.tag))) WHERE
        JSON_SEARCH(tag, 'all',#param.tag)
        and doc_no in
        <foreach collection="param.docNoList" item="docNo" open="(" separator="," close=")">
            #docNo
        </foreach>
    </update>

以上是关于mybatis-plus 操作json字段的主要内容,如果未能解决你的问题,请参考以下文章

mybatis-plus 操作json字段

mybatis-plus的扩展功能

MyBatis-Plus逻辑删除

Mybatis-plus 实体类继承关系 插入默认值

mybatis-plus的批量新增insertBatchSomeColumn

mybatis-plus查询时不能映射字段