MyBatis Plus 自動類型轉換之TypeHandler


MyBatis Plus 自動類型轉換之TypeHandler

  • 數據庫表里有ids字段,存放的都是主鍵id,逗號分隔。
  • model里面是Set集合裝Integer類型的 ids
  • 用MyBatis的TypeHandler做自動類型轉換

分三步:

  • 1.實體類需要加個注解
@TableName(autoResultMap = true)
  • 2.對應對象的屬性也需要加注解
@TableField(typeHandler = SetTypeHandler.class)
  • 3.繼承BaseTypeHandler實現其方法
@MappedTypes(Set.class)
@MappedJdbcTypes(JdbcType.VARCHAR)
public class SetTypeHandler extends BaseTypeHandler<Set> {

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, Set parameter, JdbcType jdbcType)
            throws SQLException {
        String param = parameter.toString().replaceAll("\\[|\\]| ", "");
        ps.setString(i, param);
    }

    @Override
    public Set<Integer> getNullableResult(ResultSet rs, String columnName)
            throws SQLException {
        String sqlSet = rs.getString(columnName);
        return getSet(sqlSet);
    }

    @Override
    public Set<Integer> getNullableResult(ResultSet rs, int columnIndex)
            throws SQLException {
        String sqlSet = rs.getString(columnIndex);
        return getSet(sqlSet);
    }

    @Override
    public Set<Integer> getNullableResult(CallableStatement cs, int columnIndex)
            throws SQLException {
        String sqlSet = cs.getString(columnIndex);
        return getSet(sqlSet);
    }

    private Set<Integer> getSet(String sqlSet) {
        if (StringUtils.isNotBlank(sqlSet)) {
            return Arrays.asList(sqlSet.split(",")).stream()
                    .map(Integer::parseInt)
                    .collect(Collectors.toSet());
        }
        return new HashSet();
    }
}

解釋以上代碼:

  • 實體類要轉換的類型:Set
@MappedTypes(Set.class)
  • 對應數據庫表的字段類型:varchar
@MappedJdbcTypes(JdbcType.VARCHAR)
  • 參數set,用來給參數PreparedStatement對象對應的列設置參數,預編譯SQL語句,在SQL語句執行之前改變語句。先去掉Set的“[]”就變成了類似“ 1,2,3,4”,然后替換進SQL語句,這是完成了Set到varchar的轉換。
public void setNonNullParameter(PreparedStatement ps, int i, Set parameter, JdbcType jdbcType)
  • 兩個大方向get,從ResultSet和CallableStatement獲取對應列的值,不同之處是一個是取第幾個位置的值,一個是取具體列名所對應的值。
public Set<Integer> getNullableResult(ResultSet rs, String columnName)
public Set<Integer> getNullableResult(ResultSet rs, int columnIndex)

上面兩個方法是從ResultSet獲取值,一個是通過列名,一個是第幾個位置

public Set<Integer> getNullableResult(CallableStatement cs, int columnIndex)


免責聲明!

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



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