hibernate之参数绑定(转)

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

1.具名参数

利用具名参数的例子:

[java] view plaincopy

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

[java] view plaincopy

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

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

[java] view plaincopy

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

[java] view plaincopy

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

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

多个参数例:

[java] view plaincopy

  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);

[java] view plaincopy

  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(),它让你绑定一个特久化实体,如例:

[java] view plaincopy

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

[java] view plaincopy

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

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

[java] view plaincopy

  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);

[java] view plaincopy

  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.定位参数

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

[java] view plaincopy

  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);

[java] view plaincopy

  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开始记数);

时间: 2024-08-05 02:45:44

hibernate之参数绑定(转)的相关文章

hibernate参数绑定

参数绑定有三种方法,在此讲效率较高的,也就是常用的两种方法: 持久化类: package entity; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; //HQl查询图书信息 @Entity @

hibernate HQL查询的参数绑定

参数绑定: Hibernate中对动态查询参数绑定提供了丰富的支持,那么什么是查询参数动态绑定呢?其实如果我们熟悉传统JDBC编程的话,我们就不难理解查询参数动态绑定,如下代码传统JDBC的参数绑定: PrepareStatement pre=connection.prepare(“select * from User where user.name=?”); pre.setString(1,”zhaoxin”); ResultSet rs=pre.executeQuery(); 在Hibern

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

------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客会讲解Hibernate中的参数绑定,就是相当于sql语句中的where后面的条件 一,讲解概述: 1.通过下标的方式绑定参数 2.通过自定义参数名的方式绑定参数(多用于多表操作) 3.通过传入自定义对象的方式绑定参数(多用于单表操作) 4.通过类似智能标签的方式绑定参数(多用于带条件的多表操作) 二,通过下标的方式绑定参数 @Test /*通过下标的方式指定参数*/ public void t01

Hibernate5-动态参数绑定

1.创建项目,项目名称hibernatedemo5,目录结构如图所示 2.在项目中创建lib目录存储jar文件,目录结构如图所示 3.在src目录中创建实体Bean Forum,包名(com.mycompany.demo.bean),如图所示 4.实体Bean Forum的内容如下 package com.mycompany.demo.bean; public class Forum { private int fid; private String name; public Forum() {

HQL参数绑定

hibernate HQL查询的参数绑定 (2010-07-15 09:20:16) 转载▼ 标签: 杂谈 分类: JAVA  参数绑定: Hibernate中对动态查询参数绑定提供了丰富的支持,那么什么是查询参数动态绑定呢?其实如果我们熟悉传统JDBC编程的话,我们就不难理解查询参数动态绑定,如下代码传统JDBC的参数绑定: PrepareStatement pre=connection.prepare(“select * from User where user.name=?”); pre.

SpringMVC详解(五)------参数绑定

参数绑定,简单来说就是客户端发送请求,而请求中包含一些数据,那么这些数据怎么到达 Controller ?这在实际项目开发中也是用到的最多的,那么 SpringMVC 的参数绑定是怎么实现的呢?下面我们来详细的讲解. 1.SpringMVC 参数绑定 在 SpringMVC 中,提交请求的数据是通过方法形参来接收的.从客户端请求的 key/value 数据,经过参数绑定,将 key/value 数据绑定到 Controller 的形参上,然后在 Controller 就可以直接使用该形参. 这里

【转】@RequestParam @RequestBody @PathVariable 等参数绑定注解详解

@RequestParam @RequestBody @PathVariable 等参数绑定注解详解 2014-06-02 11:24 23683人阅读 评论(2) 收藏 举报 目录(?)[+] 引言: 接上一篇文章,对@RequestMapping进行地址映射讲解之后,该篇主要讲解request 数据到handler method 参数数据的绑定所用到的注解和什么情形下使用: 简介: handler method 参数绑定常用的注解,我们根据他们处理的Request的不同内容部分分为四类:(主

@RequestParam @RequestBody @PathVariable 等参数绑定注解详解(转)

简介: handler method 参数绑定常用的注解,我们根据他们处理的Request的不同内容部分分为四类:(主要讲解常用类型) A.处理requet uri 部分(这里指uri template中variable,不含queryString部分)的注解:   @PathVariable; B.处理request header部分的注解:   @RequestHeader, @CookieValue; C.处理request body部分的注解:@RequestParam,  @Reque

[Spring MVC] - SpringMVC的各种参数绑定方式

SpringMVC的各种参数绑定方式 1. 基本数据类型(以int为例,其他类似):Controller代码: @RequestMapping("saysth.do") public void test(int count) { } 表单代码: <form action="saysth.do" method="post"> <input name="count" value="10" ty