使⽤SpringJdbcTemplate进⾏批量的更新新增(⾼效率)
refer:⼏种批量删除分析⽐较:
参考2:
使⽤JDBC的进⾏Batch操作的缘由
由于数据的批量处理(⽐如往RDBMS插⼊⼏万条数据)⾮常耗资源,因此建议在所有场合能够借助于JDBC完成,⽽不要去采⽤Hibernate API。本⽂主要围绕Spring内置的各类JDBC API抽象⽀持展开的。
⽅式⼀:JdbcTemplate内置的batchUpdate()⽅法
batchUpdate(String sql, final BatchPreparedStatementSetter pss)批量更新sql语句
这⼀⽅法也仅仅适合于⼩批量数据的CUD(增、更新、删除)操作,但始终是同⼀SQL(参数具有多样性)。由于其内部使⽤了PreparedStatement语句,所以数据的操作效率还是不错的。下⾯给出了操作⽰例:
public Object batchUpdateUser(List<User> users){
jdbcTemplate.batchUpdate(" UPDATE user SET number = ? WHERE name = ? ",
new BatchPreparedStatementSetter(){
@Override
public void setValues(PreparedStatement ps,int i)
throws SQLException {
ps.setString(1, (i).getNumber());
ps.setString(2, (i).getName());
}
@Override
public int getBatchSize(){
return users.size();
}
});
return"OK";
}
public Object insert(List<User> users){
jdbcTemplate.batchUpdate(" insert into user(name,number) values (?,?) ",
new BatchPreparedStatementSetter(){
@Override
public void setValues(PreparedStatement ps,int i)
throws SQLException {
ps.setString(1, (i).getName());
ps.setString(2, (i).getNumber());
}
@Override
public int getBatchSize(){
return users.size();
}
});
return"OK";
}
⽅式⼆:BatchSqlUpdate
这⼀⽅法适合于各种批量数据的CUD(增、更新、删除)操作,但始终是同⼀SQL(参数具有多样性)。由于其内部使⽤
了PreparedStatement语句,所以数据的操作效率还是不错的。下⾯给出了操作⽰例:
public Object insert2(List<User> users){
DataSource dataSource = DataSource();
BatchSqlUpdate bsu =new BatchSqlUpdate(dataSource," insert into user(name,number) values (?,?)");
bsu.setBatchSize(1000);
bsu.setTypes(new int[]{Types.VARCHAR, Types.VARCHAR});
for(User user : users){
bsu.update(new Object[]{Name(), Name()});
}
bsu.flush();
return"OK";
}
同JdbcTemplate内置的batchUpdate(String sql, final BatchPreparedStatementSetter pss)相⽐,BatchSqlUpdate会⾃动分批待批量处理的数据。⽐如,如果需要批量操作10万条数据,则可以控制其batchSize,从⽽在时间(RDBMS可知性)和空间(内存)上达到平衡。
务必注意,在使⽤BatchSqlUpdate的最后,不要忘记⼿⼯调⽤其暴露的flush()⽅法。
使⽤sql语句 case when
/**
* 批量更新⼈员Status
*
* @param personList personList
*/
public void updatePersonStatusBatch(List<EcssPerson> personList){
String sql =" Update t_ecss_person Set ";
sql +=" n_last_update_status = case n_id ";
StringBuilder stringBuilder =new StringBuilder();
StringBuilder stringBuilder2 =new StringBuilder();
StringBuilder ids =new StringBuilder();
int i =1;
for(EcssPerson person : personList){
stringBuilder.append(" when "+ Id()+
" then "+ LastUpdateStatus());
if(i == personList.size()){
stringBuilder.append(" end,");
stringBuilder.append(" c_ec_code= ");
}
if(i==1){
stringBuilder2.append(" case n_id ");
}
stringBuilder2.append(
" when "+ Id()+
" then "+ EcCode());
if(i == personList.size()){
stringBuilder2.append(" end ");
}
ids.Id());
ids.append(",");
i++;
}
stringBuilder.append(stringBuilder2);
sql += String()+" where n_id in ("+ String().substring(0, ids.length()-1)+")";
System.out.println(sql);
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论