Postgresql使用数组及Mybatis自定义Postgresql数组类型映射

创建

CREATE TABLE faviroute_book (
id serial primary key,
student_names TEXT[]
)

在普通类型后面加 [] 即可

插入

-- 方式一 使用{}
insert into student(student_names) values ('{阿离,小奏}')
-- 方式二  使用 array
insert into student(student_names) VALUES (array['韩信','关羽','张飞'])

查询

select * from student
select student_names[2] from student

在这里插入图片描述
在这里插入图片描述

删除

delete from student where student_names[3] = '张飞'
delete from  student where id = 3

更新

在这里插入图片描述

update student set student_names[1] = '阿离' where  id = 1

在这里插入图片描述

update student  set student_names[3] = '李白' where  id = 1

在这里插入图片描述

Mybatis中的使用

第一种更新操作比较容易, 自己拼接下标

 update student
        set student_names[#{index}] = #{name}
        where
        id= #{id}

第二种自定义数组类型

创建 ArrayTypeHandler

@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;
    }

}

ps: 在mybatis 配置中添加配置
mybatis.type-handlers-package=com.zou.infr.config
则可以在使用时不用指定typeHandler

使用

  • 查询
<resultMap id="BaseResultMap" type="com.zou.order.model.Student">
        <result column="student_names" typeHandler="com.zou.drug.config.ArrayTypeHandler"  property="studentNames"/>
    </resultMap>

<select id="getConfig" resultMap="BaseResultMap">
        select * from student
</select>
  • 更新
List<Student> updateNames(@Param("id") Integer id,@Param("names") Integer... names);
<update id="updateNames">
        update student
        set student_names= #{names,typeHandler = com.zou.drug.config.ArrayTypeHandler}
        where
        id= #{id}
    </update>
  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PostgreSQL是一种开源的关系性数据库管理系统,支持大量的数据类型和高级功能。而MyBatis是一个优秀的基于Java的持久层框架,可以将应用程序中的Java对象映射到关系数据库中。 在使用MyBatis进行 PostgreSQL 批量插入时,可以使用批处理技术来提高插入效率。具体做法是首先使用 MyBatis 的批量插入功能进行插入数据,然后再调用 PostgreSQL 中的 COPY 命令将数据批量导入数据库。 首先,在MyBatis的 Mapper.xml 文件中,我们需要定义批量插入的 SQL 语句。SQL 语句中使用foreach标签来循环插入所有数据行。具体参数可以根据需要进行调整,样例如下: ``` <insert id="batchInsert"> INSERT INTO table_name (column1, column2, ...) VALUES <foreach collection="list" item="item" separator=","> (#{item.column1}, #{item.column2}, ...) </foreach> </insert> ``` 然后,在 Java 代码中调用批量插入功能。具体代码如下: ``` SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, false); try { Mapper mapper = sqlSession.getMapper(Mapper.class); for (Data data : dataList) { mapper.insert(data); } sqlSession.commit(); } finally { sqlSession.close(); } ``` 最后使用 COPY 命令进行批量导入数据。指定文件路径和分隔符,将数据文件中的内容导入到数据库中。具体代码如下: ``` COPY table_name FROM '/path/to/data.csv' WITH (FORMAT csv, DELIMITER ',', HEADER false); ``` 通过这种方式,可以有效地实现 PostgreSQL 批量插入 MyBatis 数据。同时也可以提高数据处理效率,降低系统负担。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值