本人在项目中遇到数据库的表是通过项目的页面进行动态生成,所以java代码里面没有对应的实体类,此时又需要将很多数据添加到表里面,那我们要怎么实现呢。

  • 首先,我们没有实体类,只能通过sql来进行保存,不能使用jpa里面的批量保存方法。
  • 既然,我们能动态生成表,那么肯定会有存放字段的地方,所以查询方法就通过表名和字段,查到数据,用map接收,将查到的数据获取到这个表里面的字段名。然后拼接起来。
  • 然后在使用jdbcTemplate.batchUpdate();方法进行保存,下面就是代码演示。
    public boolean batchInsertList(List<Map<String,Object>> dataList,String tableName){
        //拼接insert语句,只执行一次
        boolean firstFlag = true;
        //字段名
        StringBuilder sb = new StringBuilder(200);
        sb.append("insert into ").append(tableName).append(" (");
        //拼接字段值占位符
        StringBuilder sbValue = new StringBuilder(200);
        //存放数据的结果集
        List<Object[]> addResultList = new ArrayList<>();
        //单条数据结果
        Object[] rowResult;
        int size = 0;
        for(Map<String,Object> map:dataList){
            if(firstFlag){
                size = map.size();
            }
            rowResult = new Object[size];
            int startN = 0;
            for(Map.Entry<String,Object> entity:map.entrySet()){
                //第一次拼接,只拼接一次
                if(firstFlag){
                    sb.append(entity.getKey()).append(" ,");
                    sbValue.append("? ,");
                }
                //将值放到单个数据组中
                rowResult[startN] = entity.getValue();
                startN++;
            }
            //将单条数据存放到集合中
            addResultList.add(rowResult);
            if(firstFlag){
                //第一次执行完后终止,下次不在执行
                firstFlag = false;
                sb.deleteCharAt(sb.length() - 1).append(" ) values (");
                sbValue.deleteCharAt(sbValue.length() - 1).append(" )");
            }

        }
        //拼接后的结果 insert into table_name(text1,text2,text3) values (?,?,?)
        sb.append(sbValue.toString());
        log.info("sql: " + sb);
        //sql,List<Object[]>
        jdbcTemplate.batchUpdate(sb.toString(), addResultList);
        return true;
    }

posted on 2021-06-29 17:02  我的学习小天堂  阅读(555)  评论(0)    收藏  举报