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)