• JDBC 实现批量插入-任意表名


    相关代码

    声明常量

    1. static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
    2. static final String DB_URL = "jdbc:mysql://localhost:3306/your_database_name";
    3. static final String USER = "数据库账号";
    4. static final String PASS = "数据库密码";

    主方法

    1. public void batchInsert(List records, String tableName,Class className) throws SQLException{
    2. Connection connection = null;
    3. PreparedStatement preparedStatement = null;
    4. try {
    5. // 注册 JDBC 驱动
    6. Class.forName(JDBC_DRIVER);
    7. connection = DriverManager.getConnection(DB_URL, USER, PASS);
    8. // 创建预处理语句对象
    9. StringBuilder columnNames = new StringBuilder();
    10. StringBuilder placeholders = new StringBuilder();
    11. Field[] fields = className.getDeclaredFields();
    12. for (int i = 0; i < fields.length; i++) {
    13. String fieldName = fields[i].getName();
    14. if (fieldName.equals("id")) {
    15. continue;
    16. }
    17. if (isCamelCase(fieldName)) {
    18. fieldName = toUnderscoreCase(fieldName);
    19. }
    20. columnNames.append(fieldName);
    21. placeholders.append("?");
    22. if (i < fields.length - 1) {
    23. columnNames.append(", ");
    24. placeholders.append(", ");
    25. }
    26. }
    27. String sql = "INSERT INTO " + tableName + " (" + columnNames.toString() + ") VALUES (" + placeholders.toString() + ")";
    28. preparedStatement = connection.prepareStatement(sql);
    29. // 添加批量数据
    30. for (Object entity : records) {
    31. setFieldValues(entity, preparedStatement);
    32. preparedStatement.addBatch();
    33. }
    34. // 执行批量插入
    35. int[] result = preparedStatement.executeBatch();
    36. // 输出结果
    37. for (int i = 0; i < result.length; i++) {
    38. log.error("插入结果:" + result[i]);
    39. }
    40. log.error("插入结果数量{}", result.length);
    41. } catch (Exception e) {
    42. log.error("插入结果:", e);
    43. } finally {
    44. // 关闭资源
    45. if (preparedStatement != null) {
    46. preparedStatement.close();
    47. }
    48. if (connection != null) {
    49. connection.close();
    50. }
    51. }
    52. }

    设置属性值

    1. private static void setFieldValues(Object obj, PreparedStatement preparedStatement) throws IllegalAccessException, SQLException {
    2. Field[] fields = obj.getClass().getDeclaredFields();
    3. fields = Arrays.stream(fields)
    4. .filter(field -> !field.getName().equals("id")).toArray(Field[]::new);
    5. for (int i = 0; i < fields.length; i++) {
    6. fields[i].setAccessible(true);
    7. preparedStatement.setObject(i + 1, fields[i].get(obj));
    8. }
    9. }

    是否为小驼峰

    1. private static boolean isCamelCase(String str) {
    2. if(str != null && !str.isEmpty()){
    3. String regex = "^[a-z]+([A-Z][a-z0-9]*)*$";
    4. return str.matches(regex);
    5. }
    6. return false;
    7. }

    小驼峰转为下划线

    1. private static String toUnderscoreCase(String str) {
    2. StringBuilder result = new StringBuilder();
    3. for (int i = 0; i < str.length(); i++) {
    4. char c = str.charAt(i);
    5. if (Character.isUpperCase(c)) {
    6. if (i > 0) {
    7. result.append('_');
    8. }
    9. result.append(Character.toLowerCase(c));
    10. } else {
    11. result.append(c);
    12. }
    13. }
    14. return result.toString();
    15. }

    实体

    1. @Data
    2. public class ProductEntity implements Serializable {
    3. /**
    4. * 主键id
    5. */
    6. private BigInteger id;
    7. /**
    8. * 用户id
    9. */
    10. private String userId;
    11. /**
    12. * 商品名称
    13. */
    14. private String productName;
    15. }

    调用方法

    1. public void copyData(UserDataModel model) throws SQLException {
    2. List products = prodctMapper.selectAllInfos(model.getFromUserId());
    3. products.forEach(record -> record.setUserId(Long.valueOf(model.getToUserId())));
    4. batchInsert(products, "product_record",ProductEntity.class);
    5. }

    说明

    如果实体属性与数据库字段一致,不需要做驼峰转下划线这一操作,否则就需要进行转化。

    补充

    如果数据库内容有表情的时候,确保你的Java程序使用正确的字符集连接MySQL数据库。在JDBC连接字符串中添加&useUnicode=true&characterEncoding=UTF-8参数,例如: 

    String url = "jdbc:mysql://localhost:3306/your_database_name?useUnicode=true&characterEncoding=UTF-8";


     

  • 相关阅读:
    Hive3 介绍与安装使用
    Qt for Android设置应用图标及名称
    TensorFlow搭建LSTM实现时间序列预测(负荷预测)
    【Java SE】第三话·数据类型与变量
    maven中常用标签
    JS数据类型判断方式总结
    关于nginx升级--存在0day漏洞
    TiDB Lightning Web 界面
    Keil工程忽略文件.gitignore、自动删除脚本:keilkilll.bat、自动生成目录文件列表脚本
    Android Studio :can not resolve symbol ‘List‘
  • 原文地址:https://blog.csdn.net/DJuan15732626157/article/details/133957038