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

  • 相关阅读:
    js实现粘贴板复制
    oracle分页查询
    [小技巧]window10删除此电脑左侧栏中的非磁盘文件夹
    [web]2019第一起数据泄露事件
    [xml]AttributeError: 'xml.etree.ElementTree.Element' object has no attribute 'getroot'
    [python]Mongodb
    [urllib]urlretrieve在python3
    [flask]邮件配置-20171227
    [PowerShell]Python虚拟环境激活失败
    [git]git入门
  • 原文地址:https://www.cnblogs.com/gaopeng527/p/4447479.html
Copyright © 2020-2023  润新知