回顧一下,發現自己好久沒有寫文章了,今天我們來看一下Springboot整合Mybatis使用TypeHandler轉換特殊數據類型怎么做
在項目實踐中,我發現,在使用postgre數據庫時,有兩個特殊的數據類型“UUID”和“jsonb”類型,這里我使用實體映射jar是:
<dependency> <groupId>tk.mybatis</groupId> <artifactId>mapper-spring-boot-starter</artifactId> <version>2.1.5</version> </dependency>
使用這個框架方便之處在於,在我們使用代碼生成器的時候,不用寫簡單的crud,但是每每碰到“UUID”和“jsonb”類型就搞不定了。
首先,我們來看一下 “UUID”類型,這種類型的相對而言好處理一點,就是把接收和查詢的對應uuid的類型的數據映射成uuid類型,就可以成功的做查詢,修改,但是“jsonb”類型就沒有那么簡單了。
這里就需要用到TypeHandler,通常我們會寫一個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.apache.ibatis.type.MappedTypes; import org.postgresql.util.PGobject; import com.slife.pdfg.common.util.JSONUtils; @MappedTypes({Object.class}) public class JsonbTypeHandler extends BaseTypeHandler<Object> { private static final PGobject jsonObject = new PGobject(); @Override public void setNonNullParameter(PreparedStatement preparedStatement, int i, Object o, JdbcType jdbcType) throws SQLException { jsonObject.setType("jsonb"); jsonObject.setValue(JSONUtils.beanToJson(o)); preparedStatement.setObject(i, jsonObject); } @Override public Object getNullableResult(ResultSet resultSet, String s) throws SQLException { if (null != resultSet.getString(s)) { return JSONUtils.jsonToBean(resultSet.getString(s),Object.class); } return null; } @Override public Object getNullableResult(ResultSet resultSet, int i) throws SQLException { if (null != resultSet.getString(i)) { return JSONUtils.jsonToBean(resultSet.getString(i),Object.class); } return null; } @Override public Object getNullableResult(CallableStatement callableStatement, int i) throws SQLException { if (null != callableStatement.getString(i)) { return JSONUtils.jsonToBean(callableStatement.getString(i),Object.class); } return null; } }
這里使用它有兩種方式
第一種:直接在配置里邊加配置
mybatis: mapper-locations: classpath:/mapper/**/*.xml type-aliases-package: com.ess.**.pojo # model的包 type-handlers-package: com.common.config 添加該配置時,查詢對象胡數據會被轉換為jsonb
在配置的yml文件里邊加上述配置 :type-handlers-package,包路徑寫上述JsonbTypeHandler的包路徑地址就好,但是這種形式有一個弊端,就是會把我們所有的list類型的查詢條件給轉換成,jsonb對象,造成使用不方便。所以我選擇了第二種方式。
第二種方式:如下
我們在映射實體類的時候,如果是jsonb類型在xml里邊
<resultMap id="BaseResultMap" type="com.pojo.Demo"> <id column="guid" property="guid" jdbcType="VARCHAR" /> <result column="dtag" property="dtag" jdbcType="OTHER" typeHandler="com.common.config.JsonbTypeHandler" /> </resultMap>
上述是實體映射的部分,接下來看一下插入如何做
#{dtag,jdbcType=VARCHAR,typeHandler=com.common.config.JsonbTypeHandler}
好了,寫道這里,我們就解決了jsonb類型的插入和修改。