`
Lstoryc
  • 浏览: 78237 次
文章分类
社区版块
存档分类
最新评论

Hibernate 动态参数绑定

 
阅读更多

Hibernate中对动态查询参数绑定提供了丰富的支持,那么什么是查询参数动态绑定呢?其实如果我们熟悉传统JDBC编程的话,我们就不难理解查询参数动态绑定,如下代码传统JDBC的参数绑定:
  PrepareStatement pre=connection.prepare(“select * from User where user.name=?”);
  pre.setString(1,”zhaoxin”);
  ResultSet rs=pre.executeQuery();
  在Hibernate中也提供了类似这种的查询参数绑定功能,而且在Hibernate中对这个功能还提供了比传统JDBC操作丰富的多的特性,在Hibernate中共存在4种参数绑定的方式


  A、 按参数名称绑定:
  在HQL语句中定义命名参数要用”:”开头,形式如下:
  Query query=session.createQuery(“from User user where user.name=:customername anduser:customerage=:age ”);
  query.setString(“customername”,name);
  query.setInteger(“customerage”,age);

  上面代码中用:customername和:customerage分别定义了命名参数customername和customerage,然后用 Query接口的setXXX()方法设定名参数值,setXXX()方法包含两个参数,分别是命名参数名称和命名参数实际值。


  B、 按参数位置邦定:
  在HQL查询语句中用”?”来定义参数位置,形式如下:
  Query query=session.createQuery(“from User user where user.name=? and user.age =? ”);
  query.setString(0,name);
  query.setInteger(1,age);

  同样使用setXXX()方法设定绑定参数,只不过这时setXXX()方法的第一个参数代表邦定参数在HQL语句中出现的位置编号(由0开始编号),第二个参数仍然代表参数实际值。
  注:在实际开发中,提倡使用按名称邦定命名参数,因为这不但可以提供非常好的程序可读性,而且也提高了程序的易维护性,因为当查询参数的位置发生改变时,按名称邦定名参数的方式中是不需要调整程序代码的。


  C、 setParameter()方法:
  在Hibernate的HQL查询中可以通过setParameter()方法邦定任意类型的参数,如下代码:
  String hql=”from User user where user.name=:customername ”;
  Query query=session.createQuery(hql);
  query.setParameter(“customername”,name,Hibernate.STRING);
  如上面代码所示,setParameter()方法包含三个参数,分别是命名参数名称,命名参数实际值,以及命名参数映射类型。对于某些参数类型 setParameter()方法可以根据参数值的Java类型,猜测出对应的映射类型,因此这时不需要显示写出映射类型,像上面的例子,可以直接这样 写:
  query.setParameter(“customername”,name);但是对于一些类型就必须写明映射类型,比如java.util.Date类型,因为它会对应Hibernate的多种映射类型,比如Hibernate.DATA或者Hibernate.TIMESTAMP。


  D、 setProperties()方法:(setEntity())
  在Hibernate中可以使用setProperties()方法,将命名参数与一个对象的属性值绑定在一起,如下程序代码:
  Customer customer=new Customer();
  customer.setName(“pansl”);
  customer.setAge(80);
  Query query=session.createQuery(“from Customer c where c.name=:name and c.age=:age ”);
  query.setProperties(customer);
  setProperties()方法会自动将customer对象实例的属性值匹配到命名参数上,但是要求命名参数名称必须要与实体对象相应的属性同名
  这里还有一个特殊的setEntity()方法,它会把命名参数与一个持久化对象相关联,如下面代码所示:
  Customer customer=(Customer)session.load(Customer.class,”1”);
  
Query query=session.createQuery(“from Order order where order.customer=:customer ”);
  query. setEntity(“customer”,customer);
  
List list=query.list();
  上面的代码会生成类似如下的SQL语句:
  Select * from order where customer_ID=’1’;


  E、 使用绑定参数的优势:
  我们为什么要使用绑定命名参数?任何一个事物的存在都是有其价值的,具体到绑定参数对于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安全漏洞。

 

分享到:
评论

相关推荐

    hibernate实现动态SQL查询

    // 设置参数绑定 query.setParameter("param1", value1); query.setParameter("param2", value2); List[]> result = query.list(); ``` 八、总结 通过XML配置SQL和FREEMARKER模板解析,Hibernate提供了实现动态SQL...

    2022年Hibernate的JNDI绑定分析Java教程.docx

    在构造器里面,Hibernate 会调用 `SessionFactoryObjectFactory` 的 `addInstance` 方法,并且把自身(SessionFactory 的实例)作为参数传递。 在 `addInstance` 方法中,Hibernate 会获取一个初始上下文(Initial ...

    Hibernate 参数配置详解

    ### Hibernate 参数配置详解 #### 一、概述 Hibernate 是一款流行的 Java 持久层框架,它通过提供一套丰富的 API 和配置选项来简化数据库访问。本文档将深入探讨 Hibernate 的核心配置参数及其功能,帮助开发者更...

    Hibernate的JNDI绑定分析.doc

    ### Hibernate的JNDI绑定分析 #### 一、概述 Hibernate是一个开源的对象关系映射(ORM)框架,它简化了Java应用程序与数据库之间的交互过程。JNDI(Java Naming and Directory Interface)则是一种广泛使用的API,...

    让hibernate输出sql语句参数配置.doc

    hibernate.session_factory_name 参数用于 SessionFactory 创建后,将自动使用这个名字绑定到 JNDI 中。其取值为 jndi/composite/name。 7. hibernate.max_fetch_depth hibernate.max_fetch_depth 参数用于设置...

    hibernate 配置属性参数详情(全)

    5. **hibernate.session_factory_name**:用于在JNDI中绑定SessionFactory的名称,便于其他组件获取SessionFactory实例。 6. **hibernate.max_fetch_depth**:控制单向关联的外连接抓取深度,较高的值可能导致更多...

    springmvc入门参数绑定ssm整合

    SpringMVC入门参数绑定SSM整合 SpringMVC是一种基于MVC模式的Web应用程序框架,它是Spring框架的一个模块,用于开发Web项目。下面是SpringMVC入门参数绑定SSM整合的知识点总结: 一、SpringMVC概述 SpringMVC是...

    hibernate参数配置

    **Hibernate参数配置详解** 在Java开发中,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。为了使Hibernate能更好地适应不同项目的需求,开发者可以通过配置一系列参数来调整其行为。...

    Hibernate 参数设置一览表(强烈推荐)

    在使用Hibernate进行应用程序开发时,正确配置Hibernate参数是至关重要的,因为这些参数直接影响到性能、内存使用和事务处理等关键方面。以下是对Hibernate参数设置的详细解释: 1. **hibernate.connection.driver_...

    Hibernate3的配置参数汇总

    - `hibernate.session_factory_name`:SessionFactory创建后,用此名称绑定到JNDI。 - `hibernate.max_fetch_depth`:控制外连接抓取的深度,默认值为0表示关闭。 - `hibernate.default_batch_fetch_size`:设置...

    第12章Spring MVC参数绑定的验证

    - **数组绑定**:Spring MVC支持将请求参数绑定到数组。比如,URL中的`ids[]=1&ids[]=2`会映射到`int[] ids`参数。 - **集合绑定**:同样,请求参数可以绑定到List、Set等集合类型。例如,JSON数组`["apple", ...

    hibernate显示不带?的完整sql

    这些配置会捕获Hibernate执行的SQL语句及其参数绑定,从而在控制台看到完整的、参数化的SQL。 在开发环境中,这样的配置非常有用,因为它能帮助我们理解查询行为,定位潜在的性能瓶颈,或者检查数据是否按照预期...

    java hibernate不同数据库之间的动态切换

    为了实现动态切换,我们不能直接硬编码这些配置,而是应该将它们作为可配置参数,例如从外部配置文件或者系统环境变量中读取。 1. **创建可配置的数据库连接信息** - 使用properties文件:创建一个名为`database....

    hibernate jsp 分页Demo

    10. **数据安全**: 在处理用户输入以构造查询时,必须防止SQL注入攻击,可以通过预编译语句(PreparedStatement)或者使用Hibernate的参数绑定机制来实现。 综上所述,"hibernate jsp 分页Demo"项目是一个教学实例...

    hibernate 参数汇总

    - `hibernate.session_factory_name`:SessionFactory 创建后,可以将其绑定到 JNDI 中的指定名称。 - `hibernate.max_fetch_depth`:设置外连接抓取的深度,值为 0 表示关闭默认的外连接抓取。 - `hibernate....

    Hibernate各种查询:联表查询 分页查询 位置参数查询(?) 占位符查询(冒号查询) 统计查询

    总的来说,Hibernate的`Criteria`、`Query`以及QBC(Query By Criteria)提供了灵活且强大的查询手段,它们不仅支持基本的单表查询,还能处理复杂的联表、分页、参数绑定和统计需求,是Java开发者进行数据库操作的...

    hibernate 实践 Query详解

    总结来说,这个实践主要涵盖了Hibernate的Query接口的使用,包括HQL查询的编写、参数绑定以及事务管理。理解并熟练运用这些知识,对于进行基于Hibernate的数据库操作至关重要。在实际开发中,开发者需要根据业务需求...

    Hibernate的查询方式

    有两种主要的参数绑定形式: - 使用问号(`?`)作为占位符,然后通过`setXXX()`方法绑定具体值。例如,按学生名及年龄查询Students对象: ```java Query query = session.createQuery("from Students s where s...

    Hibernate 多表连接分页查询示范项目

    Criteria API 提供了一种类型安全的方式来构建动态查询。它允许开发者通过编程的方式创建查询,而不需要直接写 SQL。例如,可以创建一个 Criteria 对象,然后添加各种限制条件、排序和分组,最后执行查询。对于多表...

    Hibernate API

    这两个接口提供了丰富的查询功能,包括参数绑定、分页、排序等。 5. **org.hibernate.annotations package** 这个包包含了各种注解,如`@Entity`、`@Table`、`@Id`、`@GeneratedValue`等,它们用于标记Java实体类...

Global site tag (gtag.js) - Google Analytics