Spring jdbcTemplate批量插入

项目中遇到批量导入的功能,需要用批量添加。项目使用 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<TContractKeeptype> list) {

final List<TContractKeeptype> temList = 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 批量操作

猜你喜欢

转载自qihaibo1989.iteye.com/blog/2378468