综述

批量处理一般指批量插入,批量更新,删除通过可以指定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. [TJOI2007] 路标设置 - 二分答案,贪心

    考虑到答案满足可二分性,段内可以贪心,所以暴力二分即可 注意-1 详见代码(我这题都能写WA) #include <bits/stdc++.h> using namespace std; ...

  2. Hbase javaAPI(工具类)表的增删改查

    建立连接: package Init; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.*; i ...

  3. PHP不使用第三个变量,如何实现两个变量值互换(变量值自定)

    1.使用函数: $a = 123; $b = 456; list($b,$a) =array($a,$b); 2.数学算式:$a =$a+$b-$b; $a =2; $b =1; $a =$a+$b; ...

  4. python+selenium自动化禅道登录测试

    本文以禅道登录测试为例,思路主要分openBrowser.openUrl.findElement.sendVals.checkResult.ReadUserdate六部分 openBrowser de ...

  5. 题解【AcWing271】杨老师的照相排列

    题面 经典的线性 \(\text{DP}\) . 设 \(dp_{a,b,c,d,e}\) 表示第 \(1\) 排有 \(a\) 个人,第 \(2\) 排有 \(b\) 个人, 第 \(3\) 排有 ...

  6. Linux - Shell - 算术表达式 - 算数运算

    概述 shell 中基于 $(()) 的 算数运算 背景 复习 shell 脚本 凑数吧 准备 环境 os centos7 1. 算数运算 代码 #!/bin/bash # $(()) 的数学运算, ...

  7. LED Decorative Light Supplier - LED Environmental Decorative Lighting Application

    Creating ambient lighting in the home can bridge the gap between the internal world and the outside ...

  8. 【JS】网站运行时间

    <span id="sitetime"></span> <script language=javascript> function siteTi ...

  9. 金蝶云星空使用WebAPI来新增单据

    有很多客户需求在后台自动生成某张单据,金蝶云星空提供了WebApi,包含了保存,提交,审核,删除单据的接口,下面以生产订单的保存,提交,审核为例,说明一下应用WebApi后台自动生成生产订单的功能,下 ...

  10. 一则关于控制文件全部丢失后如何重新编目RMAN元数据的简单实验

    主题:一则简单的RMAN元数据编目实验,来自于博客园AskScuti. 场景:RMAN备份完整情况下,未使用Catalog目录库.删除了所有的控制文件,在手工重建后,导致记录在控制文件中的RMAN备份 ...