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 ...
随机推荐
- iOS 多态的简单思想
/** * 多态:多种形态,是对于对象而言的,如果没有继承就没有多态 * * 在代码中体现:就是通过定义父类指针指向子类的对象 * * 好处:在函数或者方法的参数中如果传入的是父类指针,那么实现的时候 ...
- sea.js说明文档
Sea.js 手册与文档 首页 | 索引 目录 模块定义 define id dependencies factory exports require require.async require.re ...
- 编译安装php5.5.7 脚本
#!/bin/bash .tar.gz ];then wget http://oss.aliyuncs.com/aliyunecs/onekey/php/php-5.5.7.tar.gz fi . ...
- Finding a needle in Haystack: Facebook’s photo storage
http://www.importnew.com/3292.html 面向对象存储系统
- Oracle 分析函数 "ORA-30485: 在窗口说明中丢失 ORDER BY 表达式"
跟顺序有关的几个分析函数row_number.rank.dense_rank.lead和lag的over窗口里,都必须有order_by_clause.其他几个如:first_value.last_v ...
- 洛谷1890 gcd区间
题目描述 给定一行n个正整数a[1]..a[n].m次询问,每次询问给定一个区间[L,R],输出a[L]..a[R]的最大公因数. 输入输出格式 输入格式: 第一行两个整数n,m.第二行n个整数表示a ...
- Ollydbg 中断方法浅探
Ollydbg是一个新的32位的汇编层调试软件.适应于windows98.me.2000.xp和2003操作系统.由于他具有图形窗口界面,所以操作方便.直观,是cracker的好工具. 由于Ollyd ...
- PHP之序列化与反序列化讲解
serialize() 把变量和它们的值编码成文本形式 unserialize() 恢复原先变量 eg: $stooges = array('Moe','Larry','Curly');$new = ...
- zepto源码学习-06 touch
先上菜,看这个模块的最后一段代码,一看就明白. ['swipe', 'swipeLeft', 'swipeRight', 'swipeUp', 'swipeDown', 'doubleTap', 't ...
- Linux系统调用列表
转自Linux系统调用列表 一.进程控制: fork 创建一个新进程 clone 按指定条件创建子进程 execve 运行可执行文件 exit 中止进程 _exit 立即中止当前进程 getdtabl ...