心得7--JDBC回顾-批处理案例解说
1. 业务场景:当需要向数据库发送一批SQL语句执行时,应避免向数据库一条条的发送执行,而应采用JDBC的批处理机制,以提升执行效率。
l 实现批处理有两种方式,第一种方式:
• Statement.addBatch(sql) list
• 优点:可以向数据库发送多条不同的SQL语句。
• 缺点:SQL语句没有预编译。当向数据库发送多条语句相同,但仅参数不同的SQL语句时,需重复写上很多条SQL语句。
l 执行批处理SQL语句
• executeBatch()方法:执行批处理命令
• clearBatch()方法:清除批处理命令
l 实现批处理的第二种方式:
• PreparedStatement.addBatch()
• 优点:发送的是预编译后的SQL语句,执行效率高。
• 缺点:只能应用在SQL语句相同,但参数不同的批处理中。因此此种形式的批处理经常用于在同一个表中批量插入数据,或批量更新表的数据。
2. 实际案例分析
题目:新建一个用户表person,包括的字段有id,name,headimg,intro。其中heading的类型为blob,intro的类型为text,使用jdbc完成这样一个需求,向用户表中插入三条记录。
// 一般做法:
packagecom.zuoye;
importjava.io.BufferedReader;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileReader;
importjava.sql.Connection;
importjava.sql.PreparedStatement;
importcom.Db.DbManager;
publicclass Person {
public void insert(){
Connection con =DbManager.getConnection();
PreparedStatement st = null;
try {
String sql = "insert into personvalues(?,?,?,?)";
st = con.prepareStatement(sql);
File f1 = newFile("src/Eclipse.txt");
File f2 = newFile("src/1.jpg");
File f3 = newFile("src/2.jpg");
File f4 = newFile("src/3.gif");
//通过for循环遍历嵌套着if(){}else{}语句比较麻烦但也能达到目的要求的
for(int i=1;i<=3;i++){
BufferedReader br = new BufferedReader(newFileReader(f1));
st.setInt(1,i);
st.setString(2, "张"+i);
if(i==1){
FileInputStream fs = new FileInputStream(f2);
st.setBinaryStream(3, fs, f2.length()); st.setCharacterStream(4,br,f1.length());
}else if(i==2){
FileInputStream fs = new FileInputStream(f3);
st.setBinaryStream(3,fs, f3.length()); st.setCharacterStream(4,br,f1.length());
}else if(i==3){
FileInputStream fs = new FileInputStream(f4);
st.setBinaryStream(3, fs, f4.length()); st.setCharacterStream(4,br,f1.length());
}
int j = st.executeUpdate();
if(j>0){
System.out.println("记录"+i+"插入成功!!");
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
DbManager.closeDB(con, st, null);
}
}
public static void main(String[] args) {
Person p = new Person();
p.insert();
}
}
//批处理做法,这种方法比较简单。
packagecom.zuoye;
importjava.io.BufferedReader;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileReader;
importjava.sql.Connection;
importjava.sql.PreparedStatement;
importcom.Db.DbManager;
publicclass Person {
public void insert(){
Connection con = DbManager.getConnection();
PreparedStatement st = null;
try {
Stringsql = "insert into person values(?,?,?,?)";
st = con.prepareStatement(sql);
for(int i=1;i<=3;i++){
File f1 = newFile("src/com/code/Demo"+i+".java"); //这里偷懒一下,运用数组通过遍历以前的案例来填充需要的数据
File f2 = new File("src/"+i+".jpg");
BufferedReader br = new BufferedReader(newFileReader(f1));
FileInputStream fs = newFileInputStream(f2);
st.setInt(1,i);
st.setString(2, "张"+i);
st.setBinaryStream(3, fs,f2.length());
st.setCharacterStream(4,br,f1.length());
st.addBatch(); //将插入的语句先添加到批处理中
}
st.executeBatch();
System.out.println("插入成功!!");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
DbManager.closeDB(con, st, null);
}
}
public static void main(String[] args) {
Person p = new Person();
p.insert();
}
}