spring 批量更新数据 ---- BatchPreparedStatementSetter

引言

spring 给我们提供了 jdbc 的统一封装,和其它的 orm 不同,它是对 jdbc api 的封装,相当于我们自己写的 java bean,而没有对对象模型进行封装(比如将 po 封装为 pojo )。它保持了 jdbc 数据对象的原始性,具有极大程度的灵活性,其性能也极高。

我们知道在进行增量操作的时候最好是使用 PreparedStatement ,这样会节省数据库服务器编译 sql 语句的成本。而 Spring也提供了对增量操作的支持,而 BatchPreparedStatementSetter 接口则是其核心。

先看看 BatchPreparedStatementSetter 接口里都定义了哪些操作:

 public interface BatchPreparedStatementSetter{

    public int getBatchSize();
    public void setValues(PreparedStatement ps,int i);
}

该接口是被 JdbcTemplate 类使用的 CallBack 接口。批操作中的每个操作都使用相同的 sql 语句,而该接口则 sql 语句中的占位符设置具体的值。

  • public int getBatchSize():用来返回批次的大小
  • public void setValues(PreparedStatement ps,int i):用来为PreparedStatement设值。

参数说明:

  • ps:我们将要设值的PreparedStatement

  • i:在这个批次中,正在执行操作的索引,从0算起。

    以批量更新为例,我们要做的是先实现 BatchPreparedStatementSetter 接口,然后再调用 JdbcTemplate 的batchUpdate(sql,setter)操作,参数 sql 是预编译语句 , setter 是 BatchPreparedStatementSetter 的一个实例。下面是一段代码:

public void insert(final List<BaseInfo> pushQueue, int messageId, final int occupy_id) throws Exception {

        jdbcTemplate.batchUpdate(PushQueueAdapter.getInsertSQL(messageId),
                new BatchPreparedStatementSetter() {
                    @Override
                    public void setValues(PreparedStatement ps, int i) throws SQLException {
                        ps.setString(1, pushQueue.get(i).getImei());
                        ps.setString(2, pushQueue.get(i).getRid());
                        ps.setInt(3, 0);
                        ps.setInt(4, occupy_id);
                    }

                    public int getBatchSize() {
                        return pushQueue.size();
                    }

                });
    }

PushQueueAdapter 的 getInsertSQL 方法

String PushQueueAdapter.getInsertSQL(messageId){
  return "insert ignore into " + 表名
                + " (IMEI,RID,STATUS,OCCUPY_ID) values(?,?,?,?)";
}

上面的代码片,是自己项目中的,所以这篇也算半原创,~~
想看更多 JdbcTemplate 可以移步:Spring中 jdbcTemplate 的用法

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值