首页 > 其他分享 >Mybatis-Plus 实现 jsonb类型的数据存取

Mybatis-Plus 实现 jsonb类型的数据存取

时间:2024-05-28 17:34:57浏览次数:22  
标签:return jsonb private clazz SQLException Plus Mybatis import public

1、自定义类型处理器

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.postgresql.util.PGobject;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class JSONTypePgHandler<T extends Object> extends BaseTypeHandler<T> {
    private static final PGobject jsonObject = new PGobject();
    private Class<T> clazz;

    public JSONTypePgHandler(Class<T> clazz) {
        if (clazz == null) throw new IllegalArgumentException("Type argument cannot be null");
        this.clazz = clazz;
    }

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException {
        jsonObject.setType("json");
        jsonObject.setValue(this.toJson(parameter));
        ps.setObject(i, jsonObject);
    }

    @Override
    public T getNullableResult(ResultSet rs, String columnName) throws SQLException {
        return this.toObject(rs.getString(columnName), clazz);
    }

    @Override
    public T getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        return this.toObject(rs.getString(columnIndex), clazz);
    }

    @Override
    public T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        return this.toObject(cs.getString(columnIndex), clazz);
    }

    private String toJson(T object) {
        try {
            return JSON.toJSONString(object, SerializerFeature.WriteNullListAsEmpty);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    private T toObject(String content, Class<?> clazz) {
        if (content != null && !content.isEmpty()) {
            try {
                return (T) JSON.parseObject(content,clazz);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        } else {
            return null;
        }
    }
}

2、存储:字段上添加处理器

    @Schema(description = "当前处理人")
    @TableField(value = "current_handler", typeHandler = JSONTypePgHandler.class)
    private List<Handler> currentHandler;

3、读取:①、设置autoResultMap = true,自动为实体类生成一个结果映射;②、xml文件定义映射,数据库结果集中获取数据映射到Java对象的属性

@TableName(value = "tb_report_info",autoResultMap = true)
public class ReportInfo {}
    <resultMap id="ReportInfo" type="com.tdar.entity.ReportInfo">
        <result property="currentHandler" column="current_handler" javaType="java.util.List" typeHandler="com.tdar.utils.JSONTypePgHandler"></result>
    </resultMap>

 

标签:return,jsonb,private,clazz,SQLException,Plus,Mybatis,import,public
From: https://www.cnblogs.com/lijianda/p/18218498

相关文章

  • Mybatis的mapper文件模糊查询TDengine数据库
    在mapper文件中使用#{}时会自动添加单引号,无法拼接使用%进行模糊查询,可以使用<bind>标签。MyBatis的标签用于创建一个新的变量,并将其绑定到上下文中。这通常用于创建复杂的SQL片段,这些片段可能包含从多个参数中组合而成的值。以下是<bind>标签的一个简单示例:<selectid="......
  • C++Primer Plus对象和类的练习,练习10.10类和对象 练习2默认参数和重载
    2.下面是一个非常简单的类定义:classPerson{private:staticconstLIMIT=25;stringlname;//Person’slastnamecharfname[LIMIT];//Person’sfirstnamepublic:Person()(lname=“”;fname[0]=0’;}//#1Person(conststring&ln,constchar*fn=“Heyyou”);//......
  • mybatis异常: Invalid value type for attribute 'factoryBeanObjectType': java.lang
    问题描述:  springboot3.2.0版本以上编写mapper报错解决方案: 排查mybatilsplus自带的mybatils-spring,重新引入1<dependency>2<groupId>com.baomidou</groupId>3<artifactId>mybatis-plus-boot-starter</artifactId>4......
  • Mybatis(1)
    定义:MyBatis是一款优秀的持久层框架,用于简化JDBC的开发。官网:https://mybatis.org/mybatis-3/zh/index.html创建工程1.准备工作(创建springboot工程、数据库表user、实体类User)2.引入Mybatis的相关依赖,配置Mybatis(数据库连接信息)3.编写SQL语句(注解/XML)引入Mybatis......
  • mybatis- [04] mapper文件详解
      Mybatis的Mapper文件(通常是以.xml为扩展名的文件)主要用于定义SQL语句和它们与Java接口方法之间的映射关系。以下是Mapper文件中一些常用的配置元素和属性。 一、mapper文件配置详解(1)namespace:定义Mapper接口对应的唯一命名空间,用于区分不同的Mapper。(常以UserMapper类的......
  • log4cplus
    官网地址:https://sourceforge.net/projects/log4cplus/files/log4cplus-stable/GitHub地址:https://github.com/log4cplus/log4cplus官方文档:https://sourceforge.net/p/log4cplus/wiki/Home/项目使用文件:include和lib链接:https://pan.baidu.com/s/1z98yPL9jKxbxgfkjT1jDKw?pwd......
  • 01-Mybatis入门介绍
    MyBatis官网:mybatis–MyBatis3|简介 1)创建spingboot工程  2)配置Mybaits的相关依赖     ......
  • 干掉 XML、Mapper,Fluent Mybatis 牛逼
    干掉XML、Mapper,FluentMybatis牛逼前言Part1仓库地址Part2需求场景设置Part3三者实现对比1使用fluentmybatis来实现上面的功能2换成mybatis原生实现效果1、定义Mapper接口2、定义接口需要用到的参数实体SummaryQuery3、定义实现业务逻辑的mapperxml文件4、实现业......
  • MyBatis Plus 分页查询操作
     这里分页查询最重要的一步是对查询条件和返回值进行了统一封装 现在有一个这样的表格要进行分页查询下面是对其进行分页查询的全步骤 首先需要封装统一的查询条件和统一的返回值就是这两部分 1.封装统一的查询条件2.封装统一的返回值 3.controller4.s......
  • MyBatis中的部分SQL语句
    在MyBatis的XML映射文件中,<if>标签用于实现动态SQL,根据条件决定是否包含某个子句。1<iftest="merchantId!=null">andmerchantId=#{merchantId}</if>这里的三个merchantId分别代表:第一个merchantId(test="merchantId!=null"中的merchantId):这是一个条件表达式的......