zoukankan      html  css  js  c++  java
  • Hibernate HQL的update方法详解

    虽然hibernate提供了许多方法对数据库进行更新,但是这的确不能满足开发需要。现在讲解一下用hql语句对数据进行更新。

    不使用参数绑定格式String hql="update User u set u.userName=123 where u.userId=2";

    介绍5种参数绑定,和为什么要使用参数绑定,好处在哪里。

    一.query.setParameter(属性名,真实值,类型);

    String hql="update User u set u.userName=:userName where u.userId=:userId";

    Query query  = getSession.createQuery(hql); 

    query.setParameter("userName", userName(对应:后面的值), Hibernate.STRING);

    query.setParameter("userId", userId(对应:后面的值), Hibernate.INTEGER);

    query.executeUpdate();


    二.query.setXXXX(属性值,真实值);

    String hql="update User u set u.userName=:userName where u.userId=:userId";

    query.setString("userName",userName);

    query.setInteger("userId",userId);

    query.executeUpdate();


    三.query.setString(问号位置,真实值);

    String hql="update User u set u.userName=? where u.userId=?";

    Query query  = getSession.createQuery(hql); 

    query.setString(0,userName);

    query.setInteger(1,userId);

    query.executeUpdate();


    四.query.setProperties(对象);

    String hql="update User u set u.userName=:userName where u.userId=:userId";

    Query query  = getSession.createQuery(hql); 

    User user = new User();

    user.serUserName("张三");

    user.setUserId(2);

    query.setProperties(user);

    query.executeUpdate();


     

    五. 这里还有一个特殊的setEntity()方法,它会把命名参数与一个持久化对象相关联,如下面代码所示:
    Customer customer=(Customer)session.load(Customer.class,”1”);
    Query query=session.createQuery(“from Order order where order.customer=:customer ”);
    query. setProperties(“customer”,customer);
    List list=query.list();
    上面的代码会生成类似如下的SQL语句:
    Select * from order where customer_ID=’1’;


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

  • 相关阅读:
    MySQL动态游标
    扩展JS Date对象时间格式化功能
    Spring+ibatis动态管理数据源
    Spring在web应用中获得Bean的方法
    访问iis时需要输入服务器用户名密码
    sql08 语句修改标识列数据
    在浏览器选项卡上面追加网站Logo图
    'WebForm_PostBackOptions' 未定义 webForm_PostBackOptions is undefined
    pylot是一款开源的web性能测试工具
    在RedHat上安装gcc,java 和 eclipse-rcp
  • 原文地址:https://www.cnblogs.com/wenjieyatou/p/5976524.html
Copyright © 2011-2022 走看看