単一のフィールドを配列形式で保存するためのspringboot + mybatis + mysqlのソリューション

1.使用シナリオ

要件は次のとおりです。フロントエンドから渡されるフィールドは配列型ですが、mysqlは配列の直接ストレージをサポートしておらず、文字列ストレージにのみ変換できます。また、取り出したときに配列に戻す必要があるため、フロントエンドで変換するかバックエンドで変換するか。時間と手間がかかります。

このようにして、mybatisのBaseTypeHandlerクラスを使用して、自動変換を完了することができます。

最初の一歩:

オブジェクトのフィールドをJSONArrayタイプに変更します。

ステップ2: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;
    }
}

ステップ3:mabatisのresultMapにマップされたフィールドは、typeHandler = "書き直されたばかりのファイルパス"を追加する必要があります

ステップ4:ステートメントを挿入および更新するには、TypeHandlerも追加する必要があります

 

このように、フロントエンドは配列を使用して送受信し、バックエンドは文字列を使用して互いに干渉することなく保存し、楽しくプレイできます。

 

おすすめ

転載: blog.csdn.net/qq_36961530/article/details/100117375