雖然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