本人在项目中遇到数据库的表是通过项目的页面进行动态生成,所以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;
}
坚持每天学习一小步,进步一大步.
浙公网安备 33010602011771号