当我们需要向数据库发送一批SQL语句执行时,应避免向数据库一条条的发送执行,而应采用JDBC的批处理机制,以提升执行效率
有两种方式实现批处理:
1.使用statement
Statement.addBatch(sql)方法:添加sql语句
executeBatch()方法:执行批处理命令
clearBatch()方法:清除批处理命令
优点:可以向数据库发送多条不同的SQL语句。
缺点:
SQL语句没有预编译。
当向数据库发送多条语句相同,但仅参数不同的SQL语句时,需重复写上很多条SQL语句,如:
Insert into student(id,name) values(1,’aa’);
Insert into student(id,name) values(2,’bb’);
Insert into student(id,name) values(3,’cc’);
2.使用PreparedStatement
PreparedStatement.addBatch()
例:
conn = JdbcUtil.getConnection();
String sql = "insert into student(id,name) values(?,?)";
st = conn.prepareStatement(sql);
for(int i=0;i<100;i++){
st.setString(1, i);
st.setString(2, "aa" + i);
st.addBatch();
if(i%10==0){
st.executeBatch();
st.clearBatch();
}
}
st.executeBatch();
优点:发送的是预编译后的SQL语句,执行效率高。
缺点:只能应用在SQL语句相同,但参数不同的批处理中。因此此种形式的批处理经常用于在同一个表中批量插入数据,或批量更新表的数据。
另外,PrepareStatement在应用时相比于Statement也有很多优点:
- PreperedStatement可以避免SQL注入的问题。
- Statement会使数据库频繁编译SQL,可能造成数据库缓冲区溢出。
PreparedStatement可对SQL进行预编译,从而提高数据库的执行效率。 - 并且PreperedStatement对于sql中的参数,允许使用占位符的形式进行替换,简化sql语句的编写。