数据库程序接口——JDBC——功能第五篇——批量处理
综述
批量处理一般指批量插入,批量更新,删除通过可以指定where条件实现。批量插入的实现方式有三种类型。statement,preparedStatement,callableStatement。
Java代码
/**
* 演示批量插入的三种方式
* @throws SQLException
*/
public static void batchInsert() throws SQLException
{
// 使用Statement对象进行批量插入,可以执行不同的sql语句
insertByStatement();
// 使用PreStatement对象进行批量插入,一条sql语句,多行参数
insertByPreparedStatement();
// 使用CallableStatement对象进行批量插入,一条存储过程,多行参数,当表结构修改时,只需要修改存储过程。
insertByCallableStatement();
}
Statement方式
Statement方式批量执行SQL的优点在于可以执行多条SQL语句,缺点也很明显,需要改变SQL语句时需要修改程序,每次执行都需要重新编译SQL。下面通过举例说明。
示例演示往数据库student表,book表中批量插入数据。
student表有四个字段,stu_name(学号,INTEGER类型),stu_name(名称,varchar2(200)),stu_age(年龄,INTEGER类型),stu_class(班级,varchar2(200))。
CREATE TABLE "STUDENT"
(
"STU_NUM" NUMBER(*,0),
"STU_NAME" VARCHAR2(200),
"STU_AGE" NUMBER(*,0),
"STU_CLASS" VARCHAR2(200)
)
book表中有四个字段,num(编号,INTEGER类型),name(名称,varchar2(200)),type(类型,varchar2(200))。
CREATE TABLE "SYSTEM"."BOOK"
(
"NUM" NUMBER(*,0),
"NAME" VARCHAR2(200),
"TYPE" VARCHAR2(200)
)
Java代码
/**
* 通过Statement对象进行批量插入
* @throws SQLException
*/
private static void insertByStatement() throws SQLException
{
// 获取连接对象
Connection conn = ConnectionUtil.getConn();
// 获取Statement对象
Statement state = conn.createStatement();
// 不同的sql语句,不同的表, studentSql为插入student表,bookSql为插入book表
// stu_num(学号),stu_name(名称),stu_age(年龄),stu_class("班级")
String studentSql = "insert into student values(1,'test1',25,'333班')";
// num(图书编号),name(名称),type(类型)
String bookSql = "insert into book values(1,'book1','杂志')";
// 添加sql语句,
state.addBatch(studentSql);
state.addBatch(bookSql);
// 执行sql
state.executeBatch();
// 清空批量
state.clearBatch();
// 关闭statement对象
state.close();
}
PreparedStatement方式
PreparedStatement优点是SQL语句结构不变,并且经过预编译,所以一般适用于一条SQL语句,多行参数。对于插入场景很适用。但是需要知道表中拥有哪些字段,如何设置这些值,如果表结构修改,需要修改代码。
Java代码
/**
* 通过PreparedStatement对象进行批量插入
* @throws SQLException
*/
private static void insertByPreparedStatement() throws SQLException
{
// 获取连接对象
Connection conn = ConnectionUtil.getConn();
// 插入Sql语句
String insertSql = "insert into student values(?,?,?,?)";
// 获取PreparedStatement对象
PreparedStatement preStatement = conn.prepareStatement(insertSql);
// 设置参数
for(int i=2;i<100;i++)
{
// 添加批量执行批量,相比于Statement的方式,一条sql语句,多行参数,适用于单表插入
setPreparedStatementParam(preStatement, i, "test"+i, 23, "333班");
preStatement.addBatch();
} preStatement.executeBatch();
// 清空批量,关闭对象
preStatement.clearBatch();
preStatement.close();
} /**
* 为PreparedStatement对象设置参数
* @param preStatement PreParedStament对象
* @param stuNum 学号
* @param name 姓名
* @param age 年龄
* @param stuClass 班级
* @throws SQLException
*/
private static void setPreparedStatementParam(PreparedStatement preStatement, int stuNum, String name, int age,
String stuClass) throws SQLException
{
preStatement.setInt(1, stuNum);
preStatement.setString(2, name);
preStatement.setInt(3, age);
preStatement.setString(4, stuClass);
}
CallableStatement方式
CallableStatement的方式优点在于只需要了解存储过程中的使用,不需要了解表结构,当表结构改变时,不用修改程序.
存储过程
create or replace procedure insertStudentProc
(stu_num in INTEGER,name in varchar2)
as
begin
insert into student values(stu_num,name,25,'存储过程');
commit;
end;
Java代码
/**
* 通过CallableStatement对象进行批量插入
* @throws SQLException
*/
private static void insertByCallableStatement() throws SQLException
{
// 获取连接对象
Connection conn = ConnectionUtil.getConn();
// 第一个参数为学号,第二个参数为名称
String callSql = "{call insertStudentProc(?,?)}";
// 创建CallableStatement对象
CallableStatement callStatement = conn.prepareCall(callSql);
// 设置参数
for(int i=100;i<200;i++)
{
setCallableStatementParam(callStatement, i, "test"+i);
callStatement.addBatch();
}
// 执行批量操作
callStatement.executeBatch();
// 清空批量,关闭对象
callStatement.clearBatch();
callStatement.close();
} /**
* 为CallableStatement对象设置参数
* @param callStatement CallableStatement对象
* @param stuNum 学号
* @param name 姓名
* @throws SQLException
*/
private static void setCallableStatementParam(CallableStatement callStatement,int stuNum,String name) throws SQLException
{
callStatement.setInt(1, stuNum);
callStatement.setString(2, name);
}
至此本篇内容结束
数据库程序接口——JDBC——功能第五篇——批量处理的更多相关文章
- 数据库程序接口——JDBC——功能第四篇——事务之Spring事务
综述 事务的实现方式有三种,JTA,Spring事务,Web Container方式.本篇讲述Spring事务. Spring事务分为两个部分核心对象,Spring事务的实现方式. Spring事务实 ...
- 数据库程序接口——JDBC——功能第一篇——第一个程序
流程图 综述 从零开始搭建JDBC环境.通过创建Java项目,在项目中,通过java程序执行SQL,并处理返回的结果.本文通过执行 select 1 from dual 语句来测试,并输出相结果集.首 ...
- 数据库程序接口——JDBC——功能第二篇——数据源之C3P0数据源
综述 C3P0由三部分内容组成.实例化对象,各配置项的含义,以及加载配置项的方式. 实例化对象的方式有三种,第一种方式直接new ComboPooledDataSource,第二种方式使用工厂类Dat ...
- 数据库程序接口——JDBC——API解读第一篇——建立连接的核心对象
结构图 核心对象 Driver Java通过Driver接口表示驱动,每种类型的数据库通过实现Driver接口提供自己的Driver实现类. Driver由属性,操作,事件三部分组成. 属性 公共属性 ...
- 数据库程序接口——JDBC——API解读第二篇——执行SQL的核心对象
结构图 核心对象 Statement Statement主要用来执行SQL语句.它执行SQL语句的步骤为: 第一步:创建statement对象. 第二步:配置statement对象,此步骤可以忽略. ...
- 数据库程序接口——JDBC——初篇——目录
目录 建立连接 核心对象 Driver DriverManager Connection DataSource 常用功能 第一个程序 C3P0数据源 DBCP数据源 事务之Spring事务 执行SQL ...
- 数据库程序接口——JDBC——API解读第三篇——处理结果集的核心对象
核心对象 处理结果集的核心对象有ResultSet和RowSet.其中ResultSet指定关系型数据库的结果集,RowSet更为抽象,凡是由行列组成的数据都可以. ResultSet ResultS ...
- mybatis连接mysql数据库实现的jdbc功能
最近公司项目要使用myBatis,自己以前没有接触过,就在网上找到了一些资料研究了些.初步做出了基于myBatis连接mysql数据库的jdbc实现的功能. employee.java package ...
- 程序员与数据库打交道的JDBC知识概要
1.JDBC全称:Java database connectivity,Java数据库连接. (1) JDBC是一种用于执行SQL语句的Java API,为多种关系数据库提供多种统 ...
随机推荐
- shell循环结构解析:for/while/case
1.for循环结构 for var in item1 item2 ... itemN do command1 command2 ... commandN done 例如,顺序输出当前列表中的数字: # ...
- [0CTF 2016]piapiapia{PHP反序列化漏洞(PHP对象注入)}
先上学习链接: https://www.freebuf.com/column/202607.html https://www.cnblogs.com/ichunqiu/p/10484832.html ...
- c++踩坑大法好 typedef和模板
1,typedef字面意思,自定义一种数据类型 语法:typedef 类型名称 类型标识符; 基本用法: 1) 为基本数据类型定义新的类型名. 2) 为自定义数据类型(结构体.公用体和枚举类型)定义简 ...
- pom.xml文件中dependency标签的scope子标签
1.最近整合了公司的一个项目A,而A又依赖项目B,项目B中pom.xml中有一个依赖的<scope>provided</scope>,查了一下,原来provided属性,jar ...
- hibernate跟Mybatis/ ibatis 的区别,为什么选择?(转)
第一章 Hibernate与MyBatisHibernate 是当前最流行的O/R mapping框架,它出身于sf.NET,现在已经成为Jboss的一部分. Mybatis 是另外一种优秀的O/R ...
- Introduction to Writing Functions in R
目录 在R中编写函数 args(函数名) 创建一个函数的步骤 1.default args Passing arguments between functions Checking arguments ...
- WPF MVVM 键盘按键事件绑定
<TextBox Text="{Binding LoginName}" Height="35" Canvas.Left="306" T ...
- JavaScript对象之get/set方法
我们可以重写js对象属性的get和set方法. 从上图我们可以看出set和get的语法. 上图则是使用set和get方法对对象的属性进行了输入校验. 从上图可得若对象的原型链上具有不可配置的同名属性( ...
- ASP.NET + MVC5 入门完整教程四---MVC 中使用扩展方法
https://blog.csdn.net/qq_21419015/article/details/80433640 1.示例项目准备1)项目创建新建一个项目,命名为LanguageFeatures ...
- Scale9Sprite不要在初始化的时候setCapInsets
let scale9Sprite = new ccui.Scale9Sprite(filePath);scale9Sprite.setCapInsets(cc.rect(x,y,w,h)); 而非 l ...