jdbc 最快插入和更新方式

最快插入:

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

猜你喜欢

转载自my.oschina.net/u/2246523/blog/730015