jdbcTemplate 预编译 批量提交

近期做了excel批量上传功能,发现jdbcTemplate预编译批量提交效率很高(对比jdbc直接批量提交),方法如下

public void batchUpdateList(final List list) {
		String sql = "insert into specialtel(sn,tel,province,remark,provincename) values (?,?,?,?,?)";
		this.batchUpdate(sql, new BatchPreparedStatementSetter() {
			   public int getBatchSize() {
				    return list.size();
				   }
				   public void setValues(PreparedStatement ps, int i)
				     throws SQLException {
					SpecialTellEntity specialTellEntity = (SpecialTellEntity) list.get(i);
				    ps.setString(1, specialTellEntity.getSn());
				    ps.setString(2, specialTellEntity.getTel());
				    ps.setString(3, specialTellEntity.getProvince());
				    ps.setString(4, specialTellEntity.getRemark());
				    ps.setString(5, specialTellEntity.getProvincename());
				   }
				  });
	}

JdbcTemplate 有一个比较方便的方法 `batchUpdate()` 可以用来批量执行 SQL 语句,但是默认情况下是按照顺序逐一执行的,而不是并行执行的。如果你想要有序批量提交,可以按照以下步骤进行: 1. 将需要执行的 SQL 语句按照顺序存放在一个 List 中。 2. 使用 `batchUpdate()` 方法执行 SQL 语句,但是不要一次性提交所有的 SQL 语句,而是分批提交。 3. 在每一次提交之后,使用 `clearBatch()` 方法清除已经执行的 SQL 语句,然后继续执行下一批 SQL 语句。 代码示例如下: ```java List<String> sqlList = new ArrayList<>(); sqlList.add("INSERT INTO table1 (col1, col2) VALUES (?, ?)"); sqlList.add("INSERT INTO table1 (col1, col2) VALUES (?, ?)"); sqlList.add("INSERT INTO table1 (col1, col2) VALUES (?, ?)"); int batchSize = 2; int count = 0; for (String sql : sqlList) { jdbcTemplate.update(sql, arg1, arg2); count++; if (count % batchSize == 0) { jdbcTemplate.getDataSource().getConnection().commit(); jdbcTemplate.getDataSource().getConnection().clearBatch(); } } if (count % batchSize != 0) { jdbcTemplate.getDataSource().getConnection().commit(); jdbcTemplate.getDataSource().getConnection().clearBatch(); } ``` 上述代码中,`batchSize` 为每次批量提交的 SQL 语句数量。在执行每一批 SQL 语句之后,需要调用 `commit()` 方法提交事务,并调用 `clearBatch()` 方法清除已经执行的 SQL 语句。最后,需要再次调用 `commit()` 和 `clearBatch()` 方法,以确保所有 SQL 语句都被执行并提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值