字符串属性转变List属性存入数据库

项目中有系统IP字段,现将string转List存入数据库,每个功能块持久层实现方法不一样(分为jpa和mp)

jpa:

复制代码
 @Convert(converter = JpaConverterListJson.class)
    private List<String> hostIp;

public class JpaConverterListJson implements AttributeConverter<Object, String> {
    @Override
    public String convertToDatabaseColumn(Object o) {
        return JSON.toJSONString(o);
    }

    @Override
    public Object convertToEntityAttribute(String s) {
        //兼容历史数据
        if (!JSONUtil.isJson(s)) {
            return new JSONArray(Arrays.asList(s));
        }
        return JSON.parseArray(s);
    }
复制代码

 ps:貌似@Lob也可以直接保存,没试过

 

mp:

复制代码
@TableField(typeHandler = ArrayTypeHandler.class)
private List<String> hostIp;

@MappedTypes(List.class)
@MappedJdbcTypes(JdbcType.VARCHAR)
public class ArrayTypeHandler extends BaseTypeHandler<List> {

@Override
public void setNonNullParameter(PreparedStatement preparedStatement, int i, List list, JdbcType jdbcType) throws SQLException {
preparedStatement.setString(i, JSON.toJSONString(list));
}

@Override
public List getNullableResult(ResultSet resultSet, String s) throws SQLException {
//兼容历史数据
if (!JSONUtil.isJson(resultSet.getString(s))) {
return new JSONArray(Arrays.asList(resultSet.getString(s)));
}
return JSON.parseArray(resultSet.getString(s));
    }

@Override
public List getNullableResult(ResultSet resultSet, int i) throws SQLException {
JSONArray jsonArray = JSONArray.parseArray(resultSet.getString(i));
return jsonArray;
}

@Override
public List getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
JSONArray jsonArray = JSONArray.parseArray(callableStatement.getString(i));
return jsonArray;
}
//单这样查询获取不到,mp查询跟增改使用的ResultMap是不同的 //注解的typeHandler只生效于insert和update,要生效select必须@TableName(autoResultMap=true)
//但在自定义查询中添加了autoResultMap也没有用,还要在配置里加上map,查询结果指向它
<resultMap id="BaseResultMap" type="com.jk.cmdb.setting.entity.CmdbPc">
<result column="host_ip" property="hostIp"
typeHandler="com.jk.moinc.framework.ArrayTypeHandler"/>
</resultMap>
复制代码

 

https://www.jianshu.com/p/1fbaff7fb187

https://github.com/baomidou/mybatis-plus/issues/357

 

jpa:

https://greenhtml.com/archives/153.html

https://blog.csdn.net/losfog/article/details/88046161

 

ps:如果是自定义的数组字段,是无法直接存入数据库也无法通过上述方式,那么存储转json字符串,取出转jsonArray

posted @   edda_huang  阅读(676)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示