JavaShuo
欄目
標籤
JDBC爲何要使用PreparedStatement而不是Statement
時間 2019-11-09
標籤
jdbc
爲何
使用
preparedstatement
不是
statement
欄目
Java
简体版
原文
原文鏈接
prepareStatement與Statement的區別
1.區別:
stmt=conn.CreateStatement();
resultSet rs=stmt.executeQuery(sql);
上面是statement的用法
============================
下面是PrepareStatement的用法
ptmt=conn.PreparedStatement(sql);
resultSet rs=ptmt.executeQuery();
================================
Statement 是PreparedStatement的父類
還有就是sql放置的位置不一樣 。
在開發中通常用PrepareStatement
jdbc(java database connectivity,java數據庫鏈接)的api中的主要的四個類之一的java.sql.statement要求開發者付出大量的時間和精力。在使用statement獲取jdbc訪問時所具備的一個共通的問題是輸入適當格式的日期和時間戳:2002-02-05 20:56 或者 02/05/02 8:56 pm。 經過使用java.sql.preparedstatement,這個問題能夠自動解決。一個preparedstatement是從java.sql.connection對象和所提供的sql字符串獲得的,sql字符串中包含問號(?),這些問號標明變量的位置,而後提供變量的值,最後執行語句,例如: 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的另外一個優勢是字符串不是動態建立的。下面是一個動態建立字符串的例子: stringsql = "select * from people p where p.i = "+id; 這容許jvm(javavirtual machine,java虛擬機)和驅動/數據庫緩存語句和字符串並提升性能。preparedstatement也提供數據庫無關性。當顯示聲明的sql越少,那麼潛在的sql語句的數據庫依賴性就越小。因爲preparedstatement具有不少優勢,開發者可能一般都使用它,只有在徹底是由於性能緣由或者是在一行sql語句中沒有變量的時候才使用一般的statement。一個完整的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;}//mainpublic static void main(string[] args) throws sqlexception {mypreparedstatement jdbctest1 = new mypreparedstatement();jdbctest1.query();}}爲何要始終使用PreparedStatement代替Statement?爲何要始終使用PreparedStatement代替Statement?在JDBC應用中,若是你已是稍有水平開發者,你就應該始終以PreparedStatement代替Statement.也就是說,在任什麼時候候都不要使用Statement.基於如下的緣由:一.代碼的可讀性和可維護性.雖然用PreparedStatement來代替Statement會使代碼多出幾行,但這樣的代碼不管從可讀性仍是可維護性上來講.都比直接用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();不用我多說,對於第一種方法.別說其餘人去讀你的代碼,就是你本身過一段時間再去讀,都會以爲傷心.二.PreparedStatement盡最大可能提升性能.每一種數據庫都會盡最大努力對預編譯語句提供最大的性能優化.由於預編譯語句有可能被重複調用.因此語句在被DB的編譯器編譯後的執行代碼被緩存下來,那麼下次調用時只要是相同的預編譯語句就不須要編譯,只要將參數直接傳入編譯過的語句執行代碼中(至關於一個涵數)就會獲得執行.這並非說只有一個Connection中屢次執行的預編譯語句被緩存,而是對於整個DB中,只要預編譯的語句語法和緩存中匹配.那麼在任什麼時候候就能夠不須要再次編譯而能夠直接執行.而statement的語句中,即便是相同一操做,而因爲每次操做的數據不一樣因此使整個語句相匹配的機會極小,幾乎不太可能匹配.好比:insert into tb_name (col1,col2) values ('11','22');insert into tb_name (col1,col2) values ('11','23');即便是相同操做但由於數據內容不同,因此整個個語句自己不能匹配,沒有緩存語句的意義.事實是沒有數據庫會對普通語句編譯後的執行代碼緩存.固然並非因此預編譯語句都必定會被緩存,數據庫自己會用一種策略,好比使用頻度等因素來決定何時再也不緩存已有的預編譯結果.以保存有更多的空間存儲新的預編譯語句.三.最重要的一點是極大地提升了安全性.即便到目前爲止,仍有一些人連基本的惡義SQL語法都不知道.String sql = "select * from tb_name where name= '"+varname+"' and passwd='"+varpasswd+"'";若是咱們把[' or '1' = '1]做爲varpasswd傳入進來.用戶名隨意,看看會成爲何?select * from tb_name = '隨意' and passwd = '' or '1' = '1';由於'1'='1'確定成立,因此能夠任何經過驗證.更有甚者:把[';drop table tb_name;]做爲varpasswd傳入進來,則:select * from tb_name = '隨意' and passwd = '';drop table tb_name;有些數據庫是不會讓你成功的,但也有不少數據庫就可使這些語句獲得執行.而若是你使用預編譯語句.你傳入的任何內容就不會和原來的語句發生任何匹配的關係.只要全使用預編譯語句,你就用不着對傳入的數據作任何過慮.而若是使用普通的statement,有可能要對drop,;等作費盡心機的判斷和過慮.上面的幾個緣由,還不足讓你在任什麼時候候都使用PreparedStatement嗎
相關文章
1.
【jdbc】爲何使用PreparedStatement而不是Statement
2.
JDBC爲何要使用PreparedStatement而不是Statement
3.
JDBC爲什麼要使用PreparedStatement而不是Statement
4.
JDBC之使用Statement,PreparedStatement,ResultSet
5.
JDBC Statement PreparedStatement CallableStatement
6.
JDBC 的 PreparedStatement 與 Statement
7.
jdbc中PreparedStatement和Statement
8.
爲何要使用ConcurrentHashMap而不是HashMap
9.
爲何要使用 SLF4J 而不是 Log4J
10.
爲何要使用SLF4J而不是Log4J
更多相關文章...
•
XSD 如何使用?
-
XML Schema 教程
•
爲什麼使用 XML Schemas?
-
XML Schema 教程
•
Composer 安裝與使用
•
使用Rxjava計算圓周率
相關標籤/搜索
statement
preparedstatement
而是
爲何要用真機
要是
爲何
何爲
使用不當
爲何須要FabricPath
爲要
Java
Spring教程
Docker教程
Docker命令大全
應用
0
分享到微博
分享到微信
分享到QQ
每日一句
每一个你不满意的现在,都有一个你没有努力的曾经。
最新文章
1.
FM理論與實踐
2.
Google開發者大會,你想知道的都在這裏
3.
IRIG-B碼對時理解
4.
乾貨:嵌入式系統設計開發大全!(萬字總結)
5.
從域名到網站—虛機篇
6.
php學習5
7.
關於ANR線程阻塞那些坑
8.
android studio databinding和include使用控件id獲取報錯 不影響項目正常運行
9.
我女朋友都會的安卓逆向(四 動態調試smali)
10.
io存取速度
本站公眾號
歡迎關注本站公眾號,獲取更多信息
相關文章
1.
【jdbc】爲何使用PreparedStatement而不是Statement
2.
JDBC爲何要使用PreparedStatement而不是Statement
3.
JDBC爲什麼要使用PreparedStatement而不是Statement
4.
JDBC之使用Statement,PreparedStatement,ResultSet
5.
JDBC Statement PreparedStatement CallableStatement
6.
JDBC 的 PreparedStatement 與 Statement
7.
jdbc中PreparedStatement和Statement
8.
爲何要使用ConcurrentHashMap而不是HashMap
9.
爲何要使用 SLF4J 而不是 Log4J
10.
爲何要使用SLF4J而不是Log4J
>>更多相關文章<<