【JDBC】连接数据库,执行批处理。

120 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第 天,点击查看活动详情

一、什么是批处理

批处理操作,也就是采用JAVA的批量更新机制,使用批量更新机制可以将多条语句一次性提交给数据库进行批量处理,而不用逐条提交。



二、怎么使用批处理

1.在通信地址中设置参数(批处理第一步)

想要使用批处理操作,我们需要在连接数据库的通信地址(URL)中添加参数:rewriteBatchedStatements

实际操作中需要将参数rewriteBatchedStatements设置为true

String URL = "jdbc:mysql://localhost:3306/fruitdb?rewriteBatchedStatements=true";

需要注意的是,通信地址URL中首次添加参数需要在参数开头添加符号?,后续添加参数则用符号&连接。


2.连接数据库,预处理,参数填充

接下来就是连接数据库的常规的流程了(当复习一下): 。。。 除URL外,我们还需要准备 用户名 以及 密码

String USER = "root" ; //用户名
String PSW = "123456" ;//密码

。。。

加载驱动

String DRIVER = "com.mysql.cj.jdbc.Driver";
//加载驱动
Class.forName(DRIVER);

使用驱动管理器连接数据库

//数据库管理器,连接数据库
connection = DriverManager.getConnection(URL, USER, PSW);

编写SQL语句: (以插入操作为例)

String sql = "insert into t_fruit values(0,?,?,?,?)";

创建预处理对象

//创建预处理命令对象
PreparedStatement psmt = connection.prepareStatement(sql);

填充占位符 ?

psmt.setString(1,"石榴"+i);
psmt.setInt(2,8);
psmt.setInt(3,64);
psmt.setString(4,"石榴,在广东也可以叫鸡屎果");

3.进行批处理操作 (批处理第二步)

在一开始,我们先了解一下批处理要用到的方法。

批处理方法(API): addBatch():添加需要批处理的SQL语句; executeBatch():执行批处理语句; clearBatch():清空批处理包的语句;

批处理4000个SQL语句,我们满1000个SQL语句执行一次,然后清空任务列表再继续。

        for(int i = 0;i < 4000;++i){
            psmt.setString(1,"石榴"+i);
            psmt.setInt(2,8);
            psmt.setInt(3,64);
            psmt.setString(4,"石榴,在广东也可以叫鸡屎果");
            //批处理操作
            psmt.addBatch();
            if(i % 1000 == 0){//如果任务繁多,分批次执行,每次执行完清空任务列表
                psmt.executeBatch();
                psmt.clearBatch();
            }
        }

4.关闭资源

        //释放资源(关闭连接,先关闭psmt,再关闭connection)
        psmt.close();       //关闭预处理对象
        connection.close(); //关闭连接对象


三、完整代码

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Arrays;

/**
 * @author .29.
 * @create 2022-09-15 21:49
 */
public class Demo01Batch {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
    String URL = "jdbc:mysql://localhost:3306/fruitdb?rewriteBatchedStatements=true";
    String USER = "root" ; //用户名
    String PSW = "123456" ;//密码
        //加载驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //批处理操作一、添加参数rewriteBatchedStatements
        //2.通过驱动管理器连接对象:如果需要执行批处理任务,需要添加参数rewriteBatchedStatements=true
        //url表示跟数据库通信的地址
        //如果url中需要带参数,使用?连接
        //如果需要带多个参数,第二个参数开始用&连接

        String sql = "insert into t_fruit values(0,?,?,?,?)";

        //创建预处理命令对象
        PreparedStatement psmt = connection.prepareStatement(sql);
        //填充参数
        for(int i = 0;i < 10;++i){
            psmt.setString(1,"石榴"+i);
            psmt.setInt(2,8);
            psmt.setInt(3,64);
            psmt.setString(4,"石榴,在广东也可以叫鸡屎果");
            //批处理操作二
            psmt.addBatch();
            if(i % 1000 == 0){//如果任务繁多,分批次执行,每次执行完清空任务列表
                psmt.executeBatch();
                psmt.clearBatch();
            }
        }

        //释放资源(关闭连接,先关闭psmt,再关闭connection)
        psmt.close();
        connection.close();
    }
}