文档章节

hibernate之Hql ->update语句的用法

Airship
 Airship
发布于 2017/02/09 10:36
字数 798
阅读 616
收藏 0

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

 

本文转载自:http://blog.csdn.net/u014492098/article/details/42103089

Airship
粉丝 46
博文 1045
码字总数 21161
作品 0
南京
高级程序员
私信 提问
Hibernate的四种查询方式(主键查询,HQL查询,Criteria查询,本地sql查询)和修改和添加

Hibernate的添加,修改,查询(三种查询方式)的方法: 案例演示: 1:第一步,导包,老生常谈了都是,省略; 2:第二步,创建数据库和数据表,表结构如下所示: 3:第三步创建实体类User.ja...

别叫小伙
2017/03/09
0
0
hibernate hql查询(需完善)

使用HQL需要四步 得到Session 编写HQL语句 创建Query对象(Query接口是HQL 查询接口。它提供了各种的查询功能) 执行查询,得到结果 sessionFactory =new Configuration().configure().buil...

zdatbit
2016/03/10
48
0
Batch Processing

下面例子展示批量插入一个反模式(不成熟使用Hibernate插入100000行记录) Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); for ( int i=0......

Rksi5
2014/10/11
83
0
Java程序员从笨鸟到菜鸟之(六十四)细谈Hibernate(十五)HQL与QBC查询方式详解

首先来看一下,hibernate提供的几种检索方式: 1.导航对象图检索方式 :根据已经加载的对象,导航到其他对象。例如,对于已经加载的Customer对象,调用它的getOrders().iterator()方法就可以...

长平狐
2012/11/12
199
0
如何使hibernate中的update()方法只更新部分字段

Hibernate 中如果直接使用 Session.update(Object o); 会把这个表中的所有字段更新一遍。 比如: view plaincopy to clipboardprint? public class TeacherTest { @Test public void update(......

偶尔诗文
2014/06/22
171
0

没有更多内容

加载失败,请刷新页面

加载更多

OpenStack 简介和几种安装方式总结

OpenStack :是一个由NASA和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenSta...

小海bug
昨天
5
0
DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
昨天
6
0
数据库中间件MyCat

什么是MyCat? 查看官网的介绍是这样说的 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务、ACID、可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵...

沉浮_
昨天
6
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
昨天
7
0
常用物流快递单号查询接口种类及对接方法

目前快递查询接口有两种方式可以对接,一是和顺丰、圆通、中通、天天、韵达、德邦这些快递公司一一对接接口,二是和快递鸟这样第三方集成接口一次性对接多家常用快递。第一种耗费时间长,但是...

程序的小猿
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部