hibernate查询数据库的三种方式
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Hibernate查询数据库的三种方式
一、Hibernate的HQL与SQL查询
1.Hql(Hibernate Query Language )是面向对象的查询查询方式,HQL查询提供了更加丰富的和灵活的查询特性,因此Hibernate将HQL查询方式立为官方推荐的标准查询方式,提供了类似标准SQL语句的查询方式,同时也提供了面向对象的封装。HQL查询语句from关键字后面跟的类名+类对象, where 后用对象的属性做条件;
示例代码:(User是映射数据库的一个类)
public boolean checkUser(UserForm userForm) {
// TODO Auto-generated method stub
//String HQLString = "from User u where
ername='"+userForm.getUsername()+"'";
String HQLString = "from User u where ername=:uname";
Session session = HibernateSessionFactory.currentSession();
// 获取事务
session.beginTransaction();
Query query = session.createQuery(HQLString);
query.setParameter("uname", userForm.getUsername());//绑定参数
Object list = query.list().get(0);//list获取数据集,get获取数据集的某条记录
// 提交事务
session.getTransaction().commit();
// 关闭Session
HibernateSessionFactory.closeSession();
User user=(User)list;
if(user.getPassword().equals(userForm.getPassword())){
return true;
}
else{
return false;
}
}
2.sql 是面向数据库表查询,from 后面跟的是表名,where 后用表中字段做条件;
示例代码:([xxdb].[dbo].[student]就是要查询的数据库表)
public boolean checkUser(UserForm userForm) {
// TODO Auto-generated method stub
//String SQLString="select * from [xxdb].[dbo].[student] u where
erName='"+userForm.getUsername()+"'";
String SQLString=”select * from [xxdb].[dbo].[student] u where
erName=:uname”;
Session session = HibernateSessionFactory.currentSession();
session.beginTransaction();
//Query query = session.createSQLQuery(SQLString).addEntity(User.class);//实体查询
Query query = session.createSQLQuery(SQLString).
addScalar("userid",StandardBasicTypes.INTEGER).
addScalar("username",StandardBasicTypes.STRING).
addScalar("password",StandardBasicTypes.STRING).
addScalar("gender",StandardBasicTypes.INTEGER);//标量查询query.setParameter("uname", userForm.getUsername());//绑定参数
Object list = query.list().get(0);//list获取数据集,get获取数据集的某条记录
session.getTransaction().commit();
HibernateSessionFactory.closeSession();
User user=(User)list;
if(user.getPassword().equals(userForm.getPassword())){
return true;
}
else{
return false;
}
}
3.对比hql和sql查询方式我们可以发现他们之间的不同:
a.首先是查询语句的不同,hql语句from 后面跟的类名+类对象, where 后用对象的属性做条件,而sql语句from 后面跟的是表名,where 后用表中字段做条件,这也就是面向对象和面向数据库的一个区别。(上面例子中的User类映射的就是数据库中的[xxdb].[dbo].[student]表);
b.创建查询对象的方法有所不同,hql是creatQuery,而sql是creatSQLQuery;
c.Hql可以省略select关键字而sql不能省略。
4.hql和sql查询语句原则上都可以用拼接的方式书写查询条件,但为了为了防止SQL注入漏洞的产生一般用参数绑定的方式,参数绑定的方式有多种:按参数名称绑定query.setString(“uname”,“老谢”),按参数位置绑定query.setString(0,”laoxie”),setParameter()方法,setProperties()方法,setProperties方法命名参数与一个对象的属性值绑定在一起,如下程序代码:
User user=new User();
user.setUserName(“谢谢”);
user.setGender(“1”);
Query query=session.createQuery(from user u where ername=:name and u.gender=:gender);
query.setProperties(user);
setProperties()方法会自动将user对象实例的属性值匹配到命名参数上,但是要求命名参数名称必须要与实体对象相应的属性同名。
二、Hibernate条件查询
使用Hibernate时,即使不了解SQL的使用与撰写,也可以使用它所提供的API来进行SQL语句查询,org.hibernate.Criteria对SQL进行封装,可以从Java物件的观点来组合各种查询条件,由Hibernate自动产生SQL语句,而不用特别管理SQL与数据库相依的问题。Criteria criteria = session.createCriteria(User.class);
List users = criteria.list();