題記
如何把前臺的json存入數據庫並正常讀取困擾了我4,5個小時,最後終於想了方案,非常開心,所以寫給同樣苦惱的人看下,本來有了更好的記錄方式已經不準備寫博客了,但是解決了這個問題心情很好,而且網上寫的很多都是亂七八糟的,爲了不浪費更多人的時間
正文
數據庫---類型需爲json格式
family_list 類型爲json
實體---對象類型Object就行,萬能的,之前弄的List<Map<String,String>>折騰半天
/**
* 家庭信息
*/
@TableField("family_list")
private Object familyList;
實現----存入要轉成toJSONString,不然會報錯
entity.setFamilyList(JSONObject.toJSONString(dto.getFamilyList()));
XML---查出的數據一定要進行typeHandler,不然會報錯
<resultMap id="BaseResultMap" type="com.XXX">
<result property="familyList" column="family_list" typeHandler="com.XXX.JsonTypeHandler"/>
</resultMap>
附錄JsonTypeHandler
import com.alibaba.fastjson.JSON;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class JsonTypeHandler extends BaseTypeHandler<Object> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, Object parameter,
JdbcType jdbcType) throws SQLException {
ps.setString(i, JSON.toJSONString(parameter));
}
@Override
public Object getNullableResult(ResultSet rs, String columnName)
throws SQLException {
return JSON.parseObject(rs.getString(columnName), Object.class);
}
@Override
public Object getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return JSON.parseObject(rs.getString(columnIndex), Object.class);
}
@Override
public Object getNullableResult(CallableStatement cs, int columnIndex)
throws SQLException {
return JSON.parseObject(cs.getString(columnIndex), Object.class);
}
}
可以不看
另外一個坑,我沒解決掉所以用的這個方法,之前將前臺json轉成List<Map<String,String>>,是可以實現後來換了mybatis版本出問題了,map toString存入數據庫會有=,簡單的處理一下還行,複雜的List<Map<String,String>>有點不行,這種方法存入的沒有=,是:類型,json格式標準,處理方便