1. 程式人生 > >Springboot整合Mybatis使用TypeHandler來轉換資料庫中的資料

Springboot整合Mybatis使用TypeHandler來轉換資料庫中的資料

TypeHandler轉換指定資料庫中資料為Enum列舉

  在一些時候,我們的資料庫需要存放一些例如狀態資訊的資料,通常的我們使用int整型來儲存,例如(0:失敗,1:成功)等,用這樣的資料是可以的,但對於前端的程式設計是不友好的,所以我們可以使用TypeHandler來進行一個轉換,將其轉化成一個列舉型。

  一、資料庫中的資料定義

    這裡的user_state和user_priority表示了一些狀態資訊(範圍是整數0~5),接下來我們要將這個轉化為列舉型

    

  二、建立列舉Enum類

    以User_state為例:

package com.snapshot2.demo.enumeration;

public enum UserStateEnum { NORMAL(0,"正常狀態"), FROZEN(1,"凍結"), BAN(2,"禁用"), MUTE(3,"禁言"), SENSITIVE(4,"敏感使用者"), DYF(5,"這是創作者董一帆的"); private int stateCode; private String stateString; public static UserStateEnum getUserStateByCode(int stateCode){ for (UserStateEnum stateEnum: values()){
if(stateEnum.getStateCode() == stateCode){ return stateEnum; } } return null; } /* Constructor */ UserStateEnum(int stateCode, String stateString) { this.stateCode = stateCode; this.stateString = stateString; } /* Getter and Setter
*/ public int getStateCode() { return stateCode; } public void setStateCode(int stateCode) { this.stateCode = stateCode; } public String getStateString() { return stateString; } public void setStateString(String stateString) { this.stateString = stateString; } }

  

  三、建立相應得TypeHandler類,繼承於BaseTypeHandler<T>類,並重寫相應得方法

   1.這裡的<T>是我們指定轉化的型別

   [email protected]註解宣告資料庫中對應資料型別

   [email protected](value = UserStateEnum.class)宣告轉化後的型別

package com.snapshot2.demo.typehandler;

import com.snapshot2.demo.enumeration.UserStateEnum;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/* 資料庫中的資料型別 */
@MappedJdbcTypes(JdbcType.INTEGER)

/* 轉化後的資料型別 */
@MappedTypes(value = UserStateEnum.class)
public class UserStateTypeHandler extends BaseTypeHandler<UserStateEnum> {
    @Override
    public void setNonNullParameter(PreparedStatement preparedStatement, int i, UserStateEnum userStateEnum, JdbcType jdbcType) throws SQLException {
        preparedStatement.setInt(i,userStateEnum.getStateCode());
    }

    @Override
    public UserStateEnum getNullableResult(ResultSet resultSet, String s) throws SQLException {
        int code =resultSet.getInt(s);
        if(code>=0&&code<=5){
            return UserStateEnum.getUserStateByCode(code);
        }
        return null;
    }

    @Override
    public UserStateEnum getNullableResult(ResultSet resultSet, int i) throws SQLException {
        int code = resultSet.getInt(i);
        if(code>=0&&code<=5){
            return UserStateEnum.getUserStateByCode(code);
        }
        return null;
    }

    @Override
    public UserStateEnum getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
        int code = callableStatement.getInt(i);
        if(code>=0&&code<=5){
            return UserStateEnum.getUserStateByCode(code);
        }
        return null;
    }
}

  四、最後在application.properties配置檔案中springboot指定TypeHandler所在的包

mybatis.type-handlers-package=com.snapshot2.demo.typehandler