typehandle处理list集合

使用mybatis-plus很多时候我们实体类属性String是一个集合,比如数据库存地址希望存入 湖南省,邵阳市,xx县镇以,分割开,
直接上代码

public class positionInfo implements Serializable {

    private static final long serialVersionUID = 1L;
    @TableId(type= IdType.AUTO)
    private Long id;

    @ApiModelProperty(value = "职级")
    @TableField("`rank`")
    private String rank;

    @ApiModelProperty(value = "星级")
    private String starLevel;

    @ApiModelProperty(value = "工作地点")
    private List<String> workAddress;
    }

workAddress是一个集合属性如果直接使用list映射会报如下错误
Type handler was null on parameter mapping for property ‘specPrices’. It was either not specified and/or could not be found for the javaType (java.util.List) : jdbcType (null) combination.
解决方案
使用TypeHandler自定义类型转换器 可以以,分割直接也可以改成/分割

/**
 * @author: xxxx
 * @date: 2021/11/04 15:24
 * @description: 类型转换器,用于数据库的varchar和Java中List<String>类型的相互转换
 */
@MappedJdbcTypes(JdbcType.VARCHAR)
@MappedTypes(List.class)
public class StringListTypeHandler implements TypeHandler<List<String>> {
    @Override
    public void setParameter(PreparedStatement preparedStatement, int i, List<String> strings, JdbcType jdbcType) throws SQLException {
        // 遍历List类型的入参,拼装为String类型,使用Statement对象插入数据库
        StringBuffer sb = new StringBuffer();
        for (int j = 0; j < strings.size(); j++) {
            if (j == strings.size() - 1) {
                sb.append(strings.get(j));
            } else {
                sb.append(strings.get(j)).append(",");
            }
        }
        preparedStatement.setString(i, sb.toString());
    }

    @Override
    public List<String> getResult(ResultSet resultSet, String s) throws SQLException {
        // 获取String类型的结果,使用","分割为List后返回
        String resultString = resultSet.getString(s);
        if (StringUtils.isNotEmpty(resultString)) {
            return Arrays.asList(resultString.split(","));
        }
        return null;
    }

    @Override
    public List<String> getResult(ResultSet resultSet, int i) throws SQLException {
        // 获取String类型的结果,使用","分割为List后返回
        String resultString = resultSet.getString(i);
        if (StringUtils.isNotEmpty(resultString)) {
            return Arrays.asList(resultString.split(","));
        }
        return null;
    }

    @Override
    public List<String> getResult(CallableStatement callableStatement, int i) throws SQLException {
        // 获取String类型的结果,使用","分割为List后返回
        String resultString = callableStatement.getString(i);
        if (StringUtils.isNotEmpty(resultString)) {
            return Arrays.asList(resultString.split(","));
        }
        return null;
    }
}
别忘记属性也要加上注解   @TableField(typeHandler = StringListTypeHandler.class)
这样就行了吗?还不行
由于mybatis-plus新增或者查询用的是两套映射,查询时workAddress是为null
需要再实体类在加上注解
@TableName(value = "对应的表名",autoResultMap = true)
大功告成

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你想使用 TypeHandler 来解决这个问题,你需要实现自定义的 TypeHandler 类来处理 jsonb 类型和数组类型。 首先,你需要实现一个 TypeHandler处理 jsonb 类型。以下是一个简单的实现示例: ```java import java.sql.*; import com.alibaba.fastjson.JSONObject; import org.apache.ibatis.type.*; @MappedTypes(JSONObject.class) @MappedJdbcTypes(JdbcType.OTHER) public class JsonTypeHandler implements TypeHandler<JSONObject> { @Override public void setParameter(PreparedStatement ps, int i, JSONObject parameter, JdbcType jdbcType) throws SQLException { ps.setObject(i, parameter, Types.OTHER); } @Override public JSONObject getResult(ResultSet rs, String columnName) throws SQLException { return JSONObject.parseObject(rs.getString(columnName)); } @Override public JSONObject getResult(ResultSet rs, int columnIndex) throws SQLException { return JSONObject.parseObject(rs.getString(columnIndex)); } @Override public JSONObject getResult(CallableStatement cs, int columnIndex) throws SQLException { return JSONObject.parseObject(cs.getString(columnIndex)); } } ``` 在上面的示例中,我们实现了一个 TypeHandler处理 JSONObject 类型。在 setParameter 方法中,我们将 JSONObject 对象作为一个 Object 对象设置到 PreparedStatement 中。在 getResult 方法中,我们使用 ResultSet 或 CallableStatement 获取字符串类型的 jsonb 数据,并将其转换为 JSONObject 对象。 接下来,你需要实现一个 TypeHandler处理数组类型。以下是一个简单的实现示例: ```java import java.sql.*; import org.apache.ibatis.type.*; @MappedTypes(Integer[].class) @MappedJdbcTypes(JdbcType.ARRAY) public class ArrayTypeHandler implements TypeHandler<Integer[]> { @Override public void setParameter(PreparedStatement ps, int i, Integer[] parameter, JdbcType jdbcType) throws SQLException { Connection connection = ps.getConnection(); Integer[] array = parameter; Array sqlArray = connection.createArrayOf("integer", array); ps.setArray(i, sqlArray); } @Override public Integer[] getResult(ResultSet rs, String columnName) throws SQLException { Array array = rs.getArray(columnName); if (array != null) { return (Integer[]) array.getArray(); } return null; } @Override public Integer[] getResult(ResultSet rs, int columnIndex) throws SQLException { Array array = rs.getArray(columnIndex); if (array != null) { return (Integer[]) array.getArray(); } return null; } @Override public Integer[] getResult(CallableStatement cs, int columnIndex) throws SQLException { Array array = cs.getArray(columnIndex); if (array != null) { return (Integer[]) array.getArray(); } return null; } } ``` 在上面的示例中,我们实现了一个 TypeHandler处理 Integer[] 类型。在 setParameter 方法中,我们使用 Connection.createArrayOf 方法将 Integer[] 数组转换为 PostgreSQL 中的数组类型,并将其设置到 PreparedStatement 中。在 getResult 方法中,我们使用 ResultSet 或 CallableStatement 获取数组类型的数据,并将其转换为 Integer[] 数组。 最后,你需要在 mybatis-config.xml 文件中注册这些 TypeHandler。以下是一个简单的示例: ```xml <typeHandlers> <typeHandler handler="com.example.JsonTypeHandler"/> <typeHandler handler="com.example.ArrayTypeHandler"/> </typeHandlers> ``` 在上面的示例中,我们将自定义的 JsonTypeHandler 和 ArrayTypeHandler 注册到了 mybatis-config.xml 文件中。 完成上述步骤后,你就可以在 DAO 层中使用以下方法将值保存到表中了: ```java @Insert("INSERT INTO push_control(type, content, unreceived_devices, creator_id) VALUES(#{type}, #{content}, #{deviceIds}, 1) RETURNING id") @Options(useGeneratedKeys = true, keyProperty = "id") Integer savePushCtrl(@Param("type") Integer type, @Param("content") JSONObject content, @Param("deviceIds") Integer[] deviceIds); ``` 在上面的方法中,我们不需要进行任何类型转换操作,因为我们已经在 TypeHandler 中定义了如何将 JSONObject 和 Integer[] 类型转换为 PostgreSQL 中的数据类型。 希望这个回答能够帮助到你。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值