JDBCTemPlate从接触JAVA开始就会用到这个工具,它是原生JDBC的更高一级别的工具性质的操作类,对原生JDBC进行了很多细节上的封装,只提供了入口API,使用者只需要选对API然后传对应的参数即可;将原有的比较繁琐的细节实现屏蔽了,对于使用的角度来说,表现得更加的友好;这次在这里对JDBCTemPlate的实现细节与API底层不做阐述,这是记录它对于批量数据插入的使用方法,方便后期回顾的时候能够快速上手;话不多少,直接上代码:
1. 项目工程是Maven整合SpringBoot2.x进行开发的,所以默认整合了JDBCTemplate, 直接注入导包即可:
2. 在方法中首先要定义好SQL语句,注意本项目工程用的是MySQL以及自增主键,所以ID这个字段并没有传,另外需要注意的是,SQL语句的字段是你数据库表中的字段,不是你实体类中的属性字段,这点要分清楚,虽然算不上什么大问题,但是很耗费时间去弄;
3. 接下来就是调用jdbcTemPlate的API进行操作了,非常需要说明的是,本文中说明的是用到它来进行批量数据插入,所以我只说明了我的使用方法;注意我红框框起来的地方,这是设置参数的类型,对应的是数据库的类型,如果实在是觉得难搞,那就选择ps.Object类型吧;还有需要注意的是,SQL中所传的参数不能为null, 如果有,那就需要给字段设定默认值就像我这么干,或者将就是动态的拼接SQL语句,至于如何动态拼接,这里不多赘述,使用StringBuild或者用if语句都可以,看你怎么玩;
4. 这个getBatchSize方法,是batchUpdateAPI中自带的获取一次批量多少数据的方法,不支持定义,它根据方法参数列表中的大小来进行批量,打个比方,你一次传入的list的长度是1000,那就一次性存一千条记录;
5. 贴源码
String sql = "insert into t_strategy_store_product(strategy_id, store_id, product_id, bar_id, is_shelf, is_empty, sort, strategy_classes_id, is_deleted, created_time, product_label) "
+ "values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
ps.setInt(1, ssProducts.get(i).getStrategyId());
ps.setInt(2, ssProducts.get(i).getStoreId());
ps.setInt(3, ssProducts.get(i).getProductId());
if(ssProducts.get(i).getBarId() == null) {
ps.setInt(4, 0);
}else {
ps.setInt(4, ssProducts.get(i).getBarId());
}
ps.setBoolean(5, ssProducts.get(i).getIsShelf());
ps.setBoolean(6, ssProducts.get(i).getIsEmpty());
ps.setInt(7, ssProducts.get(i).getSort());
ps.setInt(8, ssProducts.get(i).getStrategyClassesId());
ps.setBoolean(9, ssProducts.get(i).getIsDeleted());
ps.setObject(10, ssProducts.get(i).getCreatedTime());
if(ssProducts.get(i).getProductLabel() == null) {
ps.setString(11, "");
}else {
ps.setString(11, ssProducts.get(i).getProductLabel());
}
}
@Override
public int getBatchSize() {
return ssProducts.size();
}
});