赞
踩
针对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语句相同,但参数不同的批处理中,因此此种像是的批处理经常用于在同一个表中
批量插入数据或者批量更新数据。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。