zoukankan      html  css  js  c++  java
  • hibernate预编译SQL语句中的setParameter和setParameterList

    使用预编译SQL语句和占位符參数(在jdbc中是?),可以避免由于使用字符串拼接sql语句带来的复杂性。我们先来简单的看下。使用预编译SQL语句的优点。

    使用String sql = "select * from Student where name=" + name;假设name的值是1或 "aty"或"aty'aty",就会产生以下错误的sql

    --ORA-01722 invalid number
    select * from student where name=1;
    
    --ORA-00904 invalid identifier
    select * from student where name=aty;
    
    --ORA-01756: quoted string not properly terminated
    select * from student where name=aty'aty;

    在构造sql的时候,使假设用了字符串拼接,就必须考虑数据类型,是否须要加单引號等细节问题,略微不注意。就会导致错误sql语句。当拼接字符串非常多的时候。代码差点儿不可读。定位问题也十分困难。

    这是预编译sql在代码可读性和简单性上的优势。还有就是性能上的优势,能够參考我的还有一篇博文:HQL或SQL使用?带来的优点:降低SQL解析时间、降低内存开销、防止SQL注入

     

    JDBC提供PreparedStatement.setXXX()来替换占位參数。hibernate相应的是setParameter和setParameterList。

    setParametersetParameterList的差别在于,使用in的时候。

    Object[] params = new Integer[]{1, 2};
    
    String hqlF = "from Student where id in (?,?

    )"; Query query = session.createQuery(hqlF); for (int i = 0; i < params.length; i++) { query.setParameter(i, params[i]); } //String hqlS = "from Student where id in :valueList"; String hqlS = "from Student where id in (:valueList)"; Query queryS = session.createQuery(hqlS); queryS.setParameterList("valueList", params);

    非常显然。使用setParameterList代码更简单。

    这里也赞美下hibernate的API设计,既提供了常规繁琐的做法setParameter。也提供了简洁易用的setParameterList。这样的一致性,对于熟悉和不熟悉hibernate的人来说,提供了很多其它的选择。

  • 相关阅读:
    I/O多路复用
    Django重点之url别名
    10 个常用的 Linux 命令?
    软连接和硬链接的区别?
    Linux 重定向命令有哪些?有什么区别?
    在 linux 中 find 和 grep 的区别??
    Django中用 form 实现登录注册
    你所遵循的PEP8代码规范是什么?请举例说明其要求?
    什么是 Python 的命名空间?
    ELK+Kafka日志收集环境搭建
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/6803779.html
Copyright © 2011-2022 走看看