综述

批量处理一般指批量插入,批量更新,删除通过可以指定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. [CF1304E] 1-Trees and Queries - LCA

    由于可以走重边,所以任意一条路径长 + 2 仍然对应至少一条合法路径 很显然我们有 \(3\) 种基本路径 不经过 \((x,y)\) 经过 \(x \to y\) 经过 \(y \to x\) 假设 ...

  2. SpringBoot学习- 9、Slf4j日志

    SpringBoot学习足迹 在上一篇学习中 通过画红线的注解,可以直接在下面log.debug输出日志到控制台,但是写日志文件就没那么顺利了,一直不成功,找了N种配置,以下配置方法可行 首先确保已引 ...

  3. 巨杉Tech | SequoiaDB虚机镜像正式上线

    数据库云化架构需求 随着云架构的发展和流行,在业务和应用进行“云化”的过程中,云数据库因为在整体架构中的重要地位,在云化改造中的重要性不言而喻.云数据库需要满足这些技术要求,除了在功能上的具体提升,在 ...

  4. CSS的字体样式

    CSS的字体样式 1. span标签(约定俗成:重要的东西用它括起来) 首选介绍一个约定俗成的东西:span标签.一般将想要突出的东西,比较重要的东西,用span标签括起来. 比如,”学习Java“这 ...

  5. CodeForces 1141B

    https://vjudge.net/problem/CodeForces-1141B #include<bits/stdc++.h> using namespace std; int m ...

  6. pytorch之max()函数

    pytorch之max()函数 待办 返回对应给定中最大值的索引,方便进行和target结果的索引进行比较 索引方式见下 https://blog.csdn.net/liuweiyuxiang/art ...

  7. print format

    python基础_格式化输出(%用法和format用法) name = 'jack' age = 18 sex = 'man' job = "IT" salary = 9999.9 ...

  8. SigXplorer设置延时及Local_Global

    通过SigXplorer设置绝对延时和相对延时及对Local-Global的理解 一.基本理解 (感觉可能有偏差) 在于博士的教程第44和45讲中,分别对绝对延时和相对延时进行了设置,通过SigXpl ...

  9. 计算a除b的第一位小数 in C++.

    my codes: #include<iostream> #include<cstdio> using namespace std; int main() { int a,b; ...

  10. 【转载】extern "C" __declspec(dllexport) __declspec(dllimport) 和 def

    转自:http://www.cppblog.com/FateNo13/archive/2009/08/03/92052.html 前面的extern "C"  __declspec ...