當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
在 MyBatis 里,如何将 JSON 型字段到 Java 类的映射
生活随笔
收集整理的這篇文章主要介紹了
在 MyBatis 里,如何将 JSON 型字段到 Java 类的映射
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、簡介
我們在用MyBatis里,很多時間有這樣一個需求:POJO里有個屬性是非基本數據類型,在DB存儲時我們想存的是json格式的字符串,從DB拿出來時想直接映射成目標類型,也即json格式的字符串字段與Java類的相互類型轉換。
當然,你可以為每個類寫一個MyClassTypeHandler,但問題是要為每個類都寫一個TypeHandler,過于繁瑣。
有了泛型,一個通用的TypeHandler直接搞定。
二、源碼
package com.adu.spring_test.mybatis.typehandler;import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException;import org.apache.ibatis.type.BaseTypeHandler; import org.apache.ibatis.type.JdbcType; import org.codehaus.jackson.map.ObjectMapper; import org.codehaus.jackson.map.SerializationConfig.Feature; import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;/*** mapper里json型字段到類的映射。* 用法一:* 入庫:#{jsonDataField, typeHandler=com.adu.spring_test.mybatis.typehandler.JsonTypeHandler}* 出庫:* <resultMap>* <result property="jsonDataField" column="json_data_field" javaType="com.xxx.MyClass" typeHandler="com.adu.spring_test.mybatis.typehandler.JsonTypeHandler"/>* </resultMap>** 用法二:* 1)在mybatis-config.xml中指定handler:* <typeHandlers>* <typeHandler handler="com.adu.spring_test.mybatis.typehandler.JsonTypeHandler" javaType="com.xxx.MyClass"/>* </typeHandlers>* 2)在MyClassMapper.xml里直接select/update/insert。*** @author yunjie.du* @date 2016/5/31 19:33*/ public class JsonTypeHandler<T extends Object> extends BaseTypeHandler<T> {private static final ObjectMapper mapper = new ObjectMapper();private Class<T> clazz;public JsonTypeHandler(Class<T> clazz) {if (clazz == null) throw new IllegalArgumentException("Type argument cannot be null");this.clazz = clazz;}@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException {ps.setString(i, this.toJson(parameter));}@Overridepublic T getNullableResult(ResultSet rs, String columnName) throws SQLException {return this.toObject(rs.getString(columnName), clazz);}@Overridepublic T getNullableResult(ResultSet rs, int columnIndex) throws SQLException {return this.toObject(rs.getString(columnIndex), clazz);}@Overridepublic T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {return this.toObject(cs.getString(columnIndex), clazz);}private String toJson(T object) {try {return mapper.writeValueAsString(object);} catch (Exception e) {throw new RuntimeException(e);}}private T toObject(String content, Class<?> clazz) {if (content != null && !content.isEmpty()) {try {return (T) mapper.readValue(content, clazz);} catch (Exception e) {throw new RuntimeException(e);}} else {return null;}}static {mapper.configure(Feature.WRITE_NULL_MAP_VALUES, false);mapper.setSerializationInclusion(Inclusion.NON_NULL);} }三、QA
3.1 Q:Cause: java.lang.RuntimeException: Unable to find a usable constructor for class
A:mybatis版本過低,類型不能識別,造成通用typeHandler的構造函數構造失敗。之前用3.1.1時報過這個錯,后來改成3.2.3就沒問題了,現在用3.4.0也沒問題。貼上現在的配置吧:
<!-- mybatis --> <dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.0</version> </dependency> <dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.3.0</version> </dependency>?
總結
以上是生活随笔為你收集整理的在 MyBatis 里,如何将 JSON 型字段到 Java 类的映射的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: e.printStackTrace()不
- 下一篇: 互联网大厂算法面试题集合,看完我跪了!