眾所周知,ibatis是對jdbc的封裝,所以要理解ibatis裡面的$與#,首先,我們先分析一下jdbc裡面的statement與preparestatement,
statement stmt=conn.createstatement();
resultset rs=stmt.executequery(sql);
preparestatement ptmt=conn.preparedstatement(sql);
resultset rs=ptmt.executequery();
statement 是preparedstatement的父類,
大家請注意sql放置的位置,前者在executequery方法裡,後者在preparestatement建構函式裡,這就意味著前者是在執行查詢的時候才傳入sql語句,後者在類構建的時候就傳sql語句,而執行查詢方法時並沒有傳入sql語句,所以後者必然是在構建時就已經將sql傳送到資料庫做預編譯,然後在執行查詢方法時,直接從資料庫快取中取。
在開發中一般用preparestatement,原因多數是安全問題。
比如:public void querybyname(string username){
string sql = 「select * from student where name= 『 " +username +" ' ";
statement stmt=conn.createstatement();
resultset rs=stmt.executequery(sql);
這是乙個未經編譯的sql語句,如果傳入的引數是「linqifeng」,「tom」等引數沒有任何問題,但是當傳入
"lin' or 1=1;",問題出現了,傳入"lin' or 1=1;drop table student;",問題更大。
如果:public void querybyname(string username){
string sql = 「select * from student where name= ?" ;
preparestatement ptmt=conn.preparedstatement(sql);
ptmt.setstring("name",username);
resultset rs=ptmt.executequery();
這樣處理,username不再是sql語句的一部分,而是作為乙個字串引數,它不參與sql語句的編譯;
至此,jdbc簡單介紹完畢。下面就講解一下,$與#和前面statement preparedstatement的關係,
#用於變數替換
select * from table where id = #id#
等效於
preparestement = stmt.createpreparestement("select * from table where id = ?")
preparestement.setstring(1,'abc');
ibatis 中 與 的區別
在ibatis中我們使用sqlmap進行sql查詢時需要引用引數,在引數引用中遇到的符號 和 之間的區分為,可以進行與編譯,進行型別匹配,而 不進行資料型別匹配,例如 select from table where id id 其中如果欄位id為字元型,那麼 id 表示的就是 id 型別,如果id為...
IBATIS中 與 的區別
我們在使用ibatis時會經常用到 和 這兩個符號。一 與 區別說通俗一點就是 中間的變數就是直接替換成值的 會根據變數的型別來進行替換 比如articletitle的型別是string,值是 標題 的時候 articletitle 標題 articletitle 標題 二.的作用實際上是字串拼接,...
IBATIS中 與 的區別
我們在使用ibatis時會經常用到 和 這兩個符號。一 與 區別說通俗一點就是 中間的變數就是直接替換成值的 會根據變數的型別來進行替換 比如articletitle的型別是string,值是 標題 的時候 articletitle 標題 articletitle 標題 二.的作用實際上是字串拼接,...