欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring jdbcTemplate批量插入

程序员文章站 2022-04-25 09:10:26
...

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