实体类使用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);
}