Hibernate HQL的update方法详解
雖然hibernate提供了許多方法對(duì)數(shù)據(jù)庫(kù)進(jìn)行更新,但是這的確不能滿足開(kāi)發(fā)需要。現(xiàn)在講解一下用hql語(yǔ)句對(duì)數(shù)據(jù)進(jìn)行更新。
不使用參數(shù)綁定格式String hql="update User u set u.userName=123 where u.userId=2";
介紹5種參數(shù)綁定,和為什么要使用參數(shù)綁定,好處在哪里。
一.query.setParameter(屬性名,真實(shí)值,類(lèi)型);
String hql="update User u set u.userName=:userName where u.userId=:userId";
Query query ?= getSession.createQuery(hql);?
query.setParameter("userName", userName(對(duì)應(yīng):后面的值), Hibernate.STRING);
query.setParameter("userId", userId(對(duì)應(yīng):后面的值), Hibernate.INTEGER);
query.executeUpdate();
二.query.setXXXX(屬性值,真實(shí)值);
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(問(wèn)號(hào)位置,真實(shí)值);
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(對(duì)象);
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();
?
五. 這里還有一個(gè)特殊的setEntity()方法,它會(huì)把命名參數(shù)與一個(gè)持久化對(duì)象相關(guān)聯(lián),如下面代碼所示:
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();
上面的代碼會(huì)生成類(lèi)似如下的SQL語(yǔ)句:
Select * from order where customer_ID=’1’;
六. 使用綁定參數(shù)的優(yōu)勢(shì):
我們?yōu)槭裁匆褂媒壎麉?shù)?任何一個(gè)事物的存在都是有其價(jià)值的,具體到綁定參數(shù)對(duì)于HQL查詢來(lái)說(shuō),主要有以下兩個(gè)主要優(yōu)勢(shì):
①、 可以利用數(shù)據(jù)庫(kù)實(shí)施性能優(yōu)化,因?yàn)閷?duì)Hibernate來(lái)說(shuō)在底層使用的是PrepareStatement來(lái)完成查詢,因此對(duì)于語(yǔ)法相同參數(shù)不同的SQL語(yǔ)句,可以充分利用預(yù)編譯SQL語(yǔ)句緩存,從而提升查詢效率。
②、 可以防止SQL Injection安全漏洞的產(chǎn)生:
SQL Injection是一種專(zhuān)門(mén)針對(duì)SQL語(yǔ)句拼裝的攻擊方式,比如對(duì)于我們常見(jiàn)的用戶登錄,在登錄界面上,用戶輸入用戶名和口令,這時(shí)登錄驗(yàn)證程序可能會(huì)生成如下的HQL語(yǔ)句:
“from User user where user.name=’” name ”’ and user.password=’” password ”’ ”
這個(gè)HQL語(yǔ)句從邏輯上來(lái)說(shuō)是沒(méi)有任何問(wèn)題的,這個(gè)登錄驗(yàn)證功能在一般情況下也是會(huì)正確完成的,但是如果在登錄時(shí)在用戶名中輸入”zhaoxin or ‘x’=’x”,這時(shí)如果使用簡(jiǎn)單的HQL語(yǔ)句的字符串拼裝,就會(huì)生成如下的HQL語(yǔ)句:
“from User user where user.name=’zhaoxin’ or ‘x’=’x’ and user.password=’admin’ ”;
顯然這條HQL語(yǔ)句的where字句將會(huì)永遠(yuǎn)為真,而使用戶口令的作用失去意義,這就是SQL Injection攻擊的基本原理。
而使用綁定參數(shù)方式,就可以妥善處理這問(wèn)題,當(dāng)使用綁定參數(shù)時(shí),會(huì)得到下面的HQL語(yǔ)句:
from User user where user.name=’’zhaoxin’’ or ‘’x=’’x’’ ‘ and user.password=’admin’;由此可見(jiàn)使用綁定參數(shù)會(huì)將用戶名中輸入的單引號(hào)解析成字符串(如果想在字符串中包含單引號(hào),應(yīng)使用重復(fù)單引號(hào)形式),所以參數(shù)綁定能夠有效防止SQL Injection安全漏。
轉(zhuǎn)載于:https://www.cnblogs.com/wenjieyatou/p/5976524.html
總結(jié)
以上是生活随笔為你收集整理的Hibernate HQL的update方法详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Android MagicIndicat
- 下一篇: 将本地工程上传到github