1. 程式人生 > 其它 >實體類使用JSONObject型別的屬性,如何轉成varchar型別儲存到資料庫

實體類使用JSONObject型別的屬性,如何轉成varchar型別儲存到資料庫

實體類使用JSONObject型別的屬性,如何轉成varchar型別儲存到資料庫

1. 實現TypeHandler介面

package com.springboot.sys.handler;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;
import org.apache.ibatis.type.TypeHandler;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

@MappedJdbcTypes(JdbcType.VARCHAR)
@MappedTypes(JSONObject.class)
public class JSONObjectToVarcharTypeHandler implements TypeHandler<JSONObject> {

    @Override
    public void setParameter(PreparedStatement preparedStatement, int i, JSONObject jsonObject, JdbcType jdbcType) throws SQLException {
        // 遍歷JSONObject型別的入參,拼接為String型別,使用Statement物件插入資料庫
        preparedStatement.setString(i, jsonObject.toJSONString());
    }

    @Override
    public JSONObject getResult(ResultSet resultSet, String s) throws SQLException {
        // 獲取String型別的結果,將String型別轉成JSONObject型別後返回
        String jsonStr = resultSet.getString(s);
        if (StringUtils.isNotBlank(jsonStr)) {
            return JSON.parseObject(jsonStr);
        }
        return null;
    }

    @Override
    public JSONObject getResult(ResultSet resultSet, int i) throws SQLException {
        // 獲取String型別的結果,將String型別轉成JSONObject型別後返回
        String jsonStr = resultSet.getString(i);
        if (StringUtils.isNotBlank(jsonStr)) {
            return JSON.parseObject(jsonStr);
        }
        return null;
    }

    @Override
    public JSONObject getResult(CallableStatement callableStatement, int i) throws SQLException {
        // 獲取String型別的結果,將String型別轉成JSONObject型別後返回
        String jsonStr = callableStatement.getString(i);
        if (StringUtils.isNotBlank(jsonStr)) {
            return JSON.parseObject(jsonStr);
        }
        return null;
    }
}

2. 修改xml檔案

<!-- 將jdbcType替換為typeHandler -->
<result column="address" property="address" typeHandler="com.springboot.sys.handler.JSONObjectToVarcharTypeHandler" />
<!--之後的sql語句中所有出現的jdbcType同理-->

注:xml檔案是使用mybatis逆向工程生成的

補充JSONObject的遍歷

1. forEach

jsonObject.forEach((key, value) -> {
});

2. entrySet()

for (Map.Entry<String, Object> entry : jsonObject.entrySet()) {
    String key = entry.getKey();
    Object value = entry.getValue();
}

3. 迭代器

Iterator<String> it = jsonObject.keys();
while(it.hasNext()){
    String key = it.next();
    String value = jsonObject.getString(key);
}