欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
PreparedStatement的用法

PreparedStatement的用法

網(wǎng)上看到這文章,正好在研究JSP ,放到這為了以后參考!!
 
jdbc(java database connectivity,java數據庫連接)的api中的主要的四個(gè)類(lèi)之一的java.sql.statement要求開(kāi)發(fā)者付出大量的時(shí)間和精力。在使用statement獲取jdbc訪(fǎng)問(wèn)時(shí)所具有的一個(gè)共通的問(wèn)題是輸入適當格式的日期和時(shí)間戳:2002-02-05 20:56 或者 02/05/02 8:56 pm。

通過(guò)使用java.sql.preparedstatement,這個(gè)問(wèn)題可以自動(dòng)解決。一個(gè)preparedstatement是從java.sql.connection對象和所提供的sql字符串得到的,sql字符串中包含問(wèn)號(?),這些問(wèn)號標明變量的位置,然后提供變量的值,最后執行語(yǔ)句,例如:
stringsql = "select * from people p where p.id = ? and p.name = ?";
preparedstatement ps = connection.preparestatement(sql);
ps.setint(1,id);
ps.setstring(2,name);
resultset rs = ps.executequery();
使用preparedstatement的另一個(gè)優(yōu)點(diǎn)是字符串不是動(dòng)態(tài)創(chuàng )建的。下面是一個(gè)動(dòng)態(tài)創(chuàng )建字符串的例子:
stringsql = "select * from people p where p.i = "+id;

這允許jvm(javavirtual machine,java虛擬機)和驅動(dòng)/數據庫緩存語(yǔ)句和字符串并提高性能。
preparedstatement也提供數據庫無(wú)關(guān)性。當顯示聲明的sql越少,那么潛在的sql語(yǔ)句的數據庫依賴(lài)性就越小。
由于preparedstatement具備很多優(yōu)點(diǎn),開(kāi)發(fā)者可能通常都使用它,只有在完全是因為性能原因或者是在一行sql語(yǔ)句中沒(méi)有變量的時(shí)候才使用通常的statement。
一個(gè)完整的preparedstatement的例子:
package jstarproject;
import java.sql.*;
public class mypreparedstatement {
private final string db_driver="com.microsoft.jdbc.sqlserver.sqlserverdriver";
private final string url = "jdbc:microsoft:sqlserver://127.0.0.1:1433;databasename=pubs";
  public mypreparedstatement()
  {
  }
  public void query() throws sqlexception{
    connection conn = this.getconnection();
    string strsql = "select emp_id from employee where emp_id = ?";
    preparedstatement pstmt = conn.preparestatement(strsql);
    pstmt.setstring(1,"pma42628m");
    resultset rs = pstmt.executequery();

    while(rs.next()){
       string fname = rs.getstring("emp_id");
       system.out.println("the fname is " + fname);
    }
    rs.close();
    pstmt.close();
    conn.close();
  }
  private connection getconnection() throws sqlexception{
//    class.
    connection conn = null;
    try {
      class.forname(db_driver);
      conn = drivermanager.getconnection(url,"sa","sa");
    }
    catch (classnotfoundexception ex) {}
    return conn;
  }
  //main
  public static void main(string[] args) throws sqlexception {
    mypreparedstatement jdbctest1 = new mypreparedstatement();
    jdbctest1.query();
  }
}

為什么要始終使用PreparedStatement代替Statement?為什么要始終使用PreparedStatement代替Statement?

在JDBC應用中,如果你已經(jīng)是稍有水平開(kāi)發(fā)者,你就應該始終以PreparedStatement代替Statement.也就是說(shuō),在任何時(shí)候都不要使用Statement.
基于以下的原因:
一.代碼的可讀性和可維護性.
雖然用PreparedStatement來(lái)代替Statement會(huì )使代碼多出幾行,但這樣的代碼無(wú)論從可讀性還是可維護性上來(lái)說(shuō).都比直接用Statement的代碼高很多檔次:
stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values (‘"+var1+"‘,‘"+var2+"‘,"+var3+",‘"+var4+"‘)");
perstmt = con.prepareStatement("insert into tb_name (col1,col2,col2,col4) values (?,?,?,?)");
perstmt.setString(1,var1);
perstmt.setString(2,var2);
perstmt.setString(3,var3);
perstmt.setString(4,var4);
perstmt.executeUpdate();
不用我多說(shuō),對于第一種方法.別說(shuō)其他人去讀你的代碼,就是你自己過(guò)一段時(shí)間再去讀,都會(huì )覺(jué)得傷心.
二.PreparedStatement盡最大可能提高性能.
每一種數據庫都會(huì )盡最大努力對預編譯語(yǔ)句提供最大的性能優(yōu)化.因為預編譯語(yǔ)句有可能被重復調用.所以語(yǔ)句在被DB的編譯器編譯后的執行代碼被緩存下來(lái),那么下次調用時(shí)只要是相同的預編譯語(yǔ)句就不需要編譯,只要將參數直接傳入編譯過(guò)的語(yǔ)句執行代碼中(相當于一個(gè)涵數)就會(huì )得到執行.這并不是說(shuō)只有一個(gè)Connection中多次執行的預編譯語(yǔ)句被緩存,而是對于整個(gè)DB中,只要預編譯的語(yǔ)句語(yǔ)法和緩存中匹配.那么在任何時(shí)候就可以不需要再次編譯而可以直接執行.而statement的語(yǔ)句中,即使是相同一操作,而由于每次操作的數據不同所以使整個(gè)語(yǔ)句相匹配的機會(huì )極小,幾乎不太可能匹配.比如:
insert into tb_name (col1,col2) values (‘11‘,‘22‘);
insert into tb_name (col1,col2) values (‘11‘,‘23‘);
即使是相同操作但因為數據內容不一樣,所以整個(gè)個(gè)語(yǔ)句本身不能匹配,沒(méi)有緩存語(yǔ)句的意義.事實(shí)是沒(méi)有數據庫會(huì )對普通語(yǔ)句編譯后的執行代碼緩存.
當然并不是所以預編譯語(yǔ)句都一定會(huì )被緩存,數據庫本身會(huì )用一種策略,比如使用頻度等因素來(lái)決定什么時(shí)候不再緩存已有的預編譯結果.以保存有更多的空間存儲新的預編譯語(yǔ)句.
三.最重要的一點(diǎn)是極大地提高了安全性.
即使到目前為止,仍有一些人連基本的惡義SQL語(yǔ)法都不知道.
String sql = "select * from tb_name where name= ‘"+varname+"‘ and passwd=‘"+varpasswd+"‘";
如果我們把[‘ or ‘1‘ = ‘1]作為varpasswd傳入進(jìn)來(lái).用戶(hù)名隨意,看看會(huì )成為什么?
select * from tb_name = ‘隨意‘ and passwd = ‘‘ or ‘1‘ = ‘1‘;
因為‘1‘=‘1‘肯定成立,所以可以任何通過(guò)驗證.更有甚者:
把[‘;drop table tb_name;]作為varpasswd傳入進(jìn)來(lái),則:
select * from tb_name = ‘隨意‘ and passwd = ‘‘;drop table tb_name;有些數據庫是不會(huì )讓你成功的,但也有很多數據庫就可以使這些語(yǔ)句得到執行.
而如果你使用預編譯語(yǔ)句.你傳入的任何內容就不會(huì )和原來(lái)的語(yǔ)句發(fā)生任何匹配的關(guān)系.只要全使用預編譯語(yǔ)句,你就用不著(zhù)對傳入的數據做任何過(guò)慮.而如果使用普通的statement,有可能要對drop,;等做費盡心機的判斷和過(guò)慮.
上面的幾個(gè)原因,還不足讓你在任何時(shí)候都使用PreparedStatement嗎
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Statement與PreparedStatement適用范圍
java面試④數據庫部分
[轉]Statement和PreparedStatement批量更新
JDBC加強
批處理batch,執行多個(gè)SQL語(yǔ)句
淺談 JDBC 中 CreateStatement 和 PrepareStatement 的區別與優(yōu)劣。
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久