Java批量删除指定数据库所有表中的数据(千万级数据)

  • Post author:
  • Post category:java




使用JDBC的方式

  1. 获取数据库连接;
  2. 获取数据库中所有的表名;
  3. 执行sql删除数据
package com.ttsx.demo.test;
import java.sql.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 批量删除数据库所有表中的数据
 * @author sunjilong
 * @date 2021/8/30 14:25
 * @info
 */
public class SqlTest2 {
    /**
     * 获取指定数据库中的所有表名
     * @param con
     * @return
     * @throws SQLException
     */
    public static List<String> getTableNameByCon(Connection con) throws SQLException {

        DatabaseMetaData meta = con.getMetaData();
        ResultSet rs = meta.getTables(null, null, null,
                new String[]{"TABLE"});
        //存放数据库中的所有表名
        List<String> strings = new ArrayList<>();
        while (rs.next()) {
            strings.add(rs.getString(3));
        }
        return strings;
    }

    /**
     * 查询剩余条数
     * @param tableName
     * @param conn
     * @return long
     * @throws SQLException
     */
    private static long queryCount(Connection conn,String tableName) throws SQLException {
        String sql = "SELECT COUNT (*) as cnt FROM  ? ";
        PreparedStatement pstmt = conn.prepareStatement(sql);
        pstmt.setString(1, tableName);
        ResultSet rs = pstmt.executeQuery(sql);
        while (rs.next()) {
            long count = rs.getInt("cnt");
            return count;
        }
        return 0L;
    }
    public static void main(String[] args) {
        String driverClassName = "com.mysql.jdbc.Driver";	//启动驱动
        String url = "jdbc:mysql://localhost:3306/test";	//设置连接路径
        String username = "root";	//数据库用户名
        String password = "root";	//数据库连接密码
        Connection con = null;		//连接
        PreparedStatement pstmt = null;	//使用预编译语句
        ResultSet rs = null;	//获取的结果集
        Long totalDeleted =0L;
        Long expiredCount=0L;
        try {
            Class.forName(driverClassName); //执行驱动
            con = DriverManager.getConnection(url, username, password); //获取连接
            //获取指定数据库中的所有表名
            List<String> tableNameByCon = getTableNameByCon(con);
            //开始时间
            long begin = new Date().getTime();
            for (String s : tableNameByCon) {
                String sql = "delete from "+s+" limit 100000"; //一次删除10万条
                pstmt = con.prepareStatement(sql);

                //循环批量删除
                do {
                    // 返回值代表收到影响的行数
                    int result = pstmt.executeUpdate();
                    //已经删除条数
                    totalDeleted +=result;
                    //还有条数
                    expiredCount = queryCount(con,s);
                } while (expiredCount > 0);
            }
            //结束时间
            long end = new Date().getTime();
            System.out.println("删除完成,一共删除数据:"+totalDeleted+"条,"+"一共耗时:"+(end - begin) / 1000 + "秒");
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("删除失败");
        }finally {
            //关闭资源,倒关
            try {
                if(rs != null) rs.close();
                if(pstmt != null) pstmt.close();
                if(con != null) con.close();  //必须要关
            } catch (Exception e) {
            }
        }
    }

}




版权声明:本文为weixin_45912556原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。