mysql数据库准备
private String Driver = "com.mysql.cj.jdbc.Driver"; private String url
="jdbc:mysql://localhost:3306/mp?serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true";
private String user = "root"; private String password = "root"; Connection
connection = null; PreparedStatement ps = null; ResultSet rs = null;
//封装与数据库建立连接的类 public void coon() throws Exception{ Class.forName(Driver);
connection = DriverManager.getConnection(url,user,password); } //封装异常类 public
void erro(){ try { if (rs!=null){ rs.close(); } if (ps!=null){ ps.close(); } if
(connection!=null){ connection.close(); } } catch (Exception e) {
e.printStackTrace(); } }
方式一:普通插入
package com.wt; import org.junit.Test; import java.sql.Connection; import
java.sql.DriverManager; import java.sql.PreparedStatement; import
java.sql.ResultSet; /** * @Author wt * @Date 2022/11/14 21:17 *
@PackageName:com.wt * @ClassName: TestAddBatch01 * @Description: TODO *
@Version 1.0 */ public class TestAddBatch01 { private String Driver =
"com.mysql.cj.jdbc.Driver"; private String url
="jdbc:mysql://localhost:3306/mp?serverTimezone=Asia/Shanghai"; private String
user = "root"; private String password = "root"; Connection connection = null;
PreparedStatement ps = null; ResultSet rs = null; public void coon() throws
Exception{ Class.forName(Driver); connection =
DriverManager.getConnection(url,user,password); } public void erro(){ try { if
(rs!=null){ rs.close(); } if (ps!=null){ ps.close(); } if (connection!=null){
connection.close(); } } catch (Exception e) { e.printStackTrace(); } } @Test
public void ccc(){ long start = System.currentTimeMillis(); String sql =
"insert into a(id, name) VALUES (?,null)"; try { coon(); ps =
connection.prepareStatement(sql); for (int i = 1; i <= 1000000; i++) {
ps.setObject(1, i);//填充sql语句种得占位符 ps.execute();//执行sql语句 } } catch (Exception
e) { e.printStackTrace(); } finally { erro(); } System.out.println("百万条数据插入用时:"
+ (System.currentTimeMillis() - start)+"【单位:毫秒】"); } }
用时:62分钟多 

方式二:使用批处理插入
package com.wt; import org.junit.Test; import java.sql.Connection; import
java.sql.DriverManager; import java.sql.PreparedStatement; import
java.sql.ResultSet; /** * @Author wt * @Date 2022/11/14 20:25 *
@PackageName:com.wt.util * @ClassName: TestAddBatch * @Description: TODO *
@Version 1.0 */ public class TestAddBatch { private String Driver =
"com.mysql.cj.jdbc.Driver"; private String url
="jdbc:mysql://localhost:3306/mp?serverTimezone=Asia/Shanghai"; private String
user = "root"; private String password = "root"; Connection connection = null;
PreparedStatement ps = null; ResultSet rs = null; public void coon() throws
Exception{ Class.forName(Driver); connection =
DriverManager.getConnection(url,user,password); } public void erro(){ try { if
(rs!=null){ rs.close(); } if (ps!=null){ ps.close(); } if (connection!=null){
connection.close(); } } catch (Exception e) { e.printStackTrace(); } } @Test
public void ccc(){ long start = System.currentTimeMillis(); String sql =
"insert into a(id, name) VALUES (?,null)"; try { coon(); ps =
connection.prepareStatement(sql); // connection.setAutoCommit(false);//取消自动提交
for (int i = 1; i <= 1000000; i++) { ps.setObject(1, i); ps.addBatch(); if (i %
1000 == 0) { ps.executeBatch(); ps.clearBatch(); } } ps.executeBatch();
ps.clearBatch(); // connection.commit();//所有语句都执行完毕后才手动提交sql语句 } catch
(Exception e) { e.printStackTrace(); } finally { erro(); }
System.out.println("百万条数据插入用时:" + (System.currentTimeMillis() -
start)+"【单位:毫秒】"); } }
 方式一、二总结:到此可以看出其实其处理程序及批处理是没有起作用的,为此我们使用方式三

方式三:通过连接配置url设置【&rewriteBatchedStatements=true】(设置重写批处理语句)

url地址后注意添加【&rewriteBatchedStatements=true】
private String url
="jdbc:mysql://localhost:3306/mp?serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true";
方法三较于方法二的改变是只是url地址上的改变,其它没有任何修改 
package com.wt; import org.junit.Test; import java.sql.Connection; import
java.sql.DriverManager; import java.sql.PreparedStatement; import
java.sql.ResultSet; /** * @Author wt * @Date 2022/11/14 20:25 *
@PackageName:com.wt.util * @ClassName: TestAddBatch * @Description: TODO *
@Version 1.0 */ public class TestAddBatch { private String Driver =
"com.mysql.cj.jdbc.Driver"; private String url
="jdbc:mysql://localhost:3306/mp?serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true";
private String user = "root"; private String password = "root"; Connection
connection = null; PreparedStatement ps = null; ResultSet rs = null; public
void coon() throws Exception{ Class.forName(Driver); connection =
DriverManager.getConnection(url,user,password); } public void erro(){ try { if
(rs!=null){ rs.close(); } if (ps!=null){ ps.close(); } if (connection!=null){
connection.close(); } } catch (Exception e) { e.printStackTrace(); } } @Test
public void ccc(){ long start = System.currentTimeMillis(); String sql =
"insert into a(id, name) VALUES (?,null)"; try { coon(); ps =
connection.prepareStatement(sql); for (int i = 1; i <= 1000000; i++) {
ps.setObject(1, i); ps.addBatch(); if (i % 1000 == 0) { ps.executeBatch();
ps.clearBatch(); } } ps.executeBatch(); ps.clearBatch(); } catch (Exception e)
{ e.printStackTrace(); } finally { erro(); } System.out.println("百万条数据插入用时:" +
(System.currentTimeMillis() - start)+"【单位:毫秒】"); } }
用时:【10秒左右】

 

 

 

到此批处理语句才正是生效

注意

数据库连接的url设置了【&rewriteBatchedStatements=true】时,java代码种的sql语句不能有分号【;】号,否则批处理语句打包就会出现错误,导致后面的sql语句提交出现【BatchUpdateException】异常

方式四:通过数据库连接取消自动提交,手动提交数据
package com.wt; import org.junit.Test; import java.sql.Connection; import
java.sql.DriverManager; import java.sql.PreparedStatement; import
java.sql.ResultSet; /** * @Author wt * @Date 2022/11/14 20:25 *
@PackageName:com.wt.util * @ClassName: TestAddBatch * @Description: TODO *
@Version 1.0 */ public class TestAddBatch { private String Driver =
"com.mysql.cj.jdbc.Driver"; private String url
="jdbc:mysql://localhost:3306/mp?serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true";
private String user = "root"; private String password = "root"; Connection
connection = null; PreparedStatement ps = null; ResultSet rs = null; public
void coon() throws Exception{ Class.forName(Driver); connection =
DriverManager.getConnection(url,user,password); } public void erro(){ try { if
(rs!=null){ rs.close(); } if (ps!=null){ ps.close(); } if (connection!=null){
connection.close(); } } catch (Exception e) { e.printStackTrace(); } } @Test
public void ccc(){ long start = System.currentTimeMillis(); String sql =
"insert into a(id, name) VALUES (?,null)"; try { coon(); ps =
connection.prepareStatement(sql); connection.setAutoCommit(false);//取消自动提交 for
(int i = 1; i <= 1000000; i++) { ps.setObject(1, i); ps.addBatch(); if (i %
1000 == 0) { ps.executeBatch(); ps.clearBatch(); } } ps.executeBatch();
ps.clearBatch(); connection.commit();//所有语句都执行完毕后才手动提交sql语句 } catch (Exception
e) { e.printStackTrace(); } finally { erro(); } System.out.println("百万条数据插入用时:"
+ (System.currentTimeMillis() - start)+"【单位:毫秒】"); } }

 用时:【9秒左右】

总结:

1.使用批量提交数据,url一定要设置允许重写批量提交【rewriteBatchedStatements=true】,以及此时的sql语句一定不能有分号,否则有【BatchUpdateException】异常,

2.其他的就正常使用PreparedStatement ps;的以下三个方法即可
     *      ps.addBatch();      将sql语句打包到一个容器中
     *      ps.executeBatch();  将容器中的sql语句提交
     *      ps.clearBatch();    清空容器,为下一次打包做准备

 

技术
下载桌面版
GitHub
百度网盘(提取码:draw)
Gitee
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:766591547
关注微信