Java JDBC批量执行executeBatch方法详解

JDBC事务

在数据库中,所谓事务是指一组逻辑操作单元,使数据从一种状态变换到另一种状态。为确保数据库中数据的一致性,数据的操纵应当是离散的成组的逻辑单元:当它全部完成时,数据的一致性可以保持,而当这个单元中的一部分操作失败,整个事务应全部视为错误,所有从起始点以后的操作应全部回退到开始状态。

事务的操作:先定义开始一个事务,然后对数据作修改操作,这时如果提交(COMMIT),这些修改就永久地保存下来,如果回退(ROLLBACK),数据库管理系统将放弃您所作的所有修改而回到开始事务时的状态。

事务的ACID属性

1. 原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。 

2. 一致性(Consistency)
事务必须使数据库从一个一致性状态变换到另外一个一致性状态。(数据不被破坏)

3. 隔离性(Isolation)
事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

4. 持久性(Durability)

持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响。

在JDBC中,事务默认是自动提交的,每次执行一个 SQL 语句时,如果执行成功,就会向数据库自动提交,而不能回滚

为了让多个 SQL 语句作为一个事务执行:

  1. 执行语句前调用 Connection 对象的 setAutoCommit(false); 以取消自动提交事务
  2. 在所有的 SQL 语句都成功执行后,调用 commit(); 方法提交事务
  3. 在出现异常时,调用 rollback(); 方法回滚事务。

JDBC批量执行

当需要成批插入或者更新记录时。可以采用Java的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理。通常情况下比单独提交处理更有效率

JDBC的批量处理语句包括下面两个方法:

addBatch(String):添加需要批量处理的SQL语句或是参数;

executeBatch();执行批量处理语句;

clearBatch();清除批量打包

通常我们会遇到两种批量执行SQL语句的情况:

多条SQL语句的批量处理;

for (int i = 1; i < 5000; i++) {
    sql = "insert into person(id,name,email) values(" + i",'name" + i + "','email" + i + "')";
    stmt.addBatch(sql);
    if((i+1)%1000==0){
        //批量处理
        stmt.executeBatch();
        //清除stmt中积攒的参数列表
        stmt.clearBatch();
    }
}

一个SQL语句的批量传参;

for(int i=1;i<100000;i++){
    pstmt.setInt(1, i);
    pstmt.setString(2, "name"+i);
    pstmt.setString(3, "email"+i);
    pstmt.addBatch();
    if((i+1)%1000==0){
        //批量处理
        pstmt.executeBatch();
        //清空pstmt中积攒的sql
        pstmt.clearBatch();
    }
}

JDBC执行SQL语句,有两个处理的接口,一个PreparedStatement,Statement,一般操作JDBC比较用得多的还是PreparedStatement

不过在执行批量,PreparedStatement有点不够Statement

ps = conn.prepareStatement(sql);
for(int i = 0;i<10;i++){
    ps.setString(1,"1");
    //PreparedStatement批处理方式一
    ps.addBatch();
}
//PreparedStatement批处理方式二
ps.addBatch("静态SQL");
ps.executeBatch();

这个是正常执行的

可是把PreparedStatement放到里面就没效了,以下:

for(int i = 0;i<10;i++){
   ps = conn.prepareStatement(sql);
   ps.setString(1,"1");
   ps.addBatch();
}
ps.executeBatch();

Statement适合循环赋值到sql,代码以下:

Statement st = conn.createStatement();

for(int i = 0;i<10;i++){

   st.addBatch("静态sql..........");

}

st.executeBatch();

这个是正常执行所有的语句

总结:造成这样的原因是

Statement st = conn.createStatement();这里可以不放SQL语句

ps = conn.prepareStatement(sql);这个一定要放初始SQL语句

JDBC的批处理不能加入select语句,否则会抛异常:

java.sql.BatchUpdateException: Can not issue SELECT via executeUpdate(). 
at com.MySQL.jdbc.StatementImpl.executeBatch(StatementImpl.java:1007)

到此这篇关于Java JDBC批量执行executeBatch方法详解的文章就介绍到这了,更多相关Java JDBC批量执行executeBatch内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java构建JDBC应用程序的实例操作

    我们在学习接口的时候.能够在里面做一些方法的调用.不过今天所要讲的JDBC,虽然也是连接数据库的一种接口,不过与类接口有着很大的区别,大家要注意区分.下面我们就构建JDBC的步骤进行了整理,还不会此类操作的小伙伴,一起来看看具体的内容吧. 1.加载数据库驱动. 通常使用 Class 类的 forName()静态方法来加载驱动. 例如如下代码: // 加载驱动 Class.forName(driverClass) 2.通过 DriverManager 获取数据库连接. DriverManager

  • Java 如何使用JDBC连接数据库

    一.使用JDBC连接数据库 1.使用JDBC-ODBC桥驱动程序连接数据库 基本步骤: (1)加载并注册数据库驱动 (2)通过DriverManager获取数据库连接 (3)通过Connection对象获取Statement对象 (4)使用Statement接口执行SQL语句 (5)操作ResultSet结果集 (6)关闭连接,释放资源 2.下面进行代码演示 1.注册数据库驱动程序的语法格式如下: DriverManager.registerDriver(Driver driver) 或者 Cl

  • Java 数据库连接(JDBC)的相关总结

    Java 数据库连接(Java DataBase Connectivity,缩写JDBC)是官方(sun公司)定义的一套操作所有关系型数据库的规则(即接口). 各个数据库厂商去实现这套接口,提供数据库驱动jar包.我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类. 一.JDBC API 概述 JDBC API主要位于JDK中的java.sql包中(之后扩展的内容位于javax.sql包中),主要包括(下面的接口,需驱动程序提供者来具体实现): DriverManage

  • java中封装JDBC工具类的实例分析

    对于能够重复使用的代码,我们最好的方法是对它们进行封装,然后在下次使用的使用就可以直接调用了.本篇所要提到的是JDBC工具类,相信大家在学习java时都接触过.那么对于封装它的方法,本篇先对工具类进行简单的说明,列出有关的封装步骤,然后带来相关的实例. 1.说明 在java开发过程中,代码中时常用到一些Scanner.Random一样的类,他们是键盘录入,生成随机数的类,像一个工具一样,在java中被称为工具类. 2.步骤 封装JDBC工具类 加入获取数据库连接对象的方法 加入释放连接的方法 3

  • java使用JDBC连接数据库的五种方式(IDEA版)

    JDBC是java访问数据库的基础,其余的mybatis和JDO 以及Hibernate 都是把jdbc封装起来,因此了解JDBC连接数据库的原理十分重要!! 准备工作 1. mysql的jar包 导入到lib目录下 2.把导入的jar包添加到项目中 点击jar包   选择 3.创建一个TestConnection类 五种方式如下: /** * @author * @date 2019 **/ import org.junit.Test; import java.io.InputStream;

  • Java连接 JDBC基础知识(操作数据库:增删改查)

    一.JDBC简介 JDBC是连接java应用程序和数据库之间的桥梁. 什么是JDBC? Java语言访问数据库的一种规范,是一套API. JDBC (Java Database Connectivity) API,即Java数据库编程接口,是一组标准的Java语言中的接口和类,使用这些接口和类,Java客户端程序可以访问各种不同类型的数据库.比如建立数据库连接.执行SQL语句进行数据的存取操作. JDBC代表Java数据库连接. JDBC库中所包含的API任务通常与数据库使用: 连接到数据库 创

  • Java JDBC自定义封装工具类的步骤和完整代码

    封装JDBC工具类的作用可以优化代码,提高开发效率 步骤 ① 创建配置文件(config.properties),用于存放注册驱动和连接数据库时所需要的参数值 ② 自定义一个类(JDBCUtils.java) ③ 实现构造私有方法 private JDBCUtils(){} ④ 声明所需要的配置变量 private static String driverClass; private static String url; private static String username; priva

  • Java连接MySQL8.0 JDBC的详细步骤(IDEA版本)

    一.导入jar包 1.下载jar包:https://dev.mysql.com/downloads/ 2.导入 在项目文件夹下新建一个名为lib的文件夹 将下载好的jar包放入lib文件夹,然后右击lib文件夹,选择Add as Library...,然后点击ok 二.代码部分 1.加载驱动 Class.forName("com.mysql.cj.jdbc.Driver"); 2.用户信息和url String url = "jdbc:mysql://localhost:33

  • Java JDBC批量执行executeBatch方法详解

    JDBC事务 在数据库中,所谓事务是指一组逻辑操作单元,使数据从一种状态变换到另一种状态.为确保数据库中数据的一致性,数据的操纵应当是离散的成组的逻辑单元:当它全部完成时,数据的一致性可以保持,而当这个单元中的一部分操作失败,整个事务应全部视为错误,所有从起始点以后的操作应全部回退到开始状态. 事务的操作:先定义开始一个事务,然后对数据作修改操作,这时如果提交(COMMIT),这些修改就永久地保存下来,如果回退(ROLLBACK),数据库管理系统将放弃您所作的所有修改而回到开始事务时的状态. 事

  • java 使用idea将工程打成jar并创建成exe文件类型执行的方法详解

    第一部分: 使用idea 打包工程jar 1.准备好一份 开发好的 可执行的 含有main方法的 工程. 例如:我随便写的main方法 public static void main(String[] args) throws IOException { Properties properties = System.getProperties(); String osName = properties.getProperty("os.name"); System.out.println

  • Java AtomicInteger类的使用方法详解

    首先看两段代码,一段是Integer的,一段是AtomicInteger的,为以下: public class Sample1 { private static Integer count = 0; synchronized public static void increment() { count++; } } 以下是AtomicInteger的: public class Sample2 { private static AtomicInteger count = new AtomicIn

  • Java this 关键字的使用方法详解

    Java this 关键字的使用方法详解 构造方法中的this关键字 构造方法是一个类的对象在通过new关键字创建时自动调用的,在程序中不能向调用其他方法一样通过方法名(也就是类名)来调用.但如果一个类有多个构造方法,可以在一个构造方法中通过this(paras-)来调用其他的构造方法. 使用this来调用其他构造方法有如下几个约束. 1) 只能在构造方法中通过this来调用其他构造方法,普通方法中不能使用. 2) 不能通过this递归调用构造方法,即不能在一个构造方法中通过this直接或间接调

  • 在IntelliJ IDEA中使用Java连接MySQL数据库的方法详解

    一.下载MySQL数据库并进行安装和配置 下载地址:https://dev.mysql.com/downloads/installer/ 二.下载JDBC连接器 下载地址:mysql-connector-java-8.0.22 下载好压缩包并解压后找到mysql-connector-java-8.0.22.jar文件放在自己指定的路径下. 三.在项目中导入jar包 用于测试数据库连接的测试类Test.java代码: import java.sql.Connection; import java.

  • Java并发编程之Exchanger方法详解

    简介 Exchanger是一个用于线程间数据交换的工具类,它提供一个公共点,在这个公共点,两个线程可以交换彼此的数据. 当一个线程调用exchange方法后将进入等待状态,直到另外一个线程调用exchange方法,双方完成数据交换后继续执行. Exchanger的使用 方法介绍 exchange(V x):阻塞当前线程,直到另外一个线程调用exchange方法或者当前线程被中断. x : 需要交换的对象. exchange(V x, long timeout, TimeUnit unit):阻塞

  • Java实现List去重的方法详解

    目录 简介 直接去重 根据对象属性去重 法1:TreeSet 法2:stream+TreeSet 所有代码 简介 本文用示例介绍Java的List(ArrayList.LinkedList等)的去重的方法. List去重的方法 一共有这几种方法(按推荐顺序排列): JDK8的stream的distinct 转为HashSet(分不保持顺序和保持顺序两种) 转为TreeSet 使用retainAll/removeAll.contains.equals等基本方法 直接去重 package com.e

  • Java实现ArrayList排序的方法详解

    目录 简介 法1:JDK8的stream 法2:Comparator#compare() 法3:Comparable#compareTo() 简介 说明 本文用示例介绍Java的ArrayList排序的方法. List排序方法 主要有三种方法(按推荐度排序): JDK8的stream Comparator#compare() Comparable#compareTo() 法1:JDK8的stream 见:一文详解Java中Stream流的使用 法2:Comparator#compare() 需求

  • java 中enum的使用方法详解

    java 中enum的使用方法详解 enum 的全称为 enumeration, 是 JDK 1.5 中引入的新特性,存放在 java.lang 包中. 下面是我在使用 enum 过程中的一些经验和总结. 原始的接口定义常量 public interface IConstants { String MON = "Mon"; String TUE = "Tue"; String WED = "Wed"; String THU = "Thu

  • Java 读取外部资源的方法详解及实例代码

    Java 读取外部资源的方法详解 在Java代码中经常有读取外部资源的要求:如配置文件等等,通常会把配置文件放在classpath下或者在web项目中放在web-inf下. 1.从当前的工作目录中读取: try { BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream("wkdir.txt"))); String str; while ((str = in.readLine())

随机推荐