Springboot整合Mybatis使用TypeHandler轉換特殊數據類型


回顧一下,發現自己好久沒有寫文章了,今天我們來看一下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類型的插入和修改。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM