hibernate之参数绑定
hibernate之参数绑定
----------
我们应该拒绝SQL(或HQL)的拼装,应该永远不要编写这样的代码,有这很严重的安全问题,众所周知的SQL注入。我们可以考虑参数绑定,在hibernate中它有两种方式。
1.具名参数
利用具名参数的例子:
- String queryString = "from Item item where item.description like :search";
- String queryString = "from Item item where item.description like :search";
参数名称前面的冒号表示这是一个具名参数。然后,对search参数绑定一个值:
- Query q = session.createQuery(queryString).setString("search",searchString);
- Query q = session.createQuery(queryString).setString("search",searchString);
由于searchString是一个用户提供的字符串变量,你调用Query接口的setString()方法,把它绑定到具名参数(:search)。这个代码更规则、更安全且执行得更好,因为如果只是绑定参数的变化,单独编译过的SQL语句就可以被重用。
多个参数例:
- String queryString = "from Item item where item.description like :search and item.date > :minDate";
- Query q = session.createQuery(queryString).setString("search",searchString).setDate("minDate",mDate);
- String queryString = "from Item item where item.description like :search and item.date > :minDate";
- Query q = session.createQuery(queryString).setString("search",searchString).setDate("minDate",mDate);
你已经调用了setString()和setDate()来把实参绑定查询参数。原生的hibernate Query接口提供类似的便利方法,用来绑定大多数hibernate内建类型的参数:从setInteger()到setTimestamp()和setLocale()的一切。
特别有用的一种方法setEntity(),它让你绑定一个特久化实体,如例:
- session.createQuery("from Item item where item.seller = :seller").setEntity("seller",theSeller);
- session.createQuery("from Item item where item.seller = :seller").setEntity("seller",theSeller);
然而,还有一种允许绑定任何hibernate类型实参的一般方法,如例:
- String queryString = "from Item item where item.seller = :seller and item.description like :desc";
- session.createQuery(queryString).setParameter("seller",theSeller,Hibernate.entity(User.class))
- .setParameter("desc",description,Hibernate.STRING);
- String queryString = "from Item item where item.seller = :seller and item.description like :desc";
- session.createQuery(queryString).setParameter("seller",theSeller,Hibernate.entity(User.class))
- .setParameter("desc",description,Hibernate.STRING);
2.定位参数
如果你喜欢,你可以使用定位参数,如例:
- String queryString = "from Item item where item.description like ? and item.date > ?";
- Query q = session.createQuery(queryString).setString(0,searchString).setDate(1,minDate);
- String queryString = "from Item item where item.description like ? and item.date > ?";
- Query q = session.createQuery(queryString).setString(0,searchString).setDate(1,minDate);
绑定参数位置的每一个变化都需要改变参数绑定代码,这样就产生了易碎和更需要维护的代码,建议避免使用定位
参数。如果必须使用定位参数,要记住hibernate是从0开始计数(JPA是从1开始记数);
hibernate之参数绑定的更多相关文章
- 【Hibernate实战】源码解析Hibernate参数绑定及PreparedStatement防SQL注入原理
本文采用mysql驱动是5.1.38版本. 本篇文章涉及内容比较多,单就Hibernate来讲就很大,再加上数据库驱动和数据库相关,非一篇文章或一篇专题就能说得完.本文从使用入手在[Spr ...
- Hibernate HQL查询的参数绑定
参数绑定: Hibernate中对动态查询参数绑定提供了丰富的支持,那么什么是查询参数动态绑定呢?其实如果我们熟悉传统JDBC编程的话,我们就不难理解查询参数动态绑定,如下代码传统JDBC的参数绑定: ...
- Hibernate参数绑定的五种方式
Hibernate参数绑定 参数绑定优点: (1)安全性 防止用户恶意输入条件和恶意调用存储过程 (2)提高性能 底层采用JDBC的PreparedStatement预定义sql功能,后期查询直接从缓 ...
- Hibernate-ORM:07.Hibernate中的参数绑定
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客会讲解Hibernate中的参数绑定,就是相当于sql语句中的where后面的条件 一,讲解概述: 1 ...
- SpringMVC由浅入深day02_1课程安排_2包装类型pojo参数绑定_3集合类型绑定
springmvc第二天 高级知识 复习: springmvc框架: DispatcherServlet前端控制器:接收request,进行response HandlerMapping处理器映射器: ...
- day36 03-Hibernate检索方式:排序、参数绑定、投影查询
排序之后是分页查询. 检索单个对象 还可以进行参数的绑定. HQL的参数绑定,按参数名称绑定或者是按参数位置绑定. 还可以用投影的操作,投影的操作是只查询这里面的某几个属性.只查询某一个属性,查询多个 ...
- Spring MVC初始化参数绑定
初始化参数绑定与类型转换很类似,初始化绑定时,主要是参数类型 ---单日期 在处理器类中配置绑定方法 使用@InitBinder注解 在这里首先注册一个用户编辑器 参数一为目标类型 proper ...
- SpringMVC初始化参数绑定--日期格式
一.初始化参数绑定[一种日期格式] 配置步骤: ①:在applicationcontext.xml中只需要配置一个包扫描器即可 <!-- 包扫描器 --> <context:comp ...
- SpringMvc中初始化参数绑定
初始化参数绑定与类型转换很类似,初始化绑定时,主要是参数类型 ---单日期 在处理器类中配置绑定方法 使用@InitBinder注解 在这里首先注册一个用户编辑器 参数一为目标类型 proper ...
随机推荐
- MySQL二进制文件规范安装
演示环境介绍 操作系统:CentOS 6.7 (64位) 二进制包:mysql-5.6.30-linux-glibc2.5-x86_64.tar.gz MySQL 下载地址:http://dev.m ...
- 观【史上最牛linux视频教程】整理笔记,持续更新……
//文件处理命令 命令格式:命令 [-参数] [参数] 例:ls -la /etc -a等于--all //目录处理命令:ls 英文原意:list 所在路径:/bin/ls 语法:ls 选项[-ald ...
- .NET研发人员面试题(一)
1.简述javascript中的“=.==.===”的区别? =赋值 ==比较是否一般相等 "3"==3 //会做类型的隐式转换,true ===比较是否严格相等 " ...
- div+css实现的左右两个等高div
工作当中我们经常会有这样的需求,尤其是在一些内容页面或者网站后台管理页面:左边的div的高度会随着右边的div的内容的增加儿增加,右边div的高度也会随着左边div的内容的增加而增加,也就是左右两侧两 ...
- 前端资源多个产品整站一键打包&包版本管理(二)——如何在bower的配置文件加上注释
问题: 当一个工程里面有好几个项目,每个项目引用同一个包,但是不同的名字,例如在bower中 fancybox 跟 jquery.fancybox 是一样的,我们只需要下载其中的一个版本,而打包工作不 ...
- Cassandra1.2文档学习(3)——数据分配和复制
参考文档:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/architecture/a ...
- jquery全选,jquery全不选,jquery反选
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- eclipse Ctrl +左键查看源代码Source not found
Windows->Preferences->Java->Installed JREs->...(default)->Edit->Program Files\Java ...
- 用 BPL 封装数据连接
BPL 代码: uDM.pas unit uDM; interface uses SysUtils, Classes, uIntf, DB, ABSMain; type TDM = class(TDa ...
- python通过webservice连接cmdbuild
cmdbuild的部署可以查看文章:http://20988902.blog.51cto.com/805922/1541289 部署成功后,访问http://192.168.1.1:8080/cmdb ...