最快插入:
public <T extends BaseEntity> void batchInsert(List<T> list) { if (list == null || list.size() == 0) { return; } int limit = 2000;//一次执行2000条记录,可以多次测试得到最优数字 Class aClass = list.get(0).getClass(); String tableName = getTableName(aClass); String[] columns = getColumns(aClass); DataSource datasource = jdbcTemplate.getDataSource(); StringBuilder sb = new StringBuilder(); String prefix = "insert into " + tableName + "("; for (String column : columns) { prefix += column + ","; } prefix = prefix.substring(0, prefix.length() - 1); prefix += ") VALUES "; Connection conn = null; PreparedStatement prest = null; try { conn = datasource.getConnection(); conn.setAutoCommit(false); prest = conn.prepareStatement(""); int size = list.size(); for (int x = 0; x < size; x++) { T t = list.get(x); if (StringUtil.isEmpty(t.getId())) { t.setId(UUIDUtil.getUUID()); } sb.append("("); String values = invokeValues(t, columns); sb.append(values); sb.append("),"); if ((x + 1) % limit == 0) { sb.deleteCharAt(sb.length() - 1); // System.out.println(prefix+sb.toString()); prest.executeUpdate(prefix + sb.toString()); conn.commit(); sb = new StringBuilder(); } } //执行剩余部分 if (size % limit != 0) { sb.deleteCharAt(sb.length() - 1); prest.executeUpdate(prefix + sb.toString()); conn.commit(); } } catch (Exception e) { e.printStackTrace(); } finally { if (prest != null) { try { prest.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
/** * 返回所有字段的值 * 格式:value1,value2,value3... * * @param t * @param columns * @param <T> * @return */ private <T> String invokeValues(T t, String[] columns) { String values = ""; for (String column : columns) { String property = ReflectUtil.underlineToCamel(column); Object fieldValue = getValue(t, ReflectUtil.getDeclaredField(t, property)); if (values.equals("")) { values = fieldValue.toString(); } else { values = values + "," + fieldValue; } } return values; } /** * 获取实体对应的数据库表 * * @param c * @return */ private String getTableName(Class<? extends Object> c) { Table table = c.getAnnotation(Table.class); return table.name(); } /** * 获取实体类对应表的所有字段 * * @param c * @return */ private String[] getColumns(Class<? extends Object> c) { try { Field[] fields = ReflectUtil.getAllFields(c); List columnList = new ArrayList(); for (int i = 0; i < fields.length; i++) { Field field = fields[i]; //忽略serialVersionUID字段 if ("serialVersionUID".equals(field.getName())) { continue; } //排除不持久化的字段 Transient meta = field.getAnnotation(Transient.class); if (meta != null) { continue; } columnList.add(ReflectUtil.camelToUnderline(field.getName())); } return StringUtil.objectsToString(columnList.toArray()); } catch (Exception e) { e.printStackTrace(); } return null; } /** * 根据属性以及注解信息获取字段值 * * @param obj 传入字段值 * @param field 传入字段 * @return 转化后的显示值 */ private <T> String getValue(T obj, Field field) { try { field.setAccessible(true); Object value = field.get(obj); if (value == null) { return null; } if (value instanceof Date) { JsonFormat jsonFormat = field.getAnnotation(JsonFormat.class); String pattern = "yyyy-MM-dd"; if (jsonFormat != null && !StringUtil.isEmpty(jsonFormat.pattern())) { pattern = jsonFormat.pattern(); } return "'" + DateUtil.formatDate((Date) value, pattern) + "'"; } else if (value instanceof Number) { return String.valueOf(value); } else if (value instanceof Boolean) { return String.valueOf(value); } else { return "'" + value + "'"; } } catch (Exception e) { e.printStackTrace(); } return null; }
最快更新:
@Override public void batchUpdate(String sql, List<Object[]> paramsList) { // jdbcTemplate.batchUpdate(sql, paramsList); int batchSize = 2000; DataSource datasource = jdbcTemplate.getDataSource(); Connection conn = null; PreparedStatement prest = null; try { conn = datasource.getConnection(); conn.setAutoCommit(false); prest = conn.prepareStatement(sql); int size = paramsList.size(); for (int x = 0; x < size; x++) { Object[] param = paramsList.get(x); for (int i = 0; i < param.length; i++) { prest.setObject(i + 1, param[i]); } prest.addBatch(); if ((x + 1) % batchSize == 0) { prest.executeBatch(); conn.commit(); } } //执行剩余部分 if (size % batchSize != 0) { prest.executeBatch(); conn.commit(); } } catch (Exception e) { e.printStackTrace(); } finally { if (prest != null) { try { prest.close(); } catch (SQLException e) { e.printStackTrace(); } } } }