项目中遇到批量导入的功能,需要用批量添加。项目使用 spring + Hibernate+Spingmvc+jdbcTemplate框架。
由于使用Hibernate批量导入费时,故采用jdbcTemplate导入。用这个导入的思路有2个,一个是使用原生sql,写插入语句,循环Values里的值。一个是用jdbcTemplate.batchUpdate(sql,BatchPreparedStatementSetter);方法。
这里只写一下第二个方法的代码:
BaseDao
/**
* 批量添加
* @param sql
*/
public abstract Long insertToBatch(String sql,BatchPreparedStatementSetter pss);
BaseDaoImpl
@Override
public Long insertToBatch(String sql, BatchPreparedStatementSetter pss) {
Long l = 0L;
logger.info("insertToBatch start");
logger.info("insertToBatch sql="+sql+"---pass="+pss);
// BatchPreparedStatementSetter pss = null;
int[] count = jdbcTemplate.batchUpdate(sql, pss);
if(count!=null){
l = Long.parseLong(String.valueOf(count.length));
}
return l;
}
serviceImpl
@Override
public Long insertBatch222(List
final List
logger.info("insertBatch 批量插入 start");
Long l1 = System.currentTimeMillis();
StringBuffer sql = new StringBuffer("INSERT INTO t_contract_keeptype (name,flag,createUserId) VALUES (?,?,?) ");
BatchPreparedStatementSetter pss = new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
TContractKeeptype ck = temList.get(i);
ps.setString(1, ck.getName());
ps.setLong(2, ck.getFlag()); (拼装数据)
ps.setLong(3, ck.getCreateUserId());
}
@Override
public int getBatchSize() {
return temList.size();
}
};
long l= tContractKeeptypeDao.insertToBatch(sql.toString(), pss);
logger.info("insertBatch 批量插入 "+sql.toString());
Long l2 = System.currentTimeMillis();
logger.info("公用时间:"+(l2-l1)/1000);
return l;
}
OK。
最后,使用Mysql数据库的,在链接数据库的时候加上这个参数 rewriteBatchedStatements=true 批量操作