1.使用場景
需求爲:前端傳的某個字段爲數組類型,但mysql中不支持直接存儲數組,只能轉爲字符串存儲,取出時又得轉回數組,這樣無論是在前端轉換還是後端轉換都是費時費力的。
這樣,我們可以利用mybatis的BaseTypeHandler類幫我們完成自動轉換。
第一步:
將對象裏的字段改爲JSONArray類型。
第二步:繼承BaseTypeHandler並重寫裏面的某些方法。
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
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;
/**
* @author wusong
*
* @description 用以mysql中varchar格式的字段,進行轉換的自定義轉換器,轉換爲實體類的JSONArray屬性
*/
@MappedTypes(JSONArray.class)
@MappedJdbcTypes(JdbcType.VARCHAR)
public class JsonTypeHandler extends BaseTypeHandler<JSONArray> {
/**
* 重寫設置參數
* @param ps
* @param i
* @param parameter
* @param jdbcType
* @throws SQLException
*/
@Override
public void setNonNullParameter(PreparedStatement ps, int i, JSONArray parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, String.valueOf(parameter.toJSONString()));
}
/**
* 根據列名,獲取可以爲空的結果
* @param rs
* @param columnName
* @return
* @throws SQLException
*/
@Override
public JSONArray getNullableResult(ResultSet rs, String columnName) throws SQLException {
String sqlJson = rs.getString(columnName);
if (null != sqlJson){
return JSONObject.parseArray(sqlJson);
}
return null;
}
/**
* 根據列索引,獲取可以爲空的結果
* @param rs
* @param columnIndex
* @return
* @throws SQLException
*/
@Override
public JSONArray getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
String sqlJson = rs.getString(columnIndex);
if (null != sqlJson){
return JSONObject.parseArray(sqlJson);
}
return null;
}
@Override
public JSONArray getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
String sqlJson = cs.getString(columnIndex);
if (null != sqlJson){
return JSONObject.parseArray(sqlJson);
}
return null;
}
}
第三步:mabatis的resultMap裏面映射的字段需要加上typeHandler="剛剛重寫的文件路徑"
第四步:insert和update語句裏面也需要加上typeHandler
這樣,前端用數組傳和接收,後端用字符串存儲,互不干擾,又可以愉快的玩耍啦!!!