1. Escenario de uso
El requisito es: un campo pasado por el front-end es un tipo de matriz, pero mysql no admite el almacenamiento directo de matrices, solo se puede convertir en almacenamiento de cadenas y, cuando se extrae, debe volver a convertirse en una matriz, por lo que ya sea que se convierta en el front-end o en el back-end. Consume mucho tiempo y es laborioso.
De esta forma, podemos usar la clase BaseTypeHandler de mybatis para ayudarnos a completar la conversión automática.
primer paso:
Cambie el campo del objeto al tipo JSONArray.
Paso 2: hereda BaseTypeHandler y reescribe algunos métodos en su interior.
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;
}
}
Paso 3: Los campos mapeados en el resultMap de mabatis deben agregar typeHandler = "la ruta del archivo recién reescrita"
Paso 4: TypeHandler también debe agregarse para insertar y actualizar declaraciones
De esta manera, el front-end usa una matriz para transmitir y recibir, y el back-end usa una cadena para almacenar, sin interferir entre sí, ¡y puedes jugar felizmente! ! !