mybatis自定义typeHandler处理postgresql数组类型

1、首先,自定义typeHandler

/**
 * Created by bo on 2019/1/6.
 * java mybatis映射postgresql 数组类型
 */
@MappedJdbcTypes(JdbcType.ARRAY)
@MappedTypes(String[].class)
public class ArrayTypeHandler extends BaseTypeHandler<Object[]> {
    private static final String TYPE_NAME_VARCHAR = "varchar";
    private static final String TYPE_NAME_INTEGER = "integer";
    private static final String TYPE_NAME_BOOLEAN = "boolean";
    private static final String TYPE_NAME_NUMERIC = "numeric";

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, Object[] parameter, JdbcType jdbcType) throws SQLException {
        String typeName = null;
        if (parameter instanceof Integer[]) {
            typeName = TYPE_NAME_INTEGER;
        } else if (parameter instanceof String[]) {
            typeName = TYPE_NAME_VARCHAR;
        } else if (parameter instanceof Boolean[]) {
            typeName = TYPE_NAME_BOOLEAN;
        } else if (parameter instanceof Double[]) {
            typeName = TYPE_NAME_NUMERIC;
        }

        if (typeName == null) {
            throw new TypeException("ArrayTypeHandler parameter typeName error, your type is " + parameter.getClass().getName());
        }

        // 这3行是关键的代码,创建Array,然后ps.setArray(i, array)就可以了
        Connection conn = ps.getConnection();
        Array array = conn.createArrayOf(typeName, parameter);
        ps.setArray(i, array);
    }

    @Override
    public Object[] getNullableResult(ResultSet resultSet, String s) throws SQLException {
        return getArray(resultSet.getArray(s));
    }

    @Override
    public Object[] getNullableResult(ResultSet resultSet, int i) throws SQLException {
        return getArray(resultSet.getArray(i));
    }

    @Override
    public Object[] getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
        return getArray(callableStatement.getArray(i));
    }

    private Object[] getArray(Array array) {
        if (array == null) {
            return null;
        }
        try {
            return (Object[]) array.getArray();
        } catch (Exception e) {
        }
        return null;
    }

}

2、使用mybatis generator生成实体类及mapper.xml文件时,显示执行postgresql数组字段对应的java属性类型为数组

<table tableName="product" domainObjectName="Product">
            <columnOverride column="tag" javaType="java.lang.String[]"/>
        </table>

3、在mapper.xml中显示数组字段指定处理类型typeHandler

<result property="tag" column="tag" typeHandler="com.iie.data.typehandler.ArrayTypeHandler"/>

4、第3不在resultMap中指定typeHandler只能在查询时生效,更新时,需要在对应的字段显示指定。

    <update id="updateProduct" parameterType="Product">
        update product set
        tag = #{product.tag,typeHandler = com.iie.data.typehandler.ArrayTypeHandler},  
        where id = #{product.id}
    </update>

 

### MyBatis 操作 PostgreSQL 数组类型 #### 插入数组数据 当向数据库插入数组类型的字段时,可以通过指定 `jdbcType` 和 `typeHandler` 来处理。对于 PostgreSQL数组类型,在 SQL 映射文件中应这样配置: ```xml <insert id="insertWithArray"> INSERT INTO table_name(array_column) VALUES (#{arrayParam, jdbcType=ARRAY}) </insert> ``` 这里假设有一个名为 `table_name` 的表,其中包含一个用于存储整数列表的列 `array_column`。为了确保正确传递 Java 集合给 PostgreSQL 数组,建议创建自定义 TypeHandler 类来完成此任务[^5]。 #### 创建自定义 TypeHandler 处理数组 如果默认的对象处理器不满足需求,则需编写自己的 TypeHandler 实现类。例如,针对字符串数组的情况: ```java public class StringArrayTypeHandler extends BaseTypeHandler<String[]> { @Override public void setNonNullParameter(PreparedStatement ps, int i, String[] parameter, JdbcType jdbcType) throws SQLException { Array array = ps.getConnection().createArrayOf("text", parameter); ps.setArray(i, array); } @Override public String[] getNullableResult(ResultSet rs, String columnName) throws SQLException { Array array = rs.getArray(columnName); if (array != null) { return (String[]) array.getArray(); } return null; } // ...其他重载的方法... } ``` 上述代码展示了如何通过 JDBC API 将 Java 字符串数组转换成适合 PostgreSQL 使用的形式,并能从结果集中提取相应的值[^3]。 #### 查询并映射数组至实体类 为了让查询出来的数组能够顺利映射回实体对象内,除了设置合适的 `resultMap` 之外,还需要保证所使用的 TypeHandler 正确无误。比如有这样一个 resultMap 定义: ```xml <resultMap id="BaseResultMap" type="com.example.EntityClass"> <!-- 假设 entity_class 中有个 stringList 属性对应着 db 表里的 text_array 列 --> <collection property="stringList" ofType="java.lang.String" column="text_array" javaType="java.util.List"/> </resultMap> <select id="selectEntityById" resultMap="BaseResultMap"> SELECT * FROM entity_table WHERE id=#{id}; </select> ``` 注意这里的 `<collection>` 标签用来表示一对多的关系或者是像本例这样的集合型属性;而 `ofType` 参数指明了集合元素的具体类型
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值