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

相關推薦

hibernateHql ->update語句用法 5引數

雖然hibernate提供了許多方法對資料庫進行更新,但是這的確不能滿足開發需要。現在講解一下用hql語句對資料進行更新。 不使用引數繫結格式String hql="update User u set u.userName=123 where u.userId=2";  

hibernateHql ->update語句用法 5引數

雖然hibernate提供了許多方法對資料庫進行更新,但是這的確不能滿足開發需要。現在講解一下用hql語句對資料進行更新。 不使用引數繫結格式String hql="update User u set u.userName=123 where u.userId=2";

【進階3-1期】JavaScript 5 this 全面解析

(關注福利,關注本公眾號回覆[資料]領取優質前端視訊,包括Vue、React、Node原始碼和實戰、面試指導) 本週正式開始前端進階的第三期,本週的主題是this全面解析,今天是第9天。 本計劃一共28期,每期重點攻克一個面試重難點,如果你還不瞭解本進階計劃,點選檢視前端進階的破冰之旅 如果覺得本系列不

hibernatehql查詢語句總結

c中 sql tail 創建 sele 則無 log join 方法 <div class="post"> <h1 class="postTitle"> <a id="cb_post_title_url" clas

hibernatehql的通用分頁

首先看一個業務需求:通過書籍名字模糊查詢資料,並且具備分頁的功能,通常情況下可以如下寫查詢的方法,但如果查詢維度較多則比較麻煩。 新寫一個BaseDao專門去處理這個問題,BaseDao程式碼如下: package com.zking.eight.util; import java.

redis四 常用命令和5資料結構

redis中文官網:string hash list set sortedset 一、基本操作 #獲取所有的key keys * #判斷一個鍵是否存在。存在則返回1,否則返回0 exists mykey #刪除鍵 del mykey #過期時間(單位:秒) #設定過期時間

HQL查詢語句用法@Query

1.       HQL查簡單詢語句用法Query //如果查詢具體的一個或兩個資料(不是全部資料)就要在HQL語句中加SELECT如果是全部查詢就省略了直接FROM開頭 和SQL語句一樣 hql ="

hibernateHQL入門

1. 查詢整個對映物件所有欄位 //直接from查詢出來的是一個對映物件,即:查詢整個對映物件所有欄位 String hql = "from Users"; Query query = session.createQuery(hql

HibernateHQL多表查詢

多表的查詢進行使用HQL語句進行查詢,HQL語句和SQL語句的查詢語法比較類似 內連線查詢 顯示內連線 select * from customer c inner join orders o on c.cid = o.cno

hibernatehql查詢語言

HQL(Hibernate Query Language) 是面向物件的查詢語言, 它和 SQL 查詢語言有些相似. 在 Hibernate 提供的各種檢索方式中, HQL 是使用最廣的一種檢索方式.。它有如下功能: 在查詢語句中設定各種查詢條件; 支援投影查詢, 即僅

Android網路圖片載入的5基本方式

學了這麼久,最近有空把自己用到過的網路載入圖片的方式總結了出來,與大家共享,希望對你們有幫助。此部落格包含Android 5種基本的載入網路圖片方式,包括普通載入HttpURLConnection、HttpClients、Volley、XUtils、OkHttp等網路載入圖片

mysql中insert into語句5寫法(上)

insert into是mysql中最常用的插入語句,它有5種寫法。下面讓我們一起來看一看吧: http://blog.csdn.net/number1killer/article/details/778424721向原表中某些欄位中插入一條記錄。語法:insert into

二、Springmvc+Mybatis 引數預設引數 簡單型別 POJO POST亂碼問題

web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/

React學習旅----實現類似vue的資料雙向

react沒有資料的雙向繫結,但可以用過一些方法實現: import React from 'react'; class TodoList extends React.Component { constructor(props) { super(props) this.sta

轉 vue實現雙向資料原理及實現篇 vue的雙向原理及實現

轉自:canfoo#! vue的雙向繫結原理及實現 前言 先上個成果圖來吸引各位: 程式碼:                          &nb

5.引數-pojo包裝型別(傳智播客)

需求:根據商品名稱模糊匹配商品資訊 1.controller層開發 //根據商品名稱模糊匹配商品資訊 @RequestMapping("/queryItemByItemName") public ModelAndView queryItemByItemName(ItemsQueryV

Hibernate事務操作及session與本地執行緒

事務相關概念   1 什麼是事務     事務是應用程式中一系列嚴密的操作,所有操作必須成功完成,否則在每個操作中所作的所有更改都會被撤消。也就是事務具有原子性,一個事務中的一系列的操作要麼全部成功,要麼一個都不做。     事務的結束有兩種,當事務中的所以步驟全部成功執行時,事務提交。如果其中

SpringMVC框架(1)(1.3 自定義引數

一、自定義引數繫結-屬性編輯器(不推薦) 問題:① 4.1 itemsList.jsp 中增加顯示 “訂購日期” 屬性;② JSP頁面中日期拿到的是字串,而提交到Controller中POJO類ItemsCustom 屬性物件的日期欄位要變成Date型別,即字串轉換成日期型別,無法自動轉

SpringMVC框架(1)(1.3 引數

引數繫結 一、繫結簡單型別引數:整型、字串、float/double、日期、布林(eg:Controller中方法 public String editItemsSubmit(String name,Float price)) (eg:4.2 editItems.jsp 中 name

Springmvc引數

spring引數繫結過程 概念:從客戶端請求key/value資料,經過引數繫結,將key/value資料繫結到controller方法形參上。 springmvc中,接受頁面提交的資料是通過方法形參來接收,而不是在controller類定義成員變數來接收 第一步: