引言
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 的用法