postgresql 批量插入的一种报错解决方案

标题上来先展示异常信息## 标题

java.sql.BatchUpdateException: 批次处理 0 Insert INTO bj_lianjia (id,url,timeinfo,region,totalprice,housetype,housearea,unitprice,direction,decoration,elevator,houseinfo,attention,visited,utime) VALUES (‘2587’,‘小张’,‘2018-05-06 +08:00:00’,‘富力城B区’,‘1880.0’,‘2室1厅’,‘187.00999450683594’,‘100530.0’,NULL,‘精装’,‘1’,‘4室2厅,187.01平米,南北,精装,有电梯’,‘19’,‘29’,‘2020-08-01 05:38:02.000000 +08:00:00’) 被中止,呼叫 getNextException 以取得原因。
at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2743)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1928)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:405)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2892)
at com.casic304.dataexplorer.connection.core.jdbc.rdbmswriter.RdbmsWriter.doBatchInsert(RdbmsWriter.java:162)
at com.casic304.dataexplorer.connection.core.jdbc.rdbmswriter.RdbmsWriter.startWrite(RdbmsWriter.java:100)
at com.casic304.dataexplorer.connection.postgresql.PostgresqlWriter.startWrite(PostgresqlWriter.java:50)
at com.casic304.dataexchanger.core.task.runer.WriterRunner.run(WriterRunner.java:43)
at java.lang.Thread.run(Thread.java:748)

最近做国产化适配,小组开发了一款数据交换工具,当设计到postgresql的时候,从postgresql中读取没事,但是从别的数据库做批量插入操作的时候,会报上边的异常信息。
后发现,postgresql的批量插入与(oracle ,mysql,达梦,sqlserver)不太一样 ,
eg:在其他四种(oracle ,mysql,达梦,sqlserver)做批量插入 的sql 只用如下书写
String sql=insert into tableName(你自己的表名称)(column1,column2,…)values(?,?,…)
占位符只需要用?占位就可以了。
但是postgresql他不 ,他的占位符要?::columnTypeName,

所以他的sql 就为 String sql=insert into tableName(你自己的表名称)(column1,column2,…)values(?::column1TypeName,?::column2TypeName,…)
所以做postgresql批处理的时候,还需要知道列类型。
需要注意的是postgresql中 serial 的插入占位符类型是?::int,bit类型插入占位符是?::bit varying,
需要多加注意。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
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 数据。同时也可以提高数据处理效率,降低系统负担。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值