注意:Oracle与MySQL不同,该方法在Oracle无效,并且会报ORA-00933:SQL命令未正确结束
    首先创建两个自定义注解

    1. @Target({ElementType.TYPE})
    2. @Retention(RetentionPolicy.RUNTIME)
    3. @Documented
    4. public @interface TableName {
    5. String value() default "";
    6. }
    1. @Target({ElementType.FIELD})
    2. @Retention(RetentionPolicy.RUNTIME)
    3. @Documented
    4. public @interface Column {
    5. String value() default "";
    6. }

    然后,在Bean上面的使用

    1. @TableName("USER")
    2. public class User{
    3. @Column("IID")
    4. private String iid;
    5. @Column("NAME")
    6. private String name;
    7. // 省略get/set
    8. }

    实现:

    1. /**
    2. * <p>
    3. * 生成批量新增SQL语句
    4. * </p>
    5. *
    6. * @author lisonglin
    7. * @version 1.0
    8. * @since 2022/2/28 17:59
    9. */
    10. public class SqlTool<T> {
    11. public static void main(String[] args) {
    12. // PreparedStatement statement = null;
    13. List<User> userList = new ArrayList<>();
    14. User user = new User();
    15. user.setIid("123");
    16. user.setName("456");
    17. zjdspNhTzList.add(zjdspNhTz);
    18. SqlTool<User> sqlTool = new SqlTool<>();
    19. String sqlInsert = sqlTool.genSqlInsert(user, userList.size());
    20. System.out.println(sqlInsert);
    21. // 执行就可以了
    22. // statement.executeUpdate(sqlInsert, sqlTool.genColumn(list));
    23. }
    24. /**
    25. * 根据Table对象生成批量新增SQL
    26. * 生成语句格式:INSERT INTO TABLENAME(FIELD,...) VALUES(?,...),(?,...)
    27. *
    28. * @param table Bean对象,映射表名
    29. * @return 批量新增SQL语句
    30. */
    31. public String genSqlInsert(T table, int size) {
    32. StringBuilder sbField = new StringBuilder();
    33. StringBuilder sbValue = new StringBuilder();
    34. Class<?> aClass = table.getClass();
    35. TableName tableNameDeclared = aClass.getDeclaredAnnotation(TableName.class);
    36. String tableName = tableNameDeclared.value();
    37. sbField.append("INSERT INTO ").append(tableName.toUpperCase()).append(" (");
    38. for (Field field : aClass.getDeclaredFields()) {
    39. if (field.isAnnotationPresent(Column.class)) {
    40. Column column = field.getAnnotation(Column.class);
    41. sbField.append(column.value()).append(",");
    42. }
    43. }
    44. // 根据字段
    45. String field = sbField.substring(0, sbField.length() - 1);
    46. String[] columns;
    47. if (StringUtil.isNotEmpty(field)) {
    48. columns = field.split(",");
    49. sbValue.append("(");
    50. for (int i = 0; i < columns.length; i++) {
    51. // 拼接SQL语句,生成VALUES('value1','value2') 部分
    52. if (i == columns.length - 1) {
    53. sbValue.append("?");
    54. } else {
    55. sbValue.append("?,");
    56. }
    57. }
    58. }
    59. StringBuilder sb = new StringBuilder();
    60. for (int i = 0; i < size; i++) {
    61. sb.append(sbValue);
    62. if (i == size - 1) {
    63. sb.append(")");
    64. } else {
    65. sb.append("),");
    66. }
    67. }
    68. return field + ") VALUES " + sb;
    69. }
    70. /**
    71. * 批量新增的SQL,匹配新增语句的参数
    72. *
    73. * @param jsonData 批量新增对象
    74. * @return 参数
    75. */
    76. public Object[] genColumn(List<T> jsonData) {
    77. List<Object> param = new ArrayList<>(10);
    78. Map<String, Object> fieldAndValueMap = new LinkedHashMap<>(10);
    79. // 循环遍历list对象
    80. jsonData.forEach(obj -> {
    81. Class<?> clazz = obj.getClass();
    82. try {
    83. for (Field field : clazz.getDeclaredFields()) {
    84. field.setAccessible(true);
    85. // 获取一个字段的值
    86. Object pojoValue = field.get(obj);
    87. if (field.isAnnotationPresent(Column.class)) {
    88. Column column = field.getAnnotation(Column.class);
    89. // 反射获取Column注解的值
    90. String columnValue = column.value();
    91. fieldAndValueMap.put(columnValue, pojoValue);
    92. }
    93. field.setAccessible(false);
    94. }
    95. } catch (IllegalAccessException e) {
    96. e.printStackTrace();
    97. }
    98. for (Map.Entry<String, Object> entry : fieldAndValueMap.entrySet()) {
    99. Object value = entry.getValue();
    100. param.add(value);
    101. }
    102. });
    103. return param.toArray();
    104. }
    105. }