MyBatis写入Json字段以及Json字段转对象示例详解
一、背景
最近在设计表结构的时候,根据需求,将一个字段的类型设计为Json字段,而对于还没有操作过数据库Json字段的我就有点懵了,之前从未遇到这种情况,所以也是一步步研究一步步踩坑,最后终于是把Json字段读取的坑都踩遍了,希望这篇文章可以帮助到大家,有问题留言
二、需求描述
本来打算贴表结构图的,奈何不知道为什么贴上来总是无法显示,所以就直接贴实体类结构吧需求是要直接将ParameterEntity
的limiting
属性写入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字段内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
使用@Service注解出现No bean named 'xxxx'&
这篇文章主要介绍了使用@Service注解出现No bean named 'xxxx' available]错误的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2023-08-08Java BeanUtils.copyProperties的详解
这篇文章主要介绍了Java BeanUtils.copyProperties的详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下2021-08-08spring mvc使用@InitBinder标签对表单数据绑定的方法
这篇文章主要介绍了spring mvc使用@InitBinder标签对表单数据绑定的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2018-03-03SpringBoot中分页插件PageHelper的使用详解
分页查询是为了高效展示大量数据,通过分页将数据划分为多个部分逐页展示,原生方法需手动计算数据起始行,而使用PageHelper插件则简化这一过程,本文给大家介绍SpringBoot中分页插件PageHelper的使用,感兴趣的朋友一起看看吧2024-09-09Spring Boot定制type Formatters实例详解
在本篇文章里小编给大家整理的是关于Spring Boot定制type Formatters实例知识点,需要的朋友们学习下。2019-11-11
最新评论