`

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 and user:customerage=:age );
  query.setString(customername,name);
  query.setInteger(customerage,age);
  上面代码中用:customername:customerage分别定义了命名参数customernamecustomerage,然后用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开始编号),第二个参数仍然代表参数实际值。
  注:在实际开发中,提倡使用按名称邦定命名参数,因为这不但可以提供非常好的程序可读性,而且也提高了程序的易维护性,因为当查询参数的位置发生改变时,按名称邦定名参数的方式中是不需要调整程序代码的。
  CsetParameter()方法:
  在HibernateHQL查询中可以通过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
  DsetProperties()方法:(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=zhaoxinor x=xand user.password=admin’ ”;
  显然这条HQL语句的where字句将会永远为真,而使用户口令的作用失去意义,这就是SQL Injection攻击的基本原理。
  而使用绑定参数方式,就可以妥善处理这问题,当使用绑定参数时,会得到下面的HQL语句:
  from User user where user.name=’’zhaoxin’’ or ‘’x=’’x’’ ‘ and user.password=admin;由此可见使用绑定参数会将用户名中输入的单引号解析成字符串(如果想在字符串中包含单引号,应使用重复单引号形式),所以参数绑定能够有效防止SQL Injection安全漏洞。

分享到:
评论

相关推荐

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

    在这个过程中,Hibernate 会检查配置文件中的 `hibernate.session_factory_name` 属性,该属性指定了 JNDI 绑定的名称。 接下来,我们来看一下 `buildSessionFactory()` 方法的实现。该方法首先检查配置信息,然后...

    Hibernate的JNDI绑定分析.doc

    - 在此过程中,`SessionFactory`的实例作为参数传递给了`addInstance`方法,并最终通过`bind`方法被绑定到了JNDI名称上。这个名称通常是由`hibernate.properties`文件中的`hibernate.session_factory_name`属性指定...

    Hibernate 参数配置详解

    - **描述**:创建 `SessionFactory` 后,将其自动绑定到 JNDI 中的名称。 - **取值**:JNDI 名称。 - **示例**:`hibernate.session_factory_name=jndi/mySessionFactory` ##### 7. 最大抓取深度 (Max Fetch Depth)...

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

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

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

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

    springmvc入门参数绑定ssm整合

    SpringMVC参数绑定是指将用户请求的参数绑定到控制器的方法参数中。例如,使用@PathVariable注解绑定URL中的参数,使用@RequestParam注解绑定请求参数。 五、SSM整合 SSM整合是指将SpringMVC、MyBatis和Spring框架...

    hibernate参数配置

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

    hibernate中session的管理

    在Hibernate框架中,Session是与数据库交互的主要接口,它负责对象的持久化操作。然而,由于Session不是线程安全的,所以在多线程环境中管理Session就需要特别注意。本篇文章将详细探讨Hibernate中Session的管理,...

    Hibernate3的配置参数汇总

    - `hibernate.connection.datasource`:数据源的JNDI名字,适用于应用服务器中的数据源。 - `hibernate.jndi.url`:JNDI提供者的URL(可选)。 - `hibernate.jndi.class`:JNDI InitialContextFactory类(可选)...

    hibernate显示不带?的完整sql

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

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

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

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

    在Spring MVC框架中,参数绑定和验证是处理HTTP请求的核心环节。本章主要探讨的是如何在Spring MVC中实现对请求参数的有效性和正确性进行验证,确保应用的数据安全和业务流程的顺畅。以下将详细讲解各个知识点: 1....

    Hibernate中的sessionFactory

    Query接口支持Hibernate查询语言(HQL)和原生SQL查询,可以进行参数绑定、分页等操作。Criteria接口则提供了一种面向对象的方式来构建查询,更加灵活,同时也支持动态构建查询条件。 至于`Callback`接口,它定义了...

    Hibernate+中文文档

    3.8.2. JNDI绑定的SessionFactory 3.8.3. 在JTA环境下使用Current Session context (当前session上下文)管理 3.8.4. JMX部署 4. 持久化类(Persistent Classes) 4.1. 一个简单的POJO例子 4.1.1. 实现一个默认的...

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

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

    hibernate 3.2中文手册 中文文档

    - 介绍如何在Servlet中使用Hibernate来处理业务逻辑,并将结果呈现给用户。 - **1.4.3 部署与测试** - 提供部署和测试该web应用的具体步骤。 - **1.5 总结** - 对本章内容进行总结,并强调了理解Hibernate基本...

    springmvc+hibernate+定时器配置实例

    SpringMVC还支持注解驱动,使得开发者可以通过注解在方法上定义路由、参数绑定和验证,大大提高了开发效率。 **Hibernate** Hibernate是一个流行的ORM框架,它允许开发者用面向对象的方式来操作数据库。通过...

    hibernate实现动态SQL查询

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

    hibernate3.5.4中文帮助文档.pdf

    - 查询语言中的替换:解释了如何在Hibernate查询语言(HQL)中使用参数替换。 - 统计机制:展示了如何启用Hibernate的统计功能,以便收集性能指标等数据。 - **日志**:介绍了如何配置日志记录,以便记录Hibernate的...

    hibernate jsp 分页Demo

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

Global site tag (gtag.js) - Google Analytics