JDBC 使用 PreparedStatement 实现批量数据操作

news/2024/12/23 0:36:06/

1 批量插入

1.1 批量执行SQL语句

当需要成批插入或者更新记录时,可以采用Java的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理。通常情况下比单独提交处理更有效率

JDBC的批量处理语句包括下面三个方法:

  • addBatch(String):添加需要批量处理的SQL语句或是参数;
  • executeBatch():执行批量处理语句;
  • clearBatch():清空缓存的数据

通常我们会遇到两种批量执行SQL语句的情况:

  • 多条SQL语句的批量处理;
  • 一个SQL语句的批量传参;

1.2 高效的批量插入

举例:向数据表中插入20000条数据

  • 数据库中提供一个goods表。创建如下:
CREATE TABLE goods(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20)
);
1.2.1 实现层次一:使用Statement
Connection conn = JDBCUtils.getConnection();
Statement st = conn.createStatement();
for(int i = 1;i <= 20000;i++){String sql = "insert into goods(name) values('name_' + "+ i +")";st.executeUpdate(sql);
}
1.2.2 实现层次二:使用PreparedStatement
long start = System.currentTimeMillis();Connection conn = JDBCUtils.getConnection();String sql = "insert into goods(name)values(?)";
PreparedStatement ps = conn.prepareStatement(sql);
for(int i = 1;i <= 20000;i++){ps.setString(1, "name_" + i);ps.executeUpdate();
}long end = System.currentTimeMillis();
System.out.println("花费的时间为:" + (end - start));//82340JDBCUtils.closeResource(conn, ps);
1.2.2 实现层次二:进一步优化 (最终版)

/*** ClassName: InsertTest* Description:* 使用PreparedStatement实现批量数据操作* update、delete 本身就具有批量操作的效果* 此时批量操作,主要是指的批量插入  使用PreparedStatement如何实现高效的批量插入?** @Create 2023/10/30 18:36* @Version 1.0*/
public class InsertTest {// 批量插入方式二:使用PreparedStatement@Testpublic void testInsert() {Connection conn = null;PreparedStatement ps = null;try {long start = System.currentTimeMillis();conn = JDBCUtil.getConnection();String sql = "insert into goods(name) values (?)";ps = conn.prepareStatement(sql);for (int i = 0; i < 2000; i++) {ps.setObject(1, "name_" + i);ps.execute();}long end = System.currentTimeMillis();System.out.println("花费的时间 = " + (end - start));} catch (Exception e) {throw new RuntimeException(e);} finally {JDBCUtil.closeResource(conn, ps);}}/*** 批量插入方式三:使用PreparedStatement (最终版)* 1 addBatch() executeBatch clearBatch()* 2 mysql服务器默认是关闭批处理的,我们需要通过一个参数,让mysql开启批处理*      rewriteBatchedStatements=true*/@Testpublic void testInsert2() {Connection conn = null;PreparedStatement ps = null;try {long start = System.currentTimeMillis();conn = JDBCUtil.getConnection();String sql = "insert into goods(name) values (?)";ps = conn.prepareStatement(sql);for (int i = 1; i <= 2000; i++) {ps.setObject(1, "name_" + i);// 1 攒 sqlps.addBatch();if (i % 500==0){// 2 执行batchps.executeBatch();// 3 清空batchps.clearBatch();}}long end = System.currentTimeMillis();System.out.println("花费的时间 = " + (end - start));} catch (Exception e) {throw new RuntimeException(e);} finally {JDBCUtil.closeResource(conn, ps);}}/*** 批量插入方式四:设置链接不允许自动提交* 1 addBatch() executeBatch clearBatch()* 2 mysql服务器默认是关闭批处理的,我们需要通过一个参数,让mysql开启批处理*      rewriteBatchedStatements=true*/@Testpublic void testInsert3() {Connection conn = null;PreparedStatement ps = null;try {long start = System.currentTimeMillis();conn = JDBCUtil.getConnection();// 设置不允许提交conn.setAutoCommit(false);String sql = "insert into goods(name) values (?)";ps = conn.prepareStatement(sql);for (int i = 1; i <= 2000; i++) {ps.setObject(1, "name_" + i);// 1 攒 sqlps.addBatch();if (i % 500==0){// 2 执行batchps.executeBatch();// 3 清空batchps.clearBatch();}}// 提交数据conn.commit();long end = System.currentTimeMillis();System.out.println("花费的时间 = " + (end - start));} catch (Exception e) {throw new RuntimeException(e);} finally {JDBCUtil.closeResource(conn, ps);}}}

http://www.ppmy.cn/news/1194546.html

相关文章

oracle 日期

日期加减 Oracle中日期进行加减可以使用多种方式&#xff0c;以下介绍三种 一种是针对天的操作&#xff0c;适用于对日&#xff0c;时&#xff0c;分&#xff0c;秒的操作&#xff0c; 一种是对月的操作&#xff0c;适用于月&#xff0c;年的操作&#xff0c; 一种是使用INTER…

第48天:内置对象方法、 前端基础之BOM和DOM

内置对象方法 RegExp对象 // 定义正则表达式两种方式 var reg1 new RegExp("^[a-zA-Z][a-zA-Z0-9]{5,11}"); var reg2 /^[a-zA-Z][a-zA-Z0-9]{5,9}$/;// 正则校验数据 reg1.test(jason666) reg2.test(jason666)/*第一个注意事项&#xff0c;正则表达式中不能有空格…

JDBC数据库连接---附通用的CRUD类

文章目录 JDBC数据库连接1 导包2 编写配置文件3 编写连接数据库代码4 测试工具类5 附加1 通用的CRUD类2 测试CURD类3 测试 JDBC数据库连接 本篇文章以 MySQL 数据库为例&#xff0c;若要切换其他数据库&#xff0c;只需修改 resource文件夹中的 jdbc.properties 配置文件即可。…

Qt中正确的设置窗体的背景图片的几种方式

Qt中正确的设置窗体的背景图片的几种方式 QLabel加载图片方式之一Chapter1 Qt中正确的设置窗体的背景图片的几种方式一、利用styleSheet设置窗体的背景图片 Chapter2 Qt的主窗口背景设置方法一&#xff1a;最简单的方式是通过ui界面来设置&#xff0c;例如设置背景图片方法二 &…

商标服务展示预约小程序的效果如何

想要打造自己的品牌&#xff0c;商标是必要的一步&#xff0c;除了可以自己申请外&#xff0c;部分商家会选择通过第三方代理平台操作&#xff0c;在商城注册场景包括查询、资料提交、驳回复审等。 市场生意并不缺&#xff0c;对商标注册代理机构来说&#xff0c;需要不断拓客…

竖拍的视频怎么做二维码?竖版视频二维码制作技巧

为了方便视频的展示和传播&#xff0c;现在将视频生成二维码后来使用的方式越来越常见&#xff0c;很多做二维码工具都可以制作视频二维码&#xff0c;但是无法设置下载权限或者播放竖版视频。那么如果做有下载功能的视频码该如何制作&#xff0c;可能很多小伙伴都不知道怎么做…

金蝶云星空表单插件获取日期控件判空处理(代码示例)

文章目录 金蝶云星空表单插件获取日期控件判空处理C#实现 金蝶云星空表单插件获取日期控件判空处理 C#实现 DateTime? deliveryDate (DateTime?)this.View.Model.GetValue("FApproveDate");//审核日期long leadtime 20;//天数if (!deliveryDate.IsNullOrEmpty()…

【C++】基础语法(上)

C基础语法 此语法笔记面向算法竞赛考研&#xff0c;可供参考&#xff0c;本人的一些笔记的记录~ 失踪人口回归&#xff0c;将近半个月没有更新&#xff0c;那么接下来也会逐步开始更新分享知识内容~ 本篇将分享cpp基础语法中的变量、输出输入语句、表达式、顺序语句、条件判断…