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)