我们可以通过使用 Statement或preparedStatement的对象来执行相应的sql语句,但是有时,当我们需要向数据库发送一批SQL语句执行时,为了避免向数据库一条条的发送执行,我们就应该采用JDBC的批处理机制,以提升执行效率。
实现批处理有两种方式,第一种方式:Statement对象
Statement.addBatch(sql)
例如:我们在在向一个名为me的表中输一批入数据时我们就可以采用批处理来实现。
Connection con =null;
Statement st=null;
ResultSet rs=null;
PreparedStatement ps=null;
publicvoid statementBanch(){
con = DBCManager.getConnect();//获取连接对象
try {
//定义sql语句
String sql = "insertinto me (id,name,age ) values(1,'lisi',13)";
String sql1 = "update me set id =2,name ='zhangsan',age =14 whereid =1";
//创建语句对象
st =con.createStatement();
//添加进批
st.addBatch(sql);
st.addBatch(sql1);
//执行批
st.executeBatch();
} catch (SQLException e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
DBCManager.release(null, null, con);
}
这样我们就完成了对于一批有不同的sql句的数据的插入。
但是,还有时候,我们需要向数据库发送的多条语句相同,但仅参数不同的SQL语句时,需重复写上很多条SQL语句,如:
Insert into user(name,password) values(‘aa’,’111’);
Insert into user(name,password) values(‘bb’,’222’);
Insert into user(name,password) values(‘cc’,’333’);
Insert into user(name,password) values(‘dd’,’444’);
这就大大的降低了程序运行的效率,且所有SQL语句没有进行预编译,这样是很不好的,因此,我们便需要借助第二种方式来进行对具有相同特征的一批数据的插入工作。也就是,使用PrepareStatement对象来实现,这种整批数据的录入。
例:
publicvoid prepareStatementBanch(){
con = DBCManager.getConnect();//获取连接对象
try {
//定义sql语句
String sql = "insert into me (id,name,age ) values(?,?,?)";
//创建语句对象
ps =con.prepareStatement(sql);
for(int i=0;i<=10;i++){
//为字段赋值
ps.setInt(1, i+1);
ps.setString(2, "name"+i);
ps.setInt(3, 10+i);
//添加进批
ps.addBatch();
//设置条件当i对10取余为0时,先执行一次批语句,然后将批清除
if(i%10==0){
ps.executeBatch();
ps.clearBatch();
}
}
//将批中剩余的语句执行完毕
ps.executeBatch();
} catch (SQLException e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
DBCManager.release(null, ps, con);
}
这样通过采用PreparedStatement.addBatch()实现批处理,发送出去的是通过预编译后的SQL语句,执行起来效率会更高。当然,这样做也有它的不足之处即:只能应用在SQL语句相同,但参数不同的批处理中。因此此种形式的批处理经常用于在同一个表中批量插入数据,或批量更新表的数据。
这样我们以后就可以通过几种不同的方式来实现对于不同类型、不同数量的数据的插入了。