实体类使用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);
}
posted @ 2022-05-26 18:18  .Blank  阅读(545)  评论(0编辑  收藏  举报