JDBC之PreparedStatement類中預編譯的綜合應用解析

PC教程網】關于JDBC之PreparedStatement類中預編譯的綜合應用解析_預編譯介紹:預編譯的優點 1、 PreparedStatement是預編譯的,對于批量處理可以大大提高效率. 也叫JDBC存儲過程。 2、 使用 Statement 對象。在對數據庫只執行一次性存取的時侯,用 Statement 對象進行處理。,下面小編為您針對JDBC之PreparedStatement類中預編譯的綜合應用解析進行分享:

預編譯的優點
1、
PreparedStatement是預編譯的,對于批量處理可以大大提高效率. 也叫JDBC存儲過程。

2、使用 Statement 對象。在對數據庫只執行一次性存取的時侯,用 Statement 對象進行處理。PreparedStatement 對象的開銷比Statement大,對于一次性操作并不會帶來額外的好處。

3、statement每次執行sql語句,相關數據庫都要執行sql語句的編譯,preparedstatement是預編譯得,   preparedstatement支持批處理

4、PreparedStatement對象不僅包含了SQL語句,而且大多數情況下這個語句已經被預編譯過,因而當其執行時,只需DBMS運行SQL語句,而不必先編譯。當你需要執行Statement對象多次的時候,PreparedStatement對象將會大大降低運行時間,當然也加快了訪問數據庫的速度。這種轉換也帶來很大的便利,不必重復SQL語句的句法,而只需更改其中變量的值,便可重新執行SQL語句。選擇PreparedStatement對象與否,在于相同句法的SQL語句是否執行了多次,而且兩次之間的差別僅僅是變量的不同。如果僅僅執行了一次的話,它應該和普通的對象毫無差異,體現不出它預編譯的優越性。

5、PreparedStatement對象比Statement對象更有效,特別是如果帶有不同參數的同一SQL語句被多次執行的時候。PreparedStatement對象允許數據庫預編譯SQL語句,這樣在隨后的運行中可以節省時間并增加代碼的可讀性。

預編譯的核心代碼

教程實例 代碼如下:

//預編譯方式構建SQL查詢:
String sql = "select * from student where year(birthday) between ? and ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, "1987");
ps.setString(2, "1990");
rs = ps.executeQuery();

預編譯的簡單范例
以下方法的第一個參數是一個SQL 語句,第二三個參數是需要查詢的范圍。
教程實例 代碼如下:

 /**PreparedStatement 預編譯之查詢欄目的范圍 */
 public ResultSet StartQuery(String sql,String s1, String s2) {
  getConnection();
  try {
   pStatement = connection.prepareStatement(sql);
   pStatement.setString(1, s1);
   pStatement.setString(2, s2);
   rSet = pStatement.executeQuery();
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return rSet;
 }

應用
教程實例 代碼如下:

  System.out.println("生日范圍查詢:");
  ResultSet resultSet = jDemo1.StartQuery("select * from t_userr where year(birthdate) between ? and ?","1992","1992");
  jDemo1.AllResult(resultSet);

預編譯的拓展范例一(SQL查詢)
以下,我們對上面的方法進行拓展,使之能適應更寬泛的情況。
第一個參數是SQL語句,第二個參數是查詢的一個參數列表。(一數組形式存放)
教程實例 代碼如下:

 /** PreparedStatement 預編譯之查詢拓展版 */
 public ResultSet StartQueryLook(String sql,Object[] s) {
  getConnection();
  try {
   pStatement = connection.prepareStatement(sql);
   for (int i = 0; i < s.length; i++) {
    pStatement.setObject(i+1, s[i]);
   }
   rSet = pStatement.executeQuery();
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return rSet;
 }

應用
教程實例 代碼如下:

  //預編譯之查詢拓展版應用1
  System.out.println("生日范圍查詢:");
  String[] s1 = {"1992","1992"};
  ResultSet resultSet = jDemo1.StartQueryLook("select * from t_userr where year(birthdate) between ? and ?",s1);
  jDemo1.AllResult(resultSet);
  //預編譯之查詢拓展版應用2
  System.out.println("ID范圍查詢:");
  String[] s2 = {"100","200"};
  ResultSet resultSet2 = jDemo1.StartQueryLook("select * from t_userr where id between ? and ?",s2);
  jDemo1.AllResult(resultSet2);

預編譯的拓展范例二(SQL增添、刪除、修改)
教程實例 代碼如下:

 /** PreparedStatement 預編譯之增刪改拓展版 */
 public int StartQueryAll(String sql,Object[] objArr) {
  int count = 0;
  getConnection();
  try {
   pStatement = connection.prepareStatement(sql);
   if(objArr!=null && objArr.length>0) {
    for (int i = 0; i < objArr.length; i++) {
     pStatement.setObject(i+1, objArr[i]);
    }
   }
   count = pStatement.executeUpdate();
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } finally {
   close();
  }
  return count;
 }

應用
教程實例 代碼如下:

  //預編譯之增刪改拓展版:批量增加
  for (int i = 0; i < 10; i++) {
   Object[] s3 = {10,10};
   jDemo1.StartQueryAll("insert into jdbctest(username,password) values(?,?)",s3);
  }
  //預編譯之增刪改拓展版:批量刪除
  System.out.println("刪除多條:");
  jDemo1.StartQueryAll("delete from t_userr where id between ? and ?",new Object[]{"1010","1030"});

相關教程

C++設計模式編程中的迭代器模式應用解析

C++設計模式編程中的迭代器模式應用解析

迭代器模式:提供一種方法順序訪問一個聚合對象中個各個元素,而不暴露該對像的內部表示. 迭代器模式應該是最為熟悉的模式了,最簡單的證明就是我在實現組合模式、享元模式、觀 …

asp.net中GridView編輯,更新,合計用法示例

本文實例講述了asp.net中GridView編輯,更新,合計用法。分享給大家供大家參考,具體如下: 前臺代碼: asp:GridView ID="tabgv" runat="server" DataKeyNames="ysId" ShowFooter="True" OnRowDataBound="GridView1_RowDat …

不錯的mod_perl編程的簡單應用實例介紹

介紹性指南 mod_perl是個龐大而復雜的工具,它內建了許多模塊幫助你方便地構建動態網站。這篇指南的目的是幫助你構建一個良好的mod_perl模塊,并從中理解mod_perl的實現技術。我并不推 …

C++中overload,override,overwrite的區別詳細解析

Overload(重載): 在C++程序中,可以將語義、功能相似的幾個函數用同一個名字表示,但參數或返回值不同(包括類型、順序不同),即函數重載。 (1)相同的范圍(在同一個類中); …

C++標準庫中sstream與strstream的區別詳細解析

在C++有兩種字符串流,一種在sstream中定義,另一種在strstream中定義。它們實現的東西基本一樣。 strstream里包含 class strstreambuf; class istrstream; class ostrstream; class strstream; 它們是基于C類型 …

C++指向類成員函數的指針詳細解析

首先 函數指針是指向一組同類型的函數的指針;而類成員函數我們也可以相似的認為,它是指向同類中同一組類型的成員函數的指針,當然這里的成員函數更準確的講應該是指非靜態的 …

java中sdk與jdk的區別詳細解析

SDK是Software Development Kit的縮寫,中文意思是“軟件開發工具包”。這是一個覆蓋面相當廣泛的名詞,可以這么說:輔助開發某一類軟件的相關文檔、范例和工具的集合都可以叫做“SDK” …

Android入門之ListView應用解析(二)

Android入門之ListView應用解析(二)

上一篇關于Android中ListView的介紹講的是如何制作一個具有兩行文本的自定義控件,作為ListView的Item的使用方法。本文接下來也是圍繞ListView和Item,更加深入地介紹它們的用法。 首先,先 …

Android入門之TableLayout應用解析(二)

Android入門之TableLayout應用解析(二)

本文在上一篇初步介紹TableLayout常用屬性的基礎上,將進一步介紹如何UI設計器設計TableLayout + TableRow。由于實際應用中,經常需要在代碼里往TableLayout添加數據(9宮圖也可以用TableLayout做 …

iOS中的NSTimer定時器的初步使用解析

創建一個定時器(NSTimer) - (void)viewDidLoad { [super viewDidLoad]; [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(actionTimer:) userInfo:nil repeats:YES];}- (void)actionTimer:(NSTimer *)timer{} NSTimer默認 …

内蒙古十一选五任五推荐号