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

posted @ 2015-04-22 14:55  ~风轻云淡~  阅读(3091)  评论(0编辑  收藏  举报