JDBC操作数据库的批处理
在JDBC开发中,操作数据库需要与数据库建立连接,然后将要执行的SQL语句传送到数据库服务器,最后关闭数据库连接,都是按照这样一个流程进行操作的。如果按照该流程执行多条SQL语句,那么就需要建立多个数据库连接,这样会将时间浪费在数据库连接上。针对这一问题,JDBC的批处理提供了很好的解决方案。
JDBC中批处理的原理是将批量的SQL语句一次性发送到数据库中进行执行,从而解决多次与数据库连接所产生的速度瓶颈。
例1.1 创建学生信息表,通过JDBC的批处理操作,一次性将多个学生信息写入到数据库中。
(1)创建学生信息表tb_student_batch,其结构如下所示:
(2)创建名称为Batch的类,该类用于实现对学生信息的批量添加操作。首先在Batch类中编写getConnection()方法,用于获取数据库连接Connection对象,其关键代码如下:
/**
* 获取数据库连接
* @return Connection 对象
*/
public Connection getConnection(){
Connection conn=null;
try {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/stu";
String user = "root";
String password = "1234";
conn=DriverManager.getConnection(url, user, password);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
然后编写saveBatch()方法,实现批量添加学生信息功能,实例中主要通过PreparedStatement对象批量添加学生信息。关键代码如下:
/**
* 批量添加数据
* @return 所影响的行数
*/
public int saveBatch(){
int row=0;
Connection conn=getConnection();
try {
String sql = "insert into tb_student_batch(id,name,sex,age) values(?,?,?,?)";
PreparedStatement ps = conn.prepareStatement(sql);
Random random = new Random();
for(int i=0;i<10;i++){
ps.setInt(1, i+1);
ps.setString(2, "学生"+i);
ps.setBoolean(3, i%2==0?true:false);
ps.setInt(4, random.nextInt(5)+10);
ps.addBatch(); //添加批处理命令
}
int[] rows = ps.executeBatch(); //执行批处理操作并返回计数组成的数组
row = rows.length;
ps.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return row; //返回添加的行数
}
注意:PreparedStatement对象的批处理操作调用的是executeBatch()方法,而不是execute()方法或者executeUpdate()方法。
(3)创建程序中的首页面index.jsp,在该页面中通过<jsp:useBean>实例化Batch对象,并执行批量添加数据操作。关键代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head> <body>
<jsp:useBean id="batch" class="com.cn.gao.Batch"></jsp:useBean>
<%
//执行批量插入操作
int row = batch.saveBatch();
out.print("批量插入了【"+row+"】条数据");
%>
</body>
</html>
实例运行后,程序向数据库批量添加了10条学生信息数据,其运行结果如下图所示:
运行成功后,可以打开数据表tb_student_batch进行查看,其效果如下:
JDBC操作数据库的批处理的更多相关文章
- JDBC操作数据库之批处理
JDBC开发中,操作数据库需要和数据库建立连接,然后将要执行的SQL语句发送到数据库服务器,最后关闭数据库连接,都是按照这样的操做的,如果按照此流程要执行多条SQL语句,那么就要建立多个数据库连接,将 ...
- 使用JDBC对数据库实现批处理操作
本篇讲述如何使用JDBC对数据库实现批处理操作.很多时候单条SQL命令不能满足我们的需求,我们需要对数据库一次实现很多操作,需要发送一批SQL命令给数据库执行. 而JDBC也提供了相应的方法给我们实现 ...
- 用于JDBC操作数据库的公共类
/* * @(#)CommonSql.java 2011-9-5 * * Copyright 2011 Bianjing,All rights reserved. */ import java.sql ...
- JDBC操作数据库的学习(2)
在上一篇博客<JDBC操作数据库的学习(1)>中通过对例1,我们已经学习了一个Java应用如何在程序中通过JDBC操作数据库的步骤流程,当然我们也说过这样的例子是无法在实际开发中使用的,本 ...
- JDBC操作数据库的学习(1)
单单对数据库的操作,比如说MySQL,我们可以在命令行窗口中执行,但是一般是应用程序要操作数据库,因此我们应该在程序中的代码上体现对数据库的操作,那么使用程序应用如何操作数据库呢?那就要使用到数据库的 ...
- JDBC操作数据库的三种方式比较
JDBC(java Database Connectivity)java数据库连接,是一种用于执行上sql语句的javaAPI,可以为多种关系型数据库提供统一访问接口.我们项目中经常用到的MySQL. ...
- Spark Streaming通过JDBC操作数据库
本文记录了学习使用Spark Streaming通过JDBC操作数据库的过程,源数据从Kafka中读取. Kafka从0.10版本提供了一种新的消费者API,和0.8不同,因此Spark Stream ...
- JDBC操作数据库的基本步骤:
JDBC操作数据库的基本步骤: 1)加载(注册)数据库驱动(到JVM). 2)建立(获取)数据库连接. 3)创建(获取)数据库操作对象. 4)定义操作的SQL语句. 5)执行数据库操作. 6)获取并操 ...
- springboot学习-jdbc操作数据库--yml注意事项--controller接受参数以及参数校验--异常统一管理以及aop的使用---整合mybatis---swagger2构建api文档---jpa访问数据库及page进行分页---整合redis---定时任务
springboot学习-jdbc操作数据库--yml注意事项--controller接受参数以及参数校验-- 异常统一管理以及aop的使用---整合mybatis---swagger2构建api文档 ...
随机推荐
- java 代理设计模式
首先代理(deleration)是什么,在日常生活中我们有很多这种的例子,比如你上个QQ,各种空间被什么代理刷屏,对的,代理不是生产产品的商家,也不是进购产品的卖家,他们只是帮别人卖东西,这就相当于一 ...
- 数据挖掘算法:关联分析二(Apriori)
二.Apriori算法 上文说到,大多数关联规则挖掘算法通常采用的策略是分解为两步: 频繁项集产生,其目标是发现满足具有最小支持度阈值的所有项集,称为频繁项集(frequent itemset). 规 ...
- 洛谷P3527 [POI2011]MET-Meteors [整体二分]
题目传送门 Meteors 格式难调,题面就不妨放了. 分析: 一道整体二分的练手题. 就是一般的整体二分的套路,但是要注意,将修改和询问加入队列的时候要先加修改再加询问.另外,博主代码打得太丑,常数 ...
- Luogu P4606 [SDOI2018] 战略游戏 圆方树 虚树
https://www.luogu.org/problemnew/show/P4606 把原来的图的点双联通分量缩点(每个双联通分量建一个点,每个割点再建一个点)(用符合逻辑的方式)建一棵树(我最开始 ...
- weighttp 使用
Weighttp 地址 http://redmine.lighttpd.net/projects/weighttp/wiki Weighttp的介绍:weighttp is a lightweigh ...
- [ZHOJ1956]vfk的地雷
题目大意: 有$n$个开关,$r$句话. 每个开关$i$有$p_i$的概率被触发,并造成$d_i$的代价. 每个开关至多被触发一次,一句话至多触发一个开关. 每个开关按照顺序被尝试触发. 求期望代价. ...
- bzoj 2011
决策单调性,对于一个1D/1D(状态是一维,转移也是一维)的DP,如果DP的决策具有单调性,那么就可以做到O(nlogn)的复杂度完成DP. 感谢<1D/1D 动态规划优化初步>的作者. ...
- PYQT窗口居中
#UI.py,通过UI设计师制作后直接转换为UI.py脚本 # -*- coding: utf-8 -*-from PyQt4 import QtCore, QtGui try: _fromUt ...
- Splay 模板
Splay 模板 struct SplayTree{ const static int maxn = 1e5 + 15; int ch[maxn][2] , key[maxn] , s[maxn] , ...
- HDU 3161 Iterated Difference 暴力
Iterated Difference Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...