没有参数绑定,您必须像这样(错误代码)连接参数String:
String hql = "from Stock s where s.stockCode = '" + stockCode + "'";
List result = session.createQuery(hql).list();
将未经检查的值从用户输入传递到数据库会引起安全问题,因为它很容易通过SQL注入被黑客入侵。 您必须避免上面的错误代码,而应使用参数绑定。
休眠参数绑定
参数绑定有两种方法:命名参数或位置参数。
1.命名参数
这是最常见且用户友好的方式。 它使用冒号后跟参数名称(:example)来定义命名参数。 查看示例…
示例1 – setParameter
setParameter足够聪明,可以为您发现参数数据类型。
String hql = "from Stock s where s.stockCode = :stockCode";
List result = session.createQuery(hql)
.setParameter("stockCode", "7277")
.list();
示例2 – setString
您可以使用setString告诉Hibernate此参数日期类型为String。
String hql = "from Stock s where s.stockCode = :stockCode";
List result = session.createQuery(hql)
.setString("stockCode", "7277")
.list();
示例3 – setProperties
这个功能很棒! 您可以将对象传递到参数绑定中。 Hibernate将自动检查对象的属性并与冒号参数匹配。
Stock stock = new Stock();
stock.setStockCode("7277");
String hql = "from Stock s where s.stockCode = :stockCode";
List result = session.createQuery(hql)
.setProperties(stock)
.list();
2.位置参数
它使用问号(?)定义命名参数,并且您必须根据位置顺序设置参数。 参见示例…
String hql = "from Stock s where s.stockCode = ? and s.stockName = ?";
List result = session.createQuery(hql)
.setString(0, "7277")
.setParameter(1, "DIALOG")
.list();
此方法不支持setProperties函数。 此外,由于绑定参数位置的每次更改都需要更改参数绑定代码,因此容易遭到破坏。
String hql = "from Stock s where s.stockName = ? and s.stockCode = ?";
List result = session.createQuery(hql)
.setParameter(0, "DIALOG")
.setString(1, "7277")
.list();
结论
在Hibernate参数绑定中,我建议始终使用“ 命名参数 ”,因为它更易于维护,并且可以重用已编译的SQL语句(如果仅更改绑定参数)以提高性能。
标签: 冬眠
翻译自: https://mkyong.com/hibernate/hibernate-parameter-binding-examples/