综述

批量处理一般指批量插入,批量更新,删除通过可以指定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——功能第五篇——批量处理的更多相关文章

  1. 数据库程序接口——JDBC——功能第四篇——事务之Spring事务

    综述 事务的实现方式有三种,JTA,Spring事务,Web Container方式.本篇讲述Spring事务. Spring事务分为两个部分核心对象,Spring事务的实现方式. Spring事务实 ...

  2. 数据库程序接口——JDBC——功能第一篇——第一个程序

    流程图 综述 从零开始搭建JDBC环境.通过创建Java项目,在项目中,通过java程序执行SQL,并处理返回的结果.本文通过执行 select 1 from dual 语句来测试,并输出相结果集.首 ...

  3. 数据库程序接口——JDBC——功能第二篇——数据源之C3P0数据源

    综述 C3P0由三部分内容组成.实例化对象,各配置项的含义,以及加载配置项的方式. 实例化对象的方式有三种,第一种方式直接new ComboPooledDataSource,第二种方式使用工厂类Dat ...

  4. 数据库程序接口——JDBC——API解读第一篇——建立连接的核心对象

    结构图 核心对象 Driver Java通过Driver接口表示驱动,每种类型的数据库通过实现Driver接口提供自己的Driver实现类. Driver由属性,操作,事件三部分组成. 属性 公共属性 ...

  5. 数据库程序接口——JDBC——API解读第二篇——执行SQL的核心对象

    结构图 核心对象 Statement Statement主要用来执行SQL语句.它执行SQL语句的步骤为: 第一步:创建statement对象. 第二步:配置statement对象,此步骤可以忽略. ...

  6. 数据库程序接口——JDBC——初篇——目录

    目录 建立连接 核心对象 Driver DriverManager Connection DataSource 常用功能 第一个程序 C3P0数据源 DBCP数据源 事务之Spring事务 执行SQL ...

  7. 数据库程序接口——JDBC——API解读第三篇——处理结果集的核心对象

    核心对象 处理结果集的核心对象有ResultSet和RowSet.其中ResultSet指定关系型数据库的结果集,RowSet更为抽象,凡是由行列组成的数据都可以. ResultSet ResultS ...

  8. mybatis连接mysql数据库实现的jdbc功能

    最近公司项目要使用myBatis,自己以前没有接触过,就在网上找到了一些资料研究了些.初步做出了基于myBatis连接mysql数据库的jdbc实现的功能. employee.java package ...

  9. 程序员与数据库打交道的JDBC知识概要

    1.JDBC全称:Java database connectivity,Java数据库连接. (1)           JDBC是一种用于执行SQL语句的Java API,为多种关系数据库提供多种统 ...

随机推荐

  1. HCTF2018-admin[条件竞争]

    附上网上师傅的wp  学习链接: https://www.jianshu.com/p/f92311564ad0 按照师傅的wp复现一下: 源代码审计,去看路由里的login函数和change函数都在没 ...

  2. AcWing 482. 合唱队形

    #include<iostream> using namespace std ; ; int f[N],g[N]; int w[N]; int main() { int n; cin> ...

  3. 后台异常 - Unrecognized Windows Sockets error: 0: JVM_Bind

    问题描述 LifecycleException:  Protocol handler initialization failed: java.net.SocketException: Unrecogn ...

  4. Python3标准库:string通用字符串操作

    1. string:通用字符串操作 string模块在很早的Python版本中就有了.以前这个模块中提供的很多函数已经移植为str对象的方法,不过这个模块仍保留了很多有用的常量和类来处理str对象. ...

  5. JS高级---函数中的this的指向,函数的不同调用方式

    函数中的this的指向 普通函数中的this是谁?-----window 对象.方法中的this是谁?----当前的实例对象 定时器方法中的this是谁?----window 构造函数中的this是谁 ...

  6. IIS的部署

    https://blog.csdn.net/miner_k/article/details/69388726 https://blog.csdn.net/miner_k/article/details ...

  7. 8.1.1 IO

    IO对象无拷贝或赋值.进行IO操作的函数通常以引用的方式传递和返回流,且该引用不能是const的 确定一个流对象是否处于良好状态的最简单的方法是将它作为一个条件来使用 while (cin >& ...

  8. 题解【CJOJ1371】[IOI2002]任务安排

    P1371 - [IOI2002]任务安排 Description N个任务排成一个序列在一台机器上等待完成(顺序不得改变),这N个任务被分成若干批,每批包含相邻的若干任务.从时刻0开始,这些任务被分 ...

  9. JS实现点击table中任意元素选中

    上项目开发,忙的焦头烂额,博客也没咋更新了. 昨天老师提了个需求,简单的小例子,选择tr中任一行选中tr,觉得很有意思,记录一下: 上代码 <!DOCTYPE html> <html ...

  10. Centos7 FRPS

    #下载Sever端 wget https://github.com/fatedier/frp/releases/download/v0.16.1/frp_0.16.1_linux_amd64.tar. ...