JDBC批处理数据
JDBC3.0 的增强支持BLOB,CLOB,ARRAY,REF数据类型。的ResultSet对象UPDATEBLOB(),updateCLOB(),updateArray()和updateRef()方法,使您可以在服务器上直接操作相应的数据。
JDBC提供了数据库batch处理的能力,在数据大批量操作(新增、删除等)的情况下可以大幅度提升系统的性能。
当几个SQL语句一次发送到数据库中,可以减少通信开销,从而提高性能。
JDBC驱动程序不支持此功能。您应该使用DatabaseMetaData.supportsBatchUpdates()方法来确定目标数据库支持批量更新处理。如果你的JDBC驱动程序支持此功能,则该方法返回true。
addBatch()方法的声明,PreparedStatement和CallableStatementis用于添加单个语句的批处理。 executeBatch()将开始执行的所有语句组合到一起。
executeBatch()将返回一个整数数组,每个数组元素的表示为相应的更新语句的更新计数。
可以添加语句进行批处理,可以clearBatch()方法删除它们。此方法将删除addBatch()方法添加的所有语句。但是,你不能有选择性地选择语句来删除。
// 关闭自动执行
con.setAutoCommit(false);
Statement stmt = con.createStatement();
禁用了自动执行模式,从而在调用 Statement.executeBatch() 时可以防止 JDBC 执行事务处理。禁用自动执行使得应用程序能够在发生错误及批处理中的某些命令不能执行时决定是否执行事务处理。因此,当进行批处理更新时,通常应该关闭自动执行。
在JDBC 2.0 中,Statement 对象能够记住可以一起提交执行的命令列表。创建语句时,与它关联的命令列表为空。Statement.addBatch() 方法为调用语句的命令列表添加一个元素。如果批处理中包含有试图返回结果集的命令,则当调用 Statement. executeBatch() 时,将抛出 SQLException。
只有 DDL 和 DML 命令(它们只返回简单的更新计数)才能作为批处理的一部分来执行。如果应用程序决定不提交已经为某语句构
造的命令批处理,则可以调用方法 Statement.clearBatch()(以上没有显示)来重新设置批处理。
Statement.executeBatch() 方法将把命令批处理提交给基本 DBMS 来执行。命令的执行将依照在批处理中的添加顺序来进行。ExecuteBatch() 为执行的命令返回更新计数数组。数组中对应于批处理中的每个命令都包含了一项,而数组中各元素依据命令的执行顺序(这还是和命令的最初添加顺序相同)来排序。调用executeBatch() 将关闭发出调用的 Statement 对象的当前结果集(如果有一个结果集是打开的)。executeBatch() 返回后,将重新将语句的内部批处理命令列表设置为空。
如果批处理中的某个命令无法正确执行,则 ExecuteBatch() 将抛出BatchUpdateException。可以调用BatchUpdateException.getUpdateCounts() 方法来为批处理中成功执行的命令返回更新计数的整型数组。因为当有第一个命令返回错误时,Statement.executeBatch() 就中止,而且这些命令是依据它们在批处理中的添加顺序而执行的。所以如果 BatchUpdateException.getUpdateCounts() 所返回的数组包含 N 个元素,这就意味着在调用 executeBatch() 时批处理中的前 N 个命令被成功执行。
try {
int row;
Connection connection = null;
// 关闭自动提交
connection.setAutoCommit(false);
String sql = "insert into tb_student(id,name,sex,age) values(?,?,?,?)";
PreparedStatement preparedStatement = (PreparedStatement) connection.prepareStatement(sql);
Random random = new Random();
for (int i = 0; i < 10; i++) {
preparedStatement.setInt(1, i + 1);
preparedStatement.setString(2, "学生" + i);
preparedStatement.setBoolean(3, i % 2 == 0 ? true : false);
preparedStatement.setInt(4, random.nextInt(5) + 10);
preparedStatement.addBatch(); //将for循环的一组参数添加到添加PreparedStatement对象的批处理命令中
}
int[] rows = preparedStatement.executeBatch(); //PreparedStatement对象的批处理SQL提交给数据库,返回跟新计数的数组
row = rows.length;
} catch (Exception e) {
e.printStackTrace();
}
返回: 10
也可以采用下面方式添加:
stmt.addBatch("insert into employee(id,name,sex,phone) values(1,"qg",1,"**********")");
JDBC - 数据流:
PreparedStatement对象有能力使用提供参数数据的输入和输出流。这使您可以将整个文件到数据库中,可容纳较大的值,如CLOB和BLOB数据类型的列。
有下列方法可用于流数据:
setAsciiStream(): 此方法用于提供大的ASCII值。
setCharacterStream(): 此方法用于提供大的UNICODE值。
setBinaryStream(): 使用此方法,以提供大的二进制值。
setXXXStream()方法需要一个额外的参数,文件大小,除了参数占位符。此参数通知应发送多少数据的数据库,使用流的驱动程序。
JDBC批处理数据的更多相关文章
- Java JDBC批处理插入数据操作
在此笔记里,我们将看到我们如何可以使用像Statement和PreparedStatement JDBC API来批量在任何数据库中插入数据.此外,我们将努力探索一些场景,如在内存不足时正常运行,以及 ...
- Java JDBC批处理插入数据操作(转)
在此笔记里,我们将看到我们如何可以使用像Statement和PreparedStatement JDBC API来批量在任何数据库中插入数据.此外,我们将努力探索一些场景,如在内存不足时正常运行,以及 ...
- java中使用JDBC的preparedStatement批处理数据的添加
在项目中我们偶尔可能会遇到批量向数据库中导入数据,如果批处理的情况较多的情况下可以使用spring batch,如果只是一个导入功能的话可以考虑使用jdbc的preparedStatement处理. ...
- mysql/oracle jdbc大数据量插入优化
10.10.6 大数据量插入优化 在很多涉及支付和金融相关的系统中,夜间会进行批处理,在批处理的一开始或最后一般需要将数据回库,因为应用和数据库通常部署在不同的服务器,而且应用所在的服务器一般也不会 ...
- 一、JDBC的概述 二、通过JDBC实现对数据的CRUD操作 三、封装JDBC访问数据的工具类 四、通过JDBC实现登陆和注册 五、防止SQL注入
一.JDBC的概述###<1>概念 JDBC:java database connection ,java数据库连接技术 是java内部提供的一套操作数据库的接口(面向接口编程),实现对数 ...
- mybatis批处理数据
批处理数据主要有三种方式: 1.传统jdbc处理 2.mybatis批处理插入 3.使用executortype处理 jdbc 处理 1.通过 for循环插入 main方法如下所示: Co ...
- JAVA JDBC大数据量导入Mysql
转自https://blog.csdn.net/q6834850/article/details/73726707?tdsourcetag=s_pctim_aiomsg 采用JDBC批处理(开启事务. ...
- mysql 存储过程在批处理数据中的应用
最近批处理数据的时候,突然想到:为什么不使用存储过程进行数据批处理? 为什么要进行批处理? 自答:减少数据库连接次数,提高效率. 存储过程批处理数据的优点:一次编译,永久执行. 这次的批处理逻辑较简单 ...
- 【转】在Spring中基于JDBC进行数据访问时怎么控制超时
http://www.myexception.cn/database/1651797.html 在Spring中基于JDBC进行数据访问时如何控制超时 超时分类 超时根据作用域可做如下层级划分: Tr ...
随机推荐
- Unity3D-UGUI图集打包与动态使用(TexturePacker)
参考地址: http://blog.csdn.net/cjsen/article/details/52487706 今天做项目大佬看我在做图集,就跟我说可以用工具打包图集,也就是TexturePack ...
- java从小白到架构师大牛必看书籍
一.基础类 1.<ThinkingJava>,入门第一位是建立正确的概念. 2.<Core Java>,我没系统读过,这本书更贴近实践,更多API的介绍,同样,更新也更频繁. ...
- Dom节点操作常用方法
1.访问/获取节点 document.getElementById(id); //返回对拥有指定id的第一个对象进行访问 document.getElementsByName(name); //返回带 ...
- poj2942 点-双联通+二分图染色
题意:有一群骑士要坐在一个圆形的桌子上,他们之间有些人相互讨厌,所以不能挨着,要求算出一次也不能坐在桌子上的人,每次会议桌子必须奇数个人,一个人不能开会 题解:可以先建一个补图,要满足题目条件我们只要 ...
- 关于一家大型互联网公司的.NET面试
上周去了一家大型的互联网公司去面试!四个面试官提的问题整理下!以后会注明答案! 1.关于垃圾回收的过程!GC的过程 其中包含:什么是根,Finalize与Dispose的区别,什么时候用到!IDisp ...
- LeetCode OJ:Balanced Binary Tree(平衡二叉树)
Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary ...
- windows下安装 redis并开机自启动
1,redis官方下载地址:https://redis.io/download,redis 64位下载地址:https://github.com/ServiceStack/redis-windows, ...
- nginx中关于并发数的问题worker_connections,worker_processes
我认为,要搞清楚这个公式是否正确,以及如何计算的,那首先要对nginx的各个配置说明有清晰的认识: 从用户的角度,http 1.1协议下,由于浏览器默认使用两个并发连接,因此计算方法: nginx作为 ...
- Docker 容器相关技术
Docker 依赖的Linux内核特性 Namespaces 命名空间 Control groups (cgroups) 控制组 理解这两个特性,能够更好的帮助我们理解docker的资源分配和管理 N ...
- django的settings文件
转载:http://www.cnblogs.com/likeshan168/articles/3596344.html