JDBCTemPlate从接触JAVA开始就会用到这个工具,它是原生JDBC的更高一级别的工具性质的操作类,对原生JDBC进行了很多细节上的封装,只提供了入口API,使用者只需要选对API然后传对应的参数即可;将原有的比较繁琐的细节实现屏蔽了,对于使用的角度来说,表现得更加的友好;这次在这里对JDBCTemPlate的实现细节与API底层不做阐述,这是记录它对于批量数据插入的使用方法,方便后期回顾的时候能够快速上手;话不多少,直接上代码:

1. 项目工程是Maven整合SpringBoot2.x进行开发的,所以默认整合了JDBCTemplate, 直接注入导包即可:

springboot批量导入数据到hive springboot 批量添加_字段

 

2. 在方法中首先要定义好SQL语句,注意本项目工程用的是MySQL以及自增主键,所以ID这个字段并没有传,另外需要注意的是,SQL语句的字段是你数据库表中的字段,不是你实体类中的属性字段,这点要分清楚,虽然算不上什么大问题,但是很耗费时间去弄;

springboot批量导入数据到hive springboot 批量添加_字段_02

3. 接下来就是调用jdbcTemPlate的API进行操作了,非常需要说明的是,本文中说明的是用到它来进行批量数据插入,所以我只说明了我的使用方法;注意我红框框起来的地方,这是设置参数的类型,对应的是数据库的类型,如果实在是觉得难搞,那就选择ps.Object类型吧;还有需要注意的是,SQL中所传的参数不能为null, 如果有,那就需要给字段设定默认值就像我这么干,或者将就是动态的拼接SQL语句,至于如何动态拼接,这里不多赘述,使用StringBuild或者用if语句都可以,看你怎么玩;

springboot批量导入数据到hive springboot 批量添加_SQL_03

4. 这个getBatchSize方法,是batchUpdateAPI中自带的获取一次批量多少数据的方法,不支持定义,它根据方法参数列表中的大小来进行批量,打个比方,你一次传入的list的长度是1000,那就一次性存一千条记录;

springboot批量导入数据到hive springboot 批量添加_API_04

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();
             }
         });