读书人

经验7-JDBC回顾-批处理案例解说

发布时间: 2012-09-23 10:28:10 作者: rapoo

心得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();

}

}

读书人网 >其他数据库

热点推荐