javaweb学习总结(三十六)——使用JDBC进行批处理
在实际的项目开发中,有时候需要向数据库发送一批SQL语句执行,这时应避免向数据库一条条的发送执行,而应采用JDBC的批处理机制,以提升执行效率。
JDBC实现批处理有两种方式:statement和preparedstatement
一、使用Statement完成批处理
1、使用Statement对象添加要批量执行SQL语句,如下:
1 Statement.addBatch(sql1); 2 Statement.addBatch(sql2); 3 Statement.addBatch(sql3);
2、执行批处理SQL语句:Statement.executeBatch();
3、清除批处理命令:Statement.clearBatch();
1.1、使用Statement完成批处理范例
1、编写测试的SQL脚本创建表
1 create table testbatch 2 ( 3 id int primary key, 4 name varchar(20) 5 );
2、编写测试代码,如下所示:
1 package me.gacl.demo;
2
3 import java.sql.Connection;
4 import java.sql.ResultSet;
5 import java.sql.Statement;
6 import me.gacl.utils.JdbcUtils;
7 import org.junit.Test;
8
9 /**
10 * @ClassName: JdbcBatchHandleByStatement
11 * @Description: 使用Statement实现JDBC批处理操作
12 * @author: 孤傲苍狼
13 * @date: 2014-9-20 下午10:05:45
14 *
15 */
16 public class JdbcBatchHandleByStatement {
17
18 @Test
19 public void testJdbcBatchHandleByStatement(){
20 Connection conn = null;
21 Statement st = null;
22 ResultSet rs = null;
23 try{
24 conn = JdbcUtils.getConnection();
25 String sql1 = "insert into testbatch(id,name) values(1,'aaa')";
26 String sql2 = "insert into testbatch(id,name) values(2,'bbb')";
27 String sql3 = "insert into testbatch(id,name) values(3,'CCC')";
28 String sql4 = "insert into testbatch(id,name) values(4,'DDD')";
29 String sql5 = "update testbatch set name='gacl' where id=1";
30 String sql6 = "insert into testbatch(id,name) values(5,'FFF')";
31 String sql7 = "delete from testbatch where id=2";
32 st = conn.createStatement();
33 //添加要批量执行的SQL
34 st.addBatch(sql1);
35 st.addBatch(sql2);
36 st.addBatch(sql3);
37 st.addBatch(sql4);
38 st.addBatch(sql5);
39 st.addBatch(sql6);
40 st.addBatch(sql7);
41 //执行批处理SQL语句
42 st.executeBatch();
43 //清除批处理命令
44 st.clearBatch();
45 }catch (Exception e) {
46 e.printStackTrace();
47 }finally{
48 JdbcUtils.release(conn, st, rs);
49 }
50 }
51 }
1.2、采用Statement.addBatch(sql)方式实现批处理的优缺点
采用Statement.addBatch(sql)方式实现批处理:
优点:可以向数据库发送多条不同的SQL语句。
缺点:SQL语句没有预编译。
当向数据库发送多条语句相同,但仅参数不同的SQL语句时,需重复写上很多条SQL语句。例如:
1 Insert into user(name,password) values('aa','111');
2 Insert into user(name,password) values('bb','222');
3 Insert into user(name,password) values('cc','333');
4 Insert into user(name,password) values('dd','444');
二、使用PreparedStatement完成批处理
2.1、使用PreparedStatement完成批处理范例
测试代码如下:
1 package me.gacl.demo;
2
3 import java.sql.Connection;
4 import java.sql.PreparedStatement;
5 import java.sql.ResultSet;
6 import me.gacl.utils.JdbcUtils;
7 import org.junit.Test;
8
9 /**
10 * @ClassName: JdbcBatchHandleByStatement
11 * @Description: 使用prepareStatement实现JDBC批处理操作
12 * @author: 孤傲苍狼
13 * @date: 2014-9-20 下午10:05:45
14 *
15 */
16 public class JdbcBatchHandleByPrepareStatement {
17
18 @Test
19 public void testJdbcBatchHandleByPrepareStatement(){
20 long starttime = System.currentTimeMillis();
21 Connection conn = null;
22 PreparedStatement st = null;
23 ResultSet rs = null;
24
25 try{
26 conn = JdbcUtils.getConnection();
27 String sql = "insert into testbatch(id,name) values(?,?)";
28 st = conn.prepareStatement(sql);
29 for(int i=1;i<1000008;i++){ //i=1000 2000
30 st.setInt(1, i);
31 st.setString(2, "aa" + i);
32 st.addBatch();
33 if(i%1000==0){
34 st.executeBatch();
35 st.clearBatch();
36 }
37 }
38 st.executeBatch();
39 }catch (Exception e) {
40 e.printStackTrace();
41 }finally{
42 JdbcUtils.release(conn, st, rs);
43 }
44 long endtime = System.currentTimeMillis();
45 System.out.println("程序花费时间:" + (endtime-starttime)/1000 + "秒!!");
46 }
47 }
2.2、采用PreparedStatement.addBatch()方式实现批处理的优缺点
采用PreparedStatement.addBatch()实现批处理
优点:发送的是预编译后的SQL语句,执行效率高。
缺点:只能应用在SQL语句相同,但参数不同的批处理中。因此此种形式的批处理经常用于在同一个表中批量插入数据,或批量更新表的数据。
关于JDBC批处理的内容就总结这么多。
javaweb学习总结(三十六)——使用JDBC进行批处理的更多相关文章
- JavaWeb学习总结(三十五)——使用JDBC处理Oracle大数据
一.Oracle中大数据处理 在Oracle中,LOB(Large Object,大型对象)类型的字段现在用得越来越多了.因为这种类型的字段,容量大(最多能容纳4GB的数据),且一个表中可以有多个这种 ...
- javaweb学习总结(三十四)——使用JDBC处理MySQL大数据
一.基本概念 大数据也称之为LOB(Large Objects),LOB又分为:clob和blob,clob用于存储大文本,blob用于存储二进制数据,例如图像.声音.二进制文等. 在实际开发中,有时 ...
- 风炫安全web安全学习第三十六节课-15种上传漏洞讲解(一)
风炫安全web安全学习第三十六节课 15种上传漏洞讲解(一) 文件上传漏洞 0x01 漏洞描述和原理 文件上传漏洞可以说是日常渗透测试用得最多的一个漏洞,因为用它获得服务器权限最快最直接.但是想真正把 ...
- javaweb学习总结(三十二)——JDBC学习入门
一.JDBC相关概念介绍 1.1.数据库驱动 这里的驱动的概念和平时听到的那种驱动的概念是一样的,比如平时购买的声卡,网卡直接插到计算机上面是不能用的,必须要安装相应的驱动程序之后才能够使用声卡和网卡 ...
- Python学习日记(三十六) Mysql数据库篇 四
MySQL作业分析 五张表的增删改查: 完成所有表的关系创建 创建教师表(tid为这张表教师ID,tname为这张表教师的姓名) create table teacherTable( tid int ...
- javaweb学习总结(三十八)——事务
一.事务的概念 事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功. 例如:A——B转帐,对应于如下两条sql语句 update from account set mone ...
- 【转载】JMeter学习(三十六)发送HTTPS请求
Jmeter一般来说是压力测试的利器,最近想尝试jmeter和BeanShell进行接口测试.由于在云阅读接口测试的过程中需要进行登录操作,而登录请求是HTTPS协议.这就需要对jmeter进行设置. ...
- javaweb学习总结(四十六)——Filter(过滤器)常见应用
一.统一全站字符编码 通过配置参数charset指明使用何种字符编码,以处理Html Form请求参数的中文问题 1 package me.gacl.web.filter; 2 3 import ja ...
- javaweb学习总结(三十九)——数据库连接池
一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大 ...
随机推荐
- asp.net连接mysql数据库
方法一:使用MySQL推出的MySQL Connector/Net组件, 该组件是MySQL为ADO.NET访问MySQL数据库设计的.NET专用访问组件.完成该组件后,需要在项目中引用这个组件,也可 ...
- 经历:Java中字符串中按照多个字符拆分或替换:split()和replaceAll()
一.replaceAll() 今天,遇到了这样的一个字符串[如下代码]: String s="@0|新港@0|天津@0|东莞@0|南沙@0|营口@0|钦州@0|上海@0|汕头@0|连云港@0 ...
- iOS-学习路线图(推荐)
在学习一个新的知识时,除了保持积极的态度.对知识的渴望,学习路线以及方法也是很重要的.在学习iOS的时候,遇到这样的情况,非常想去学习,提高,但是没有一个学习路线,不知道从哪里入手,该先学什么.在学什 ...
- JavaScript DOM编程艺术 - 读书笔记1-3章
1.JavaScript语法 准备工作 一个普通的文本编辑器,一个Web浏览器. JavaScript代码必须通过Html文档才能执行,第一种方式是将JavaScript代码放到文档<head& ...
- Makefile当中宏定义传递字符串
前几天遇到类似的问题[http://bbs.chinaunix.net/thread-1589386-1-1.html]: 在Makefile里面定义一个字符串在程序里面使用, CFLAGS += - ...
- 安装Cygwin
如果你现在正在学习C语言,而你又不希望使用微软提供的任何C语言的任何编译器,那么你应该考虑一下GCC.GCC是运行于类UNIX系统下的编译器工具集,这又引出了另一个让人头疼的问题,你没有一台现成的装有 ...
- 清橙OJ 1082 查找第K小元素 -- 快速排序
题目地址:http://oj.tsinsen.com/A1082 问题描述 给定一个大小为n的数组s和一个整数K,请找出数组中的第K小元素. 这是一个补充程序的试题,你需要完成一个函数: int fi ...
- Poj 1054 The Troublesome Frog / OpenJudge 2812 恼人的青蛙
1.链接地址: http://poj.org/problem?id=1054 http://bailian.openjudge.cn/practice/2812 2.题目: 总时间限制: 10000m ...
- struct timespec 和 struct timeval
time()提供了秒级的精确度 . 1.头文件 <time.h> 2.函数原型 time_t time(time_t * timer) 函数返回从TC1970-1-1 0:0:0开始到现在 ...
- SET ANSI_NULLS ON
Transact-SQL 支持在与空值进行比较时,允许比较运算符返回 TRUE 或 FALSE. 通过设置 ANSI_NULLS OFF 可将此选项激活.当 ANSI_NULLS 为 OFF 时,如果 ...