亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

[置頂] 關于JDBC和一些持久化框架SQL預編譯的理解整理

2024-07-21 02:51:19
字體:
來源:轉載
供稿:網友

預編譯就是把格式固定的SQL編譯后,存放在內存池中即數據庫緩沖池,當我們再次執行相同的SQL語句時就不需預編譯的過程。

1.

JDBC的話使用PReparedStatement代替Statement實現預編譯,會加快訪問數據庫的速度

使用PreparedStatement對象可以大大提高代碼的可讀性和可維護性

使用PreparedStatement對象的方法

String  sql ="insert into student values(null,?,?)";

java.sql.PreparedStatement pstmt=conn.preparedStatement(sql);

pstmt.setString(1,var1);pstmt.setString(2,var2);pstmt.executeUpdate();

使用占位符?代替

將參數與SQL語句分離出來,這樣就可以方便對程序的更改和延續,同樣,也可以減少不必要的錯誤。

最后就是安全性了。以下轉自百度文庫:傳遞給PreparedStatement對象的參數可以被強制進行類型轉換,使開發人員可以確保在插入或查詢數據時與底層的數據庫格式匹配。

2.

首先Mybatis,指定了傳入的參數類型parameterType來防止Sql注入,

另外自帶預編譯功能,sql注入只能對編譯過程起作用,

<select id=“getBlogById“ resultType=“Blog“ parameterType=”int”><br>       select id,title,author,content from blog where id=#{id}</select>

其實在框架底層,是jdbc中的PreparedStatement類在起作用,

另外內聯參數的格式由“#{xxx}”變為了${xxx}是不能防止SQL注入的

<select id=“orderBlog“ resultType=“Blog“ parameterType=”map”>       select id,title,author,content from blog order by ${orderParam} </select>在mybatis中,”${xxx}”這樣格式的參數會直接參與sql編譯,從而不能避免注入攻擊。但涉及到動態表名和列名時,只能使用“${xxx}”這樣的參數格式,所以,這樣的參數需要我們在代碼中手工進行處理來防止注入。

如何處理?

對于like語句,難免要使用$寫法,

 1. 對于Oracle可以通過'%'||'#param#'||'%'避免;

 2. 對于MySQL可以通過CONCAT('%',#param#,'%')避免;

 3. MSSQL中通過'%'+#param#+'% 。 

如下3種SQL語句:

123mysql: select * from user where name like concat('%',#name #,'%')      oracle: select * from user where name like '%'||#name #||'%'      SQL Server:select * from user where name like '%'+#name #+'%

3.Hibernate關于實現預編譯的SQL寫法,有四種

 A、 按參數名稱綁定:  在HQL語句中定義命名參數要用”:”開頭,形式如下:  Query query=session.createQuery(“from User user where user.name=:customername and user:customerage=:age ”);  query.setString(“customername”,name);  query.setInteger(“customerage”,age);  上面代碼中用:customername和:customerage分別定義了命名參數customername和customerage,然后用Query接口的setXXX()方法設定名參數值,setXXX()方法包含兩個參數,分別是命名參數名稱和命名參數實際值?! 、 按參數位置邦定:  在HQL查詢語句中用”?”來定義參數位置,形式如下:  Query query=session.createQuery(“from User user where user.name=? and user.age =? ”);  query.setString(0,name);  query.setInteger(1,age);  同樣使用setXXX()方法設定綁定參數,只不過這時setXXX()方法的第一個參數代表邦定參數在HQL語句中出現的位置編號(由0開始編號),第二個參數仍然代表參數實際值?! ∽ⅲ涸趯嶋H開發中,提倡使用按名稱邦定命名參數,因為這不但可以提供非常好的程序可讀性,而且也提高了程序的易維護性,因為當查詢參數的位置發生改變時,按名稱邦定名參數的方式中是不需要調整程序代碼的?! 、 setParameter()方法:  在Hibernate的HQL查詢中可以通過setParameter()方法邦定任意類型的參數,如下代碼:  String hql=”from User user where user.name=:customername ”;  Query query=session.createQuery(hql);  query.setParameter(“customername”,name,Hibernate.STRING);  如上面代碼所示,setParameter()方法包含三個參數,分別是命名參數名稱,命名參數實際值,以及命名參數映射類型。對于某些參數類型setParameter()方法可以根據參數值的Java類型,猜測出對應的映射類型,因此這時不需要顯示寫出映射類型,像上面的例子,可以直接這樣寫:  query.setParameter(“customername”,name);但是對于一些類型就必須寫明映射類型,比如java.util.Date類型,因為它會對應Hibernate的多種映射類型,比如Hibernate.DATA或者Hibernate.TIMESTAMP?! 、 setProperties()方法:(setEntity())  在Hibernate中可以使用setProperties()方法,將命名參數與一個對象的屬性值綁定在一起,如下程序代碼:  Customer customer=new Customer();  customer.setName(“pansl”);  customer.setAge(80);  Query query=session.createQuery(“from Customer c where c.name=:name and c.age=:age ”);  query.setProperties(customer);  setProperties()方法會自動將customer對象實例的屬性值匹配到命名參數上,但是要求命名參數名稱必須要與實體對象相應的屬性同名?! ∵@里還有一個特殊的setEntity()方法,它會把命名參數與一個持久化對象相關聯,如下面代碼所示:  Customer customer=(Customer)session.load(Customer.class,”1”);  Query query=session.createQuery(“from Order order where order.customer=:customer ”);  query. setEntity(“customer”,customer);  List list=query.list();  上面的代碼會生成類似如下的SQL語句:  Select * from order where customer_ID=’1’;  E、 使用綁定參數的優勢:  我們為什么要使用綁定命名參數?任何一個事物的存在都是有其價值的,具體到綁定參數對于HQL查詢來說,主要有以下兩個主要優勢: ?、佟?可以利用數據庫實施性能優化,因為對Hibernate來說在底層使用的是PrepareStatement來完成查詢,因此對于語法相同參數不同的SQL語句,可以充分利用預編譯SQL語句緩存,從而提升查詢效率?! 、?、 可以防止SQL Injection安全漏洞的產生:  SQL Injection是一種專門針對SQL語句拼裝的攻擊方式,比如對于我們常見的用戶登錄,在登錄界面上,用戶輸入用戶名和口令,這時登錄驗證程序可能會生成如下的HQL語句:  “from User user where user.name=’”+name+”’ and user.passWord=’”+password+”’ ”  這個HQL語句從邏輯上來說是沒有任何問題的,這個登錄驗證功能在一般情況下也是會正確完成的,但是如果在登錄時在用戶名中輸入”zhaoxin or ‘x’=’x”,這時如果使用簡單的HQL語句的字符串拼裝,就會生成如下的HQL語句:  “from User user where user.name=’zhaoxin’ or ‘x’=’x’ and user.password=’admin’ ”;  顯然這條HQL語句的where字句將會永遠為真,而使用戶口令的作用失去意義,這就是SQL Injection攻擊的基本原理。  而使用綁定參數方式,就可以妥善處理這問題,當使用綁定參數時,會得到下面的HQL語句:  from User user where user.name=’’zhaoxin’’ or ‘’x=’’x’’ ‘ and user.password=’admin’;由此可見使用綁定參數會將用戶名中輸入的單引號解析成字符串(如果想在字符串中包含單引號,應使用重復單引號形式),所以參數綁定能夠有效防止SQL Injection安全漏洞。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品xxxxx| 日韩欧美国产激情| 久久影院在线观看| 国产99视频在线观看| 国产在线a不卡| 国产女人18毛片水18精品| 成人免费视频在线观看超级碰| 日韩av成人在线| 精品少妇一区二区30p| 亚洲精品自拍视频| 久久久久久伊人| 国产日韩精品电影| 亚洲乱码一区av黑人高潮| 久久精品人人爽| 国产精品丝袜久久久久久高清| 成人黄色av网| 91爱爱小视频k| 国内精品小视频| 久久久久久久久久久人体| 欧美日韩在线免费| 91在线|亚洲| 国产综合在线观看视频| 精品欧美aⅴ在线网站| 久久伊人91精品综合网站| 欧美午夜视频在线观看| 欧美日韩成人黄色| 97视频在线观看亚洲| 国产精品∨欧美精品v日韩精品| 中文字幕欧美日韩精品| 久久久噜噜噜久久| 日韩激情视频在线| 欧美www在线| 亚洲欧美国产制服动漫| 美女国内精品自产拍在线播放| 亚洲偷欧美偷国内偷| 国产视频精品va久久久久久| 亚洲最大福利视频| 日韩在线视频一区| 欧美在线视频在线播放完整版免费观看| 日韩一二三在线视频播| 91精品国产网站| 在线视频欧美日韩| 91高清免费视频| 国产中文日韩欧美| 欧美色播在线播放| 欧美性猛交xxxxx免费看| 亚洲一级片在线看| 久久久久久久999| 国产日本欧美一区二区三区| 国产成人精品久久二区二区| 国内精品久久久久久中文字幕| 亚洲tv在线观看| 97精品久久久中文字幕免费| 欧美性感美女h网站在线观看免费| 欧美精品一区三区| 国产欧美一区二区三区在线看| 日韩视频免费中文字幕| 亚洲在线免费观看| 尤物精品国产第一福利三区| 亚洲国产中文字幕久久网| 久久国产精品久久国产精品| 国产精品成熟老女人| 色伦专区97中文字幕| 国产欧美一区二区三区在线| 亚洲视频在线看| 国产亚洲a∨片在线观看| 亚洲人成在线电影| 97国产精品视频| 成人免费福利在线| 日韩中文在线中文网在线观看| 精品丝袜一区二区三区| 97欧美精品一区二区三区| 午夜精品99久久免费| 中文字幕不卡av| 性欧美xxxx| 色爱精品视频一区| www.亚洲人.com| 国产精品亚洲自拍| 久久久精品2019中文字幕神马| 色噜噜国产精品视频一区二区| 亚洲国产精品久久91精品| 日韩最新中文字幕电影免费看| 国产自摸综合网| 韩国福利视频一区| 97国产精品人人爽人人做| 国产精品久久久999| 色黄久久久久久| 91精品在线观看视频| 国产精品偷伦免费视频观看的| 青草热久免费精品视频| 欧美伊久线香蕉线新在线| 日本aⅴ大伊香蕉精品视频| 91精品国产91久久久久久| 韩国精品久久久999| 日韩免费观看在线观看| 97国产精品视频| 一本大道久久加勒比香蕉| 欧洲日本亚洲国产区| 国产成人啪精品视频免费网| 成人精品一区二区三区电影免费| 精品久久久国产| 少妇高潮久久77777| 伊人伊人伊人久久| 欧美黄色片免费观看| 欧美日韩美女在线观看| 欧美日韩午夜视频在线观看| 隔壁老王国产在线精品| 欧美大片在线影院| 97人人模人人爽人人喊中文字| 91久久久久久久| 欧美黄网免费在线观看| 精品久久久久久久久久| 欧美精品videofree1080p| 97在线精品国自产拍中文| 国产一区二区三区在线观看网站| 欧美专区中文字幕| 欧美激情一区二区三级高清视频| 国产精品h片在线播放| 最近2019年日本中文免费字幕| 欧美日韩精品在线| 国产精品美女久久久久久免费| 欧美国产第一页| 国产精品福利网站| 国产精品扒开腿做爽爽爽的视频| 国产成人精品久久二区二区91| 久久精品国产视频| 在线精品高清中文字幕| 欧美激情中文字幕在线| 久久人人爽国产| 亚洲欧洲av一区二区| 国产国产精品人在线视| 亚洲国产成人久久综合一区| 精品国内产的精品视频在线观看| 久久亚洲成人精品| 久久精品夜夜夜夜夜久久| 92看片淫黄大片看国产片| 成人精品久久久| 色偷偷av一区二区三区乱| www.亚洲人.com| 日韩三级影视基地| 国产一区二区三区毛片| 亚洲精品美女免费| 日韩中文字幕精品| 欧美精品在线网站| 久久全国免费视频| 一区二区三区视频免费在线观看| 国产精品爱啪在线线免费观看| 日韩美女毛茸茸| 97精品国产97久久久久久春色| 国产欧美日韩91| 精品国产乱码久久久久酒店| 自拍亚洲一区欧美另类| 91精品国产高清自在线看超| 国外成人性视频| 亚洲精品www久久久| 久久99热这里只有精品国产| 久久精品久久久久久国产 免费| 国产精品久久综合av爱欲tv| 777国产偷窥盗摄精品视频| 岛国av午夜精品| 欧美高清视频在线观看| 97在线观看视频| 狠狠色狠狠色综合日日小说| 久久人人爽人人爽爽久久|