Javaweb笔记(十一):mysql数据库批处理

针对mysql进行数据库操作我们使用statement及其子类prepreparedStatement来进行,但是涉及到sql攻击的威胁,我们经常使用prepreparedStatement,就针对此我们进行数据库数据的插入:

  • 使用批处理插入5000条数据
@Test
    public void batchDealByMySql() {
        String sql = "INSERT INTO tb_stu values(?,?,?,?)";
        Connection connection = null;
        PreparedStatement pstn = null;

        try {
            // 获取数据库连接connection
            connection = JDBCUtils.getConnection();
            // 获取操作数据库的对象prepareStatement
            pstn = connection.prepareStatement(sql);

            // 通过循环想pstn中添加5000条数据
            for (int i = 0; i < 5000; i++) {
                pstn.setInt(1, i);
                pstn.setString(2, "stu" + i);
                pstn.setInt(3, i % 2);
                pstn.setString(4, "地址" + i);
                // 将pstn添加到批处理中
                pstn.addBatch();
            }

            // 执行开始时间
            Long start = System.currentTimeMillis();
            // 执行批处理
            pstn.executeBatch();
            // 执行结束时间
            Long end = System.currentTimeMillis();
            // 获取通过批处理插入100条数据的时间
            System.out.println("耗时:" + (end - start) + "毫秒");

        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            JDBCUtils.closeConnection(null, pstn, connection);
        }
    }

运行结果:耗时:2212毫秒
为了突出批处理的优越性,我们可以进行常规的出入数据5000条,然后进行时间的对比:

@Test
    public void NormalDealByMySql() {
        String sql = "insert into tb_stu values(?,?,?,?)";
        Connection connection = null;
        PreparedStatement pstn = null;

        try {
            connection = JDBCUtils.getConnection();
            pstn = connection.prepareStatement(sql);

            Long start = System.currentTimeMillis();
            for (int i = 0; i < 5000; i++) {
                pstn.setInt(1, i);
                pstn.setString(2, "stu" + i);
                pstn.setInt(3, i % 2);
                pstn.setString(4, "地址" + i);
                pstn.executeUpdate();
            }
            Long end = System.currentTimeMillis();
            // 获取通过批处理插入5000条数据的时间
            System.out.println("耗时:" + (end - start) + "毫秒");// 耗时:2390毫秒
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            JDBCUtils.closeConnection(null, pstn, connection);
        }
    }

运行查看时间:耗时:2478毫秒
根据上面结果可以知道批处理的又是所在!在使用批处理着重使用到一下的重点方法:

  • addBatch ()向这个 PreparedStatement对象的一批命令添加一组参数。
  • executeBatch() 将一批命令提交到数据库以执行,并且所有命令都执行成功,返回一个更新计数的数组。 返回的数组的int元素被排序以对应于批次中的命令,这些命令根据它们添加到批处理的顺序进行排序。
  • clearBatch() 清空这个 Statement对象当前的SQL命令列表。

采用PreaparedStatement.addBatch()实现批处理

  • 优点:发送的是预编译的sql语句。执行效率高。
  • 缺点:只能应用到sql语句相同,但参数不同的批处理中,因此此种像是的批处理经常用于在同一个表中
  • 批量插入数据或者批量更新数据。

你可能感兴趣的:(Javaweb笔记(十一):mysql数据库批处理)