HQL更新語句設置參數


雖然hibernate提供了許多方法對數據庫進行更新,但是這的確不能滿足開發需要。現在講解一下用hql語句對數據進行更新。

不使用參數綁定格式String hql="update User u set u.userName=123 where u.userId=2";

介紹5種參數綁定,和為什么要使用參數綁定,好處在哪里。

一.query.setParameter(屬性名,真實值,類型);

String hql="update User u set u.userName=:userName where u.userId=:userId";

Query query  = getSession.createQuery(hql); 

query.setParameter("userName", userName(對應:后面的值), Hibernate.STRING);

query.setParameter("userId", userId(對應:后面的值), Hibernate.INTEGER);

query.executeUpdate();

 

二.query.setXXXX(屬性值,真實值);

String hql="update User u set u.userName=:userName where u.userId=:userId";

query.setString("userName",userName);

query.setInteger("userId",userId);

query.executeUpdate();

 

三.query.setString(問號位置,真實值);

String hql="update User u set u.userName=? where u.userId=?";

Query query  = getSession.createQuery(hql); 

query.setString(0,userName);

query.setInteger(1,userId);

query.executeUpdate();

 

四.query.setProperties(對象);

String hql="update User u set u.userName=:userName where u.userId=:userId";

Query query  = getSession.createQuery(hql); 

User user = new User();

user.serUserName("張三");

user.setUserId(2);

query.setProperties(user);

query.executeUpdate();

 


五. 這里還有一個特殊的setEntity()方法,它會把命名參數與一個持久化對象相關聯,如下面代碼所示:
Customer customer=(Customer)session.load(Customer.class,”1”);
Query query=session.createQuery(“from Order order where order.customer=:customer ”);
query. setProperties(“customer”,customer);
List list=query.list();
上面的代碼會生成類似如下的SQL語句:
Select * from order where customer_ID=’1’;

 

六. 使用綁定參數的優勢:
我們為什么要使用綁定命名參數?任何一個事物的存在都是有其價值的,具體到綁定參數對於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安全漏洞
---------------------
作者:Wismyluckstar
來源:CSDN
原文:https://blog.csdn.net/u014492098/article/details/42103089 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM