【Java】一个批量更新插入数据到MySQL的工具类

分享自己写的一个工具类,可以批量sqlreplace更新插入数据到DB

dbUtils.java 文件

java 复制代码
package com.tuling.DB;
import java.sql.*;
import java.util.*;
/**
 * SQL工具类,提供数据库操作相关功能
 */
public class dbUtils {
  /**
   * 执行REPLACE INTO操作,批量插入或更新数据
   *
   * @param tableName 表名
   * @param data      数据列表,每个Map代表一行数据
   * @param conn      数据库连接
   * @return 受影响的行数总和
   * @throws SQLException 数据库操作异常
   */
  public static int sqlReplace(String tableName, List<Map<String, Object>> data, Connection conn) throws SQLException {
    // 参数验证
    if (tableName == null || tableName.trim().isEmpty()) {
      throw new IllegalArgumentException("表名不能为空");
    }
    if (data == null || data.isEmpty()) {
      return 0;
    }
    // 获取第一行的列名
    Map<String, Object> firstRow = data.get(0);
    Set<String> columns = firstRow.keySet();
    int columnCount = columns.size(); // 列数
    List<String> columnList = new ArrayList<>(columns); // 列名列表
    if (columns.isEmpty()) {
      return 0;
    }
    // 构造 SQL 语句
    StringBuilder sqlBuilder = new StringBuilder("REPLACE INTO ");// 添加表名
    sqlBuilder.append(tableName).append(" (");
    // 添加字段名
    for (int i = 0; i < columnCount; i++) {
      if (i > 0) {
        sqlBuilder.append(", "); // 添加逗号分隔
      }
      sqlBuilder.append(columnList.get(i));
    }
    sqlBuilder.append(") VALUES (");
    // 添加占位符
    for (int i = 0; i < columnCount; i++) {
      if (i > 0) {
        sqlBuilder.append(", ");
      }
      sqlBuilder.append("?");
    }
    // 添加结束符
    sqlBuilder.append(")");
    String sql = sqlBuilder.toString();
    System.out.println(sql);  // 打印SQL语句
    try (PreparedStatement ps = conn.prepareStatement(sql)) { // 创建预编译语句对象
      for (Map<String, Object> row : data) {// 遍历每行数据
        int index = 1;
        for (String column : columnList) {//遍历字段
          Object value = row.get(column);// 获取字段值
          if (value == null) {
            ps.setNull(index, Types.OTHER); // 可根据需要替换为具体类型
          } else {
            ps.setObject(index, value);// 设置参数值
          }
          index++;
        }
        ps.addBatch();// 添加批处理
      }
      int[] results = ps.executeBatch();// 执行批处理
      return Arrays.stream(results).sum(); // 返回受影响的总行数
    }
  }
  /**
   * 验证数据行结构是否一致
   *
   * @param data            数据列表
   * @param expectedColumns 预期的列名集合
   * @throws IllegalArgumentException 如果数据结构不一致
   */
  private static void validateDataStructure(List<Map<String, Object>> data, Set<String> expectedColumns) {
    if (data == null) {
      return;
    }
    // 验证每行数据的列名
    for (int i = 0; i < data.size(); i++) {
      Map<String, Object> row = data.get(i);
      if (row == null) {
        throw new IllegalArgumentException("第 " + (i + 1) + " 行数据不能为null");
      }
      Set<String> rowColumns = row.keySet();
      if (!rowColumns.equals(expectedColumns)) {
        throw new IllegalArgumentException("第 " + (i + 1) + " 行数据结构与第一行不一致");
      }
    }
  }
}

然后调用上述的方法:

java 复制代码
package com.tuling.part1;
import com.tuling.DB.dbUtils;
import java.sql.*;
import java.util.*;

public class Demo {
  public static void main(String[] args) throws ClassNotFoundException, SQLException {
    Class.forName("com.mysql.cj.jdbc.Driver");
    String url = "jdbc:mysql://xxxxx:3306/economy";
    String username = "xxxx";
    String password = "xxxx";
    Connection conn = DriverManager.getConnection(url,username,password);
    //构建数据
    List<Map<String,Object>> data = new ArrayList<>();
    Map<String,Object> row = new HashMap<>();
    row.put("id",1);
    row.put("name","zhangsan");
    row.put("age",22);
    data.add(row);
    //插入数据
    dbUtils.sqlReplace("testing",data,conn);
  }
}

效果就是

bash 复制代码
REPLACE INTO testing (name, id, age) VALUES (1, "zhangsan", 22)
相关推荐
Dylan的码园4 分钟前
功能包介绍 : calendar
java·jvm·eclipse
二川bro11 分钟前
Java集合类框架的基本接口有哪些?
java·开发语言·python
zhangfeng113323 分钟前
PowerShell 中不支持激活你选中的 Python 虚拟环境,建议切换到命令提示符(Command Prompt)
开发语言·python·prompt
huizhixue-IT28 分钟前
2026年还需要学习RHCE 吗?
开发语言·perl
zUlKyyRC34 分钟前
LabVIEW 玩转数据库:Access 与 SQL Server 的实用之旅
开发语言
菜鸟233号36 分钟前
力扣213 打家劫舍II java实现
java·数据结构·算法·leetcode
panzer_maus40 分钟前
Redis简单介绍(3)-持久化的实现
java·redis·mybatis
毕设源码-邱学长1 小时前
【开题答辩全过程】以 民宿在线预定平台的设计与实现为例,包含答辩的问题和答案
java·eclipse
AGMTI1 小时前
webSock动态注册消息回调函数功能实现
开发语言·前端·javascript
不会Android的潘潘1 小时前
受限系统环境下的 WebView 能力演进:车载平台 Web 渲染异常的根因分析与优化实践
android·java·前端·aosp