Hibernate 框架总结(一):简单开发
Hibernate 框架总结(二):session的获取方式及hibernate对象的生命周期
Hibernate 框架总结(三):主键的生成策略
Hibernate 框架总结(四):多张表的关联映射
Hibernate 框架总结(六):缓存机制
前面几节学到了通过get和load 方式查询,不过那只能够通过主键来查询。
Hibernate对数据库查询的三种方式:
1.criteria查询
先录入几条数据,进行查询
package sdibt.fly.dao;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import sdibt.fly.entity.Student;
import sdibt.fly.util.HibernateUtils;
public class UserDao {
public static void main(String[] args) {
//从util中拿到session
Session session = HibernateUtils.getSession();
//获取Student表中的数据
Criteria c = session.createCriteria(Student.class);
//添加查询条件,通过Restrictions类来添加条件
//查询大于18岁的学生
c.add(Restrictions.gt("age", 18));
//将查询到的数据存放在list集合当中
List<Student> list = c.list();
//循环遍历集合,拿到数据
for (Student student : list) {
System.out.println(student.getStuName());
}
//关闭资源
HibernateUtils.closeSession(session);
}
}
查询到的结果
可以添加多个add方法来过滤条件,Restrictions过滤条件:
分页条件:查询第6到10条数据,
c.setFirstResult(5);设置从第几条数据开始查询,下标从0开始
c.setMaxResults(5);共查询几条数据
2.hql查询
类似sql,不过sql是通过表来查询,hql是通过实体类来查询
//从util中拿到session
Session session = HibernateUtils.getSession();
//获取Student表中的数据
Query q = session.createQuery("form Student");
//将查询到的数据存放在list集合当中
List<Student> list = q.list();
可以在后面添加where字句
Query q = session.createQuery("from Student where age>18");
如果要查询部分列,那么查询到的集合的泛型是object[],数组中存储的每一行的数据,比如list集合中的第一个元素,存放的就是查询到的第一行的元素,
关联查询:查询' 计算机' 班的学生姓名
因为classes是Student类的属性,这里就直接引用,和其他类没法使用该方法
//获取Student表中的数据
Query q = session.createQuery("select s.stuName,s.age from Student s where s.classes.clsName='计算机'");
//将查询到的数据存放在list集合当中
List<Object[]> list = q.list();
//循环遍历集合,拿到数据
for (Object[] obj : list) {
System.out.println(obj[0]);
}
为防止sql注入,可以使用?代替参数
Query q = session.createQuery("select s.stuName,s.age from Student s where s.classes.clsName=?");
q.setParameter(0, "计算机");
//将查询到的数据存放在list集合当中
List<Object[]> list = q.list();
同样的,hql也可以用来增删改
删除姓名是'zhangsan'的学生,进行增删改的操作要开启事务
//获取Student表中的数据
Query q = session.createQuery("delete from Student where stuName=?");
q.setParameter(0, "zhangsan");
//开启事务
Transaction tx = session.beginTransaction();
//进行删除操作
q.executeUpdate();
//提交事务
tx.commit();
3.sql查询
sql就比较熟悉了,直接对表进行查询
查询到的数据会是object[]泛型的list集合,如果确定查找的是一个完整的列并且是一个表中的数据,就可以将查询到的数据转换成实体类
//获取Student表中的数据
SQLQuery sq = session.createSQLQuery("select * from tb_student");
//查询到的数据变成实体对象
sq.addEntity(Student.class);
List<Student> list = sq.list();
for (Student student : list) {
System.out.println(student.getStuName());
}