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

   }

}

 

 

posted @ 2012-09-10 15:54  yangkai_keven  阅读(200)  评论(0编辑  收藏  举报