这样其实是很蠢的一种做法!!!!
举个栗子~~
我们模仿一下用户登录的场景:
常见的做法是将前台获取到的用户名和密码,作为字符串动态拼接到查询语句中,然后去调用数据库查询~查询的结果不为null就代表用户存在,则登陆成功,否则登录失败!
正常情况下用户输入账号是123456和密码123(假设是错误的密码或者说这个用户根本不存在)
usernameString//前台输入的用户名passwordString//前台输入的密码//hql语句String queryString = "from User t where t.username:usernameString and t.password: passwordString";//执行查询List result = session.createQuery(queryString) .setString("usernameString ", usernameString ) .setString("passwordString", passwordString) .list();使用positional parameter
usernameString//前台输入的用户名passwordString//前台输入的密码//hql语句String queryString = "from User t where t.username=? and t.password=?";//执行查询List result = session.createQuery(queryString) .setString(0, usernameString ) .setString(1, passwordString) .list();两者比较:positional parameter可读性强不如named parameter的强,而且可维护性差,如果我们的查询稍微改变一点,将第一个参数和第二个参数改变一下位置,
这样我们的代码中涉及到位置的地方都要修改,所以我们强烈建议使用named parameter方式进行参数绑定。
最后,在named parameter中可能有一个参数出现多次的情况,应该怎么处理呢?
在举个栗子~~
我们模仿一下用户登录的场景:这次业务变换,有的网站,手机号可以作为用户名来登录,也能作为手机号本身登录。
常见的做法是将前台获取到的用户名or手机号和密码,作为字符串动态拼接到查询语句中,然后去调用数据库查询~查询的结果不为null就代表用户存在,则登陆成功,否则登录失败!
正常情况下用户输入账号是13812345678和密码123
这里usernameString作为手机号又作为用户名出现了两次,怎么办呢?
大家请看下面代码:
usernameString//前台输入的用户名passwordString//前台输入的密码//hql语句String queryString = "from User t where t.username:usernameString and t.phone:usernameString and t.password: passwordString";//执行查询List result = session.createQuery(queryString) .setString("usernameString ", usernameString ) .setString("passwordString", passwordString) .list();在Hibernate+spring中getHibernateTemplate()返回的对象可以调用find(String queryString, Object value...Object value)来实现named parameter。比如:
您可能想查找下面的文章:
- SQL语句中SUM与COUNT的区别深入分析
- 解决hibernate+mysql写入数据库乱码
- hibernate如何连接mysql数据库?
- 怎样利用Hibernate来防止SQL注入的方法
- MySQL之-使用Hibernate连接MySQL数据库时连接超时断开的问题解决方法
- mysql + Fluently NHibernate + WebAPI + Autofac
- MySQL之—— 使用Hibernate连接MySQL数据库,MySQL连接超时断开的问题
- mysql-hibernate整合MySQL,出现异常
- java-Mysql数据库和Hibernate持久化框架
- Hibernate Oracle sequence的使用技巧