在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进行查看,其效果如下: