Hibernate简介
Hibernate是一个开放源代码的对象关系映射框架(ORM),它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。Hibernate架构包括许多对象持久对象,会话工厂,事务工厂,连接工厂,会话,事务等
HQL语言
HQL(Hibernate Query Language)是完全面向对象的查询语言。它提供了更加面向对象的封装,因此它支持继承、多态等特征。
HQL基本语法如下:
注意这里查询的都是JAVA类对象
select "对象.属性名"
from "对象名"
where "条件"
group by "对象.属性名" having "分组条件"
order by "对象.属性名"
实体对象查询
查询所有信息
Employee是一个实体类 select * from Employee 等价于 from Employee
查询指定列名(投影查询)
注意:Employee对象必须要有构造方法public Employee(String empname, String job)
select new Employee (empname,job) from Employee
条件查询
简单条件查询
from Employee emp where emp.sex="男"
- 分页查询
Employee ee = new Employee(); // ee.setEmpname("杨%"); ee.setSalary(6000.0); // ee.setJob("神雕大侠"); Session session = HibernateSessionFactory.getSession(); StringBuffer buffer = new StringBuffer("from Employee where 1=1"); //拼接HQL if (ee.getEmpname() != null && ee.getEmpname().length() > 0) { buffer.append(" and empname like :empname"); } if (ee.getSalary() != null && ee.getSalary() > 0) { buffer.append(" and salary> :salary"); } if (ee.getJob() != null && ee.getJob().length() > 0) { buffer.append(" and job= :job"); } Query query=session.createQuery(buffer.toString()); query.setProperties(ee); //设置分页 query.setFirstResult(0); query.setMaxResults(5); List<Emp> list=query.list(); for (Emp e : list) { System.out.println(e.getEmpid() + "," + e.getEmpname() + "," + e.getGender() + "," + e.getJob() + "," + e.getSalary()); } HibernateSessionFactory.closeSession();
参数绑定机制
占位符 ? 替代具体参数
Session session=HibernateSessionFactory.getSession(); String hql="from Emp where empname like ? and salary>? and job=?"; Query query=session.createQuery(hql); //按顺序赋值 query.setString(0, "杨过"); query.setDouble(1, 5000); query.setString(2, "神雕大侠"); List<Emp> list=query.list(); //处理集合,关闭session HibernateSessionFactory.closeSession();
引用占位符 :param 替代具体参数
... Session session=HibernateSessionFactory.getSession(); String hql="from Emp where empname like :empname and salary>:salary and job=:job"; Query query=session.createQuery(hql); //按名称赋值 query.setString("empname", "杨过"); query.setDouble("salary", 5000); query.setString("job", "神雕大侠"); //不知道参数类型的情况下 query.setParameter("sex","男"); List<Emp> list=query.list(); //处理集合,关闭session HibernateSessionFactory.closeSession();
对象查询
... Session session=HibernateSessionFactory.getSession(); String hql="from Emp where empname like :empname and salary>:salary and job=:job"; Query query=session.createQuery(hql); Emp ee=new Emp(); ee.setEmpname("杨%"); ee.setSalary(5000.0); ee.setJob("神雕大侠"); //这里是将信息存入了emp对象 //将emp对象放入作为查询参数 //这里也支持Map格式的对象 query.setProperties(ee); List<Emp> list=query.list(); //处理集合,关闭session HibernateSessionFactory.closeSession();
排序查询
在SQL中通过order by 子句和 asc、desc 实现排序操作。HQL也提供了这样的功能,用法和SQL类似,只是操作的不再是数据表的列名,而是实体对象的属性。//按员工年龄降序排序,多个条件用逗号**,** 分隔 from Employee emp order by emp.age desc,emp.sex asc
聚合函数
HQL同样也支持聚合函数,如 sum、avg、count、max、min 等。例1:查询员工的平均年龄 select avg(emp.age) from Employee emp 例2:统计员工个数(统计任意列都可以) select count(emp.age) from Employee emp
子查询
HQL中子查询必须被圆括号()包起来查询年龄大于平均年龄的员工 from Employee emp where emp.age>(select avg(age) from Employee)