1. 程式人生 > >hibernate之Hql ->update語句的用法 5種引數繫結

hibernate之Hql ->update語句的用法 5種引數繫結

雖然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安全漏洞

 

轉自: https://blog.csdn.net/u014492098/article/details/42103089