1、背景

对于实体类,属性标签类型是数组[“java”, “python”],在数据库对应的字段类型是varchar,现在需要存储到数据库, 将String数组转换成字符串,从数据库获取数据, 将字符串转为String数组

2、处理类

@MappedTypes({String[].class})
@MappedJdbcTypes({JdbcType.VARCHAR})
public class ArrayStringTypeHandler extends BaseTypeHandler<String[]> {

    private static String[] strArray = new String[]{};

    @Override
    public void setNonNullParameter(PreparedStatement preparedStatement, int parameterIndex,
                                    String[] parameter, JdbcType jdbcType) throws SQLException {
        preparedStatement.setString(parameterIndex, JSON.toJSONString(parameter));
    }

    @Override
    public String[] getNullableResult(ResultSet resultSet, String columnName)
            throws SQLException {
        return JSON.parseArray(resultSet.getString(columnName)).toArray(strArray);
    }

    @Override
    public String[] getNullableResult(ResultSet resultSet, int columnIndex)
            throws SQLException {
        return JSON.parseArray(resultSet.getString(columnIndex)).toArray(strArray);
    }

    @Override
    public String[] getNullableResult(CallableStatement callableStatement, int columnIndex)
            throws SQLException {
        return JSON.parseArray(callableStatement.getString(columnIndex)).toArray(strArray);
    }
}

3、使用

// 属性使用注解
@TableField(typeHandler = ArrayStringTypeHandler.class, jdbcType = JdbcType.VARCHAR)
private String[] labelList;

4、测试

更新
==>  Preparing: UPDATE subj_info SET label_list=? WHERE id=? 
==> Parameters: ["java","python"](String), 1690595443903389697(String)
<==    Updates: 1

查询
==>  Preparing: SELECT id, label_list FROM subj_info WHERE id=? 
==> Parameters: 1690595443903389697(String)
<==    Columns: id, label_list
<==        Row: 1690595443903389697, ["java","python"]
<==      Total: 1

数据库存储值
["java","python"]
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐