springboot+mybatis+mysql 存儲單字段爲數組格式的解決方案

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

 

這樣,前端用數組傳和接收,後端用字符串存儲,互不干擾,又可以愉快的玩耍啦!!!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章