Solución para springboot + mybatis + mysql para almacenar un solo campo en formato de matriz

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! ! !

 

Supongo que te gusta

Origin blog.csdn.net/qq_36961530/article/details/100117375
Recomendado
Clasificación