MyBatis写入Json字段以及Json字段转对象示例详解

 更新时间:2023年07月21日 11:32:53   作者:头发怎么还有这么多  
这篇文章主要给大家介绍了关于MyBatis写入Json字段以及Json字段转对象的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考借鉴价值,需要的朋友可以参考下

一、背景

最近在设计表结构的时候,根据需求,将一个字段的类型设计为Json字段,而对于还没有操作过数据库Json字段的我就有点懵了,之前从未遇到这种情况,所以也是一步步研究一步步踩坑,最后终于是把Json字段读取的坑都踩遍了,希望这篇文章可以帮助到大家,有问题留言

二、需求描述

本来打算贴表结构图的,奈何不知道为什么贴上来总是无法显示,所以就直接贴实体类结构吧需求是要直接将ParameterEntitylimiting属性写入json字段并且在做查询的时候需要将json字段中的值直接映射到实体类上
@Data
@Builder
@ToString
public class ParameterEntity {
    private String device;
    private String recipe;
    private String parameter;
    private String name;
    private String type;
    private String valueType;
    // 这个字段就对应表中的json字段 
    private ParameterLimiting limiting;
}

三、准备环境

这里我使用的是pg数据库,如下是pg库的配置
特别注意!!!
jdbcUrl中的tringtype=unspecified一定要加,否则会报一个写入类型不匹配的错误,其他数据库可能也需要指定tringtype,这里就暂时不做研究
  datasource:
    pgsql:
      jdbcUrl: jdbc:postgresql://ip:5432/ams?rewriteBatchedStatements=true&stringtype=unspecified
      username: 
      password: 
      driver-class-name: org.postgresql.Driver

四、Json字段数据的写入

核心:字符串转Json的控制类

1. 定义对象转Json的控制类

// 这里对应表中字段的类型
@MappedJdbcTypes(JdbcType.OTHER)
// 这里对应实体类的类型
@MappedTypes(ParameterLimiting.class)
public class ParameterLimitingToJsonHandler extends BaseTypeHandler<ParameterLimiting> {
    @Override
    public void setNonNullParameter(PreparedStatement preparedStatement, int i, ParameterLimiting parameterLimiting, JdbcType jdbcType) throws SQLException {
    	// 做写入操作时将对象转成json字符串
        preparedStatement.setObject(i, JSON.toJSONString(parameterLimiting));
    }
    @Override
    public ParameterLimiting getNullableResult(ResultSet resultSet, String s) throws SQLException {
        return null;
    }
    @Override
    public ParameterLimiting getNullableResult(ResultSet resultSet, int i) throws SQLException {
        return null;
    }
    @Override
    public ParameterLimiting getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
        return null;
    }
}

2. 写mapper文件

<insert id="addParameter" parameterType="com.inventec.dm.entity.po.ParameterEntity">
        INSERT INTO dap.parameter
        ("device", "recipe", "parameter", "name", "type", "valueType", "limiting")
        VALUES (#{device}, #{recipe}, #{parameter}, #{name}, #{type}, #{valueType},
        		<!--  这里需要指定 jdbcType 及 typeHandler 属性,这里的 typeHandler 也就是我们刚写的对象转Json的控制类  -->
                #{limiting,jdbcType=OTHER,typeHandler=com.inventec.dm.config.ParameterLimitingToJsonHandler});
</insert>

到这里对象写入json字段就告一段落了

五、Json字段转对象

核心:实体类的有参构造

1. mapper文件

<select id="getParametersByDeviceId" resultMap="parameterToParameterEntity">
        SELECT *
        FROM dap.parameter
        WHERE device = #{device};
</select>
<resultMap id="parameterToParameterEntity" type="com.inventec.dm.entity.po.ParameterEntity">
        <result property="device" column="device"/>
        <result property="recipe" column="recipe"/>
        <result property="parameter" column="parameter"/>
        <result property="name" column="name"/>
        <result property="type" column="type"/>
        <result property="valueType" column="valueType"/>
        <-- 这里需要指定jdbcType、javaType、typeHandler属性,其中typeHandler还是上边的转换控制类 -->
        <result property="limiting" column="limiting"
                jdbcType="OTHER" javaType="com.inventec.dm.entity.parameter.ParameterLimiting"
                typeHandler="com.inventec.dm.config.ParameterLimitingToJsonHandler"/>
</resultMap>

2. 构造函数

@Data
@Builder
@ToString
public class ParameterEntity {
    private String device;
    private String recipe;
    private String parameter;
    private String name;
    private String type;
    private String valueType;
    private ParameterLimiting limiting;
    // 这个实体类中不能有无参构造,否则在映射json字段时不执行有参构造
    // 注意这里最后的一个参数是 Object limiting,而不是 ParameterLimiting limiting
    public ParameterEntity(String device, String recipe, String parameter, String name, String type, String valueType, Object limiting) {
        this.device = device;
        this.recipe = recipe;
        this.parameter = parameter;
        this.name = name;
        this.type = type;
        this.valueType = valueType;
        if (limiting != null) {
            this.limiting = JSON.parseObject(limiting.toString(), ParameterLimiting.class);
        }
    }
}

注意:

  • 这个实体类中不能有无参构造,否则在映射json字段时不执行有参构造,也就是说无法转换对象!切记!!!
  • 注意这里最后的一个参数 Object limiting,定义为Object类型也是为了使其可以接收表中json字的值同时也符合有参构造参数的类型(也就是说如果把Object改为String的话编译会报错)

到这里Json字段的写入和读取就大工告成了

六、最后

到此这篇关于MyBatis写入Json字段以及Json字段转对象的文章就介绍到这了,更多相关MyBatis写入Json字段内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 关于@RequestParam注解的使用(简单易懂)

    关于@RequestParam注解的使用(简单易懂)

    这篇文章主要介绍了关于@RequestParam注解的使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Springboot整合GuavaCache缓存过程解析

    Springboot整合GuavaCache缓存过程解析

    这篇文章主要介绍了springboot整合GuavaCache缓存过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • 浅谈Slf4j与其他日志系统兼容的使用方法

    浅谈Slf4j与其他日志系统兼容的使用方法

    下面小编就为大家分享一篇浅谈Slf4j与其他日志系统兼容的使用方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • idea springBoot项目自动注入mapper为空报错的解决方法

    idea springBoot项目自动注入mapper为空报错的解决方法

    这篇文章主要介绍了idea springBoot项目自动注入mapper为空报错的解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • spring boot如何使用spring AOP实现拦截器

    spring boot如何使用spring AOP实现拦截器

    本篇文章主要介绍了spring boot如何使用spring AOP实现拦截器,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • Java 实现使用Comparable按照我们指定的规则排序

    Java 实现使用Comparable按照我们指定的规则排序

    这篇文章主要介绍了Java 如何使用Comparable按照我们指定的规则排序,通过练习创建TreeSet集合使用无参构造方法,并按照年龄从小到大的顺序排序,若年龄相同再按照姓名的字母顺序排序展开内容,需要的朋友可以参考一下
    2022-04-04
  • JavaWeb Maven详解相关配置

    JavaWeb Maven详解相关配置

    这篇文章主要介绍了使用maven架构管理开发的相关配置,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Java8 CompletableFuture详解

    Java8 CompletableFuture详解

    这篇文章主要介绍了Java8 CompletableFuture详解,CompletableFuture extends Future提供了方法,一元操作符和促进异步性以及事件驱动编程模型,需要的朋友可以参考下
    2014-06-06
  • Kotlin基础教程之dataclass,objectclass,use函数,类扩展,socket

    Kotlin基础教程之dataclass,objectclass,use函数,类扩展,socket

    这篇文章主要介绍了Kotlin基础教程之dataclass,objectclass,use函数,类扩展,socket的相关资料,需要的朋友可以参考下
    2017-05-05
  • SpringBoot如何将applicaton.properties中的数据绑定到bean中

    SpringBoot如何将applicaton.properties中的数据绑定到bean中

    SpringBoot中我们该如何将applicaton.properties中的数据绑定到bean中呢?在之间我们是可以通过@value注解,在SpringBoot自动启动后,会自动的去相应的路径中去寻找applicaton.properties配置文件,然后将相应的值赋值上,感兴趣的朋友一起看看吧
    2025-05-05

最新评论