MyBatis寫入Json字段以及Json字段轉(zhuǎn)對象示例詳解
一、背景
最近在設(shè)計表結(jié)構(gòu)的時候,根據(jù)需求,將一個字段的類型設(shè)計為Json字段,而對于還沒有操作過數(shù)據(jù)庫Json字段的我就有點懵了,之前從未遇到這種情況,所以也是一步步研究一步步踩坑,最后終于是把Json字段讀取的坑都踩遍了,希望這篇文章可以幫助到大家,有問題留言
二、需求描述
本來打算貼表結(jié)構(gòu)圖的,奈何不知道為什么貼上來總是無法顯示,所以就直接貼實體類結(jié)構(gòu)吧需求是要直接將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; // 這個字段就對應(yīng)表中的json字段 private ParameterLimiting limiting; }
三、準(zhǔn)備環(huán)境
這里我使用的是pg
數(shù)據(jù)庫,如下是pg
庫的配置
特別注意!?。?/strong>
–jdbcUrl
中的tringtype=unspecified
一定要加,否則會報一個寫入類型不匹配的錯誤,其他數(shù)據(jù)庫可能也需要指定tringtype
,這里就暫時不做研究
datasource: pgsql: jdbcUrl: jdbc:postgresql://ip:5432/ams?rewriteBatchedStatements=true&stringtype=unspecified username: password: driver-class-name: org.postgresql.Driver
四、Json字段數(shù)據(jù)的寫入
核心:字符串轉(zhuǎn)Json的控制類
1. 定義對象轉(zhuǎn)Json的控制類
// 這里對應(yīng)表中字段的類型 @MappedJdbcTypes(JdbcType.OTHER) // 這里對應(yīng)實體類的類型 @MappedTypes(ParameterLimiting.class) public class ParameterLimitingToJsonHandler extends BaseTypeHandler<ParameterLimiting> { @Override public void setNonNullParameter(PreparedStatement preparedStatement, int i, ParameterLimiting parameterLimiting, JdbcType jdbcType) throws SQLException { // 做寫入操作時將對象轉(zhuǎn)成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 也就是我們剛寫的對象轉(zhuǎn)Json的控制類 --> #{limiting,jdbcType=OTHER,typeHandler=com.inventec.dm.config.ParameterLimitingToJsonHandler}); </insert>
到這里對象寫入json字段就告一段落了
五、Json字段轉(zhuǎn)對象
核心:實體類的有參構(gòu)造
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還是上邊的轉(zhuǎn)換控制類 --> <result property="limiting" column="limiting" jdbcType="OTHER" javaType="com.inventec.dm.entity.parameter.ParameterLimiting" typeHandler="com.inventec.dm.config.ParameterLimitingToJsonHandler"/> </resultMap>
2. 構(gòu)造函數(shù)
@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; // 這個實體類中不能有無參構(gòu)造,否則在映射json字段時不執(zhí)行有參構(gòu)造 // 注意這里最后的一個參數(shù)是 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); } } }
注意:
- 這個實體類中不能有無參構(gòu)造,否則在映射json字段時不執(zhí)行有參構(gòu)造,也就是說無法轉(zhuǎn)換對象!切記?。?!
- 注意這里最后的一個參數(shù) Object limiting,定義為Object類型也是為了使其可以接收表中json字的值同時也符合有參構(gòu)造參數(shù)的類型(也就是說如果把Object改為String的話編譯會報錯)
到這里Json字段的寫入和讀取就大工告成了
六、最后
到此這篇關(guān)于MyBatis寫入Json字段以及Json字段轉(zhuǎn)對象的文章就介紹到這了,更多相關(guān)MyBatis寫入Json字段內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java環(huán)境中MyBatis與Spring或Spring MVC框架的集成方法
和MyBatis類似,Spring或者Spring MVC框架在Web應(yīng)用程序的運作中同樣主要負(fù)責(zé)處理數(shù)據(jù)庫事務(wù),這里我們就來看一下Java環(huán)境中MyBatis與Spring或Spring MVC框架的集成方法2016-06-06Java實現(xiàn)京東聯(lián)盟API數(shù)據(jù)獲取功能
這篇文章介紹了Java獲取京東聯(lián)盟API數(shù)據(jù)的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-07-07詳解Java中static關(guān)鍵字和內(nèi)部類的使用
這篇文章主要為大家詳細(xì)介紹了Java中static關(guān)鍵字和內(nèi)部類的使用,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-08-08使用Mybatis-plus實現(xiàn)時間自動填充(代碼直接可用)
這篇文章主要介紹了使用Mybatis-plus實現(xiàn)時間自動填充(代碼直接可用),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06擴展Hibernate使用自定義數(shù)據(jù)庫連接池的方法
這篇文章主要介紹了擴展Hibernate使用自定義數(shù)據(jù)庫連接池的方法,涉及Hibernate數(shù)據(jù)庫操作擴展的相關(guān)技巧,需要的朋友可以參考下2016-03-03linux中nohup?java?-jar啟動java項目的步驟
nohup是一個Unix和Linux命令,用于運行關(guān)閉時不會被終止的進(jìn)程,這篇文章主要給大家介紹了關(guān)于linux中nohup?java?-jar啟動java項目的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-08-08