找了好久,没有找到想要的答案。
只好自己摸索,我的方法是同事务那样,
获得connection后取消自动提交,然后循环一个个select查重。
正好本就需要一个循环将excel表中不能重复的字段查重,
也需要将不合格的数据剔除,最后获得一个有效数据集,然后批量插入。
只好自己摸索,我的方法是同事务那样,
获得connection后取消自动提交,然后循环一个个select查重。
正好本就需要一个循环将excel表中不能重复的字段查重,
也需要将不合格的数据剔除,最后获得一个有效数据集,然后批量插入。
public Map<String, String> insertCompany(List<List<Object>> list) throws SQLException { //存放合格数据,待插入数据库 List<Company> companys = new ArrayList<Company>(); //存放结果,及 不合格的数据 反馈,,想要弄得好一点可以弄个dto层(数据传输对象层)专门方便service到servlet/ctrl的数据传输 Map<String, String> dataMap = new HashMap<String, String>(); //存放上传的excel中得单位名称用以excel查重 Set<String> names = new HashSet<String>(); String data = ""; Connection conn = BaseDao.getConn(); conn.setAutoCommit(false); for (int i = 0; i < list.size(); i++) { List<Object> e = list.get(i); try { String id = UUID.randomUUID().toString(); String name = (String) e.get(0); if (names.contains(name)) { data += ("第" + (i+2) + "条,excel中的重复数据!<br>"); //excel序号1开始,第一行为表头,故+2 continue; } names.add(name); if (this.isExist(name, conn)) { data += ("第" + (i+2) + "条, 系统中已存在该数据!<br>"); continue; } int type = Integer.parseInt((String) e.get(1)); // 看需求,excel表中类型可否直接填数值 // 要求填中文类型的话从数据库读取List<> --> Map 根据键值判断 String address = (String) e.get(2); String direction = (String) e.get(3); String webUrl = (String) e.get(4); String info = (String) e.get(5); Company com = new Company(id, name, type, address, direction, webUrl, info); companys.add(com);//将合格数据存放至List } catch (Exception exception) { data += ("第" + (i+2) + "条,数据格式有误!<br>"); } } conn.commit();//提交事务 conn.setAutoCommit(true); BaseDao.releaseAll(null, null, conn); //无合格数据 if (companys.size() == 0) { data = "无有效数据!" + data; } //批量插入 int res = companyDao.insert(companys); String resStr = "success"; if (res <= 0) { resStr = "fail"; } //反馈信息 dataMap.put("data", data); dataMap.put("result", resStr); return dataMap; }
2017.7.25更新