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
这样,前端用数组传和接收,后端用字符串存储,互不干扰,又可以愉快的玩耍啦!!!