hibernate之参数绑定

----------

我们应该拒绝SQL(或HQL)的拼装,应该永远不要编写这样的代码,有这很严重的安全问题,众所周知的SQL注入。我们可以考虑参数绑定,在hibernate中它有两种方式。

1.具名参数

利用具名参数的例子:

  1. String queryString = "from Item item where item.description like :search";
  1. String queryString = "from Item item where item.description like :search";

参数名称前面的冒号表示这是一个具名参数。然后,对search参数绑定一个值:

  1. Query q = session.createQuery(queryString).setString("search",searchString);
  1. Query q = session.createQuery(queryString).setString("search",searchString);

由于searchString是一个用户提供的字符串变量,你调用Query接口的setString()方法,把它绑定到具名参数(:search)。这个代码更规则、更安全且执行得更好,因为如果只是绑定参数的变化,单独编译过的SQL语句就可以被重用。

多个参数例:

  1. String queryString = "from Item item where item.description like :search and item.date > :minDate";
  2. Query q = session.createQuery(queryString).setString("search",searchString).setDate("minDate",mDate);
  1. String queryString = "from Item item where item.description like :search and item.date > :minDate";
  2. Query q = session.createQuery(queryString).setString("search",searchString).setDate("minDate",mDate);

你已经调用了setString()和setDate()来把实参绑定查询参数。原生的hibernate Query接口提供类似的便利方法,用来绑定大多数hibernate内建类型的参数:从setInteger()到setTimestamp()和setLocale()的一切。

特别有用的一种方法setEntity(),它让你绑定一个特久化实体,如例:

  1. session.createQuery("from Item item where item.seller = :seller").setEntity("seller",theSeller);
  1. session.createQuery("from Item item where item.seller = :seller").setEntity("seller",theSeller);

然而,还有一种允许绑定任何hibernate类型实参的一般方法,如例:

  1. String queryString = "from Item item where item.seller = :seller and item.description like :desc";
  2. session.createQuery(queryString).setParameter("seller",theSeller,Hibernate.entity(User.class))
  3. .setParameter("desc",description,Hibernate.STRING);
  1. String queryString = "from Item item where item.seller = :seller and item.description like :desc";
  2. session.createQuery(queryString).setParameter("seller",theSeller,Hibernate.entity(User.class))
  3. .setParameter("desc",description,Hibernate.STRING);

2.定位参数

如果你喜欢,你可以使用定位参数,如例:

  1. String queryString = "from Item item where item.description like ? and item.date > ?";
  2. Query q = session.createQuery(queryString).setString(0,searchString).setDate(1,minDate);
  1. String queryString = "from Item item where item.description like ? and item.date > ?";
  2. Query q = session.createQuery(queryString).setString(0,searchString).setDate(1,minDate);

绑定参数位置的每一个变化都需要改变参数绑定代码,这样就产生了易碎和更需要维护的代码,建议避免使用定位

参数。如果必须使用定位参数,要记住hibernate是从0开始计数(JPA是从1开始记数);

hibernate之参数绑定的更多相关文章

  1. 【Hibernate实战】源码解析Hibernate参数绑定及PreparedStatement防SQL注入原理

        本文采用mysql驱动是5.1.38版本. 本篇文章涉及内容比较多,单就Hibernate来讲就很大,再加上数据库驱动和数据库相关,非一篇文章或一篇专题就能说得完.本文从使用入手在[Spr ...

  2. Hibernate HQL查询的参数绑定

    参数绑定: Hibernate中对动态查询参数绑定提供了丰富的支持,那么什么是查询参数动态绑定呢?其实如果我们熟悉传统JDBC编程的话,我们就不难理解查询参数动态绑定,如下代码传统JDBC的参数绑定: ...

  3. Hibernate参数绑定的五种方式

    Hibernate参数绑定 参数绑定优点: (1)安全性 防止用户恶意输入条件和恶意调用存储过程 (2)提高性能 底层采用JDBC的PreparedStatement预定义sql功能,后期查询直接从缓 ...

  4. Hibernate-ORM:07.Hibernate中的参数绑定

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客会讲解Hibernate中的参数绑定,就是相当于sql语句中的where后面的条件 一,讲解概述: 1 ...

  5. SpringMVC由浅入深day02_1课程安排_2包装类型pojo参数绑定_3集合类型绑定

    springmvc第二天 高级知识 复习: springmvc框架: DispatcherServlet前端控制器:接收request,进行response HandlerMapping处理器映射器: ...

  6. day36 03-Hibernate检索方式:排序、参数绑定、投影查询

    排序之后是分页查询. 检索单个对象 还可以进行参数的绑定. HQL的参数绑定,按参数名称绑定或者是按参数位置绑定. 还可以用投影的操作,投影的操作是只查询这里面的某几个属性.只查询某一个属性,查询多个 ...

  7. Spring MVC初始化参数绑定

    初始化参数绑定与类型转换很类似,初始化绑定时,主要是参数类型 ---单日期 在处理器类中配置绑定方法  使用@InitBinder注解 在这里首先注册一个用户编辑器 参数一为目标类型   proper ...

  8. SpringMVC初始化参数绑定--日期格式

    一.初始化参数绑定[一种日期格式] 配置步骤: ①:在applicationcontext.xml中只需要配置一个包扫描器即可 <!-- 包扫描器 --> <context:comp ...

  9. SpringMvc中初始化参数绑定

    初始化参数绑定与类型转换很类似,初始化绑定时,主要是参数类型 ---单日期 在处理器类中配置绑定方法  使用@InitBinder注解 在这里首先注册一个用户编辑器 参数一为目标类型   proper ...

随机推荐

  1. Redis和Memcache的区别分析 [转]

    1. Redis中,并不是所有的数据都一直存储在内存中的,这是和Memcached相比一个最大的区别. 2. Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构 ...

  2. 快速排序算法 Quick sort

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4046189.html 首先随机选择一个轴,并调整数组内各个数字,使得比轴值大的数在轴的右边, ...

  3. DataGridView默认不选中

    NurseGridList.CurrentCell = null;                NurseGridList.ClearSelection();                Nurs ...

  4. Django初体验

    为什么使用Django 快速开发 使用python 数据库ORM系统 大量内置应用 后台管理系统 admin 用户认证系统 auth 会话系统 sessions 安全性高 表单验证 SQL注入 跨站点 ...

  5. windows下STM32开发环境的搭建

    一.概述 1.说明 笔者已经写了一篇Linux下STM32开发环境的搭建 ,这两篇文章的最区别在于开发环境所处的系统平台不一样,而其实这个区别对于开发环境的搭建其实影响不大,制作局部上的操作上发生了改 ...

  6. UI表单

    Monk.UI表单美化插件诞生记!   阅读目录 背景 预览效果 表单组件 普通文本框 多行文本框 复选框 切换滑块 单选框 下拉选择框 数字输入框 时间选择 文件选择 显示文本 按钮 开源地址 背景 ...

  7. C# - 非中断(正常)模式下的调试

    一般我们用Console.WriteLine()函数,将文本输出到控制台上来跟踪代码进行到了什么位置,局限性很大,适用范围窄. 1. 输出调试信息 命名空间 System.Dignostics Deb ...

  8. cocos2dx3.4 解析json文件

    头文件: #include "json/document.h" #include "json/stringbuffer.h" #include "js ...

  9. npm常用命令解析

    npm是什么 NPM的全称是Node Package Manager,是随同NodeJS一起安装的包管理和分发工具,它很方便让JavaScript开发者下载.安装.上传以及管理已经安装的包. npm ...

  10. @Transient注解

    以下两个包都包含@Transient注解 java.beans.Transient; javax.persistence.Transient; 使用@Transient时注意区别二者