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も追加する必要があります
このように、フロントエンドは配列を使用して送受信し、バックエンドは文字列を使用して互いに干渉することなく保存し、楽しくプレイできます。!!