今日學習主要知識點(所借用案例都是雙向多對一,一對多):
1.分頁
2.多表查詢
3.所需數據庫代碼
insert into CLASSINFO values('c111','banji1'); insert into CLASSINFO values('c222','banji2'); insert into persons values('p1','p111','c111') insert into persons values('p2','p222','c111') insert into persons values('p3','p333','c222') insert into persons values('p4','p444','c222') insert into persons values('p5','p555',null) select * from CLASSINFO select * from persons inner join CLASSINFO on persons.rci = CLASSINFO.cid select * from persons left outer join CLASSINFO on persons.rci = CLASSINFO.cid select * from CLASSINFO left outer join persons on CLASSINFO.cid = persons.rci
一、分頁查詢
(1)圖解
(2)分頁Main測試
public static void main(String[] args) { //老師,分頁1,當前頁下標從0開始 //pageQuery1(3,1);//第二頁:序號為4,即從序號4開始,把第二頁的所有數據顯示出來 //my分頁2,改進,當前頁下標從1開始(正常的日常分頁) //pageQuery2(3,2);//第一頁:(3,1)每頁顯示3條記錄,當前頁為1 } /* * pageSize:表示每頁顯示的記錄數量 * pageno:表示顯示的是第幾頁(數字是從1開始) * * pageIndex:表示顯示的是第幾頁(數字是從0開始) 選擇 * 當pageIndex=2時,意味着當前顯示的是第3頁 * 所以(3,2)表示的是每條記錄顯示3條,第三頁的第一個序號為7 * 即:從序號為7開始,把第三頁的所有數據輸出 * (3,2)=6--> 7 * * 0,1,2,3,4,5,6 */ private static void pageQuery1(int pageSize,int pageIndex) { SessionFactory sf = HibernateUtil.getSessionFactory(); Session s = sf.openSession(); Transaction tx = s.beginTransaction(); String hql = "select p from Person p "; Query q = s.createQuery(hql); q.setMaxResults(pageSize);//這個參數設定的其實是每頁記錄總數 q.setFirstResult(pageSize*pageIndex);//每頁的第一條記錄所在序號公式 List<Person> list = q.list(); for(Person p: list){ System.out.println(p); } tx.commit(); s.close(); sf.close(); } /* * 如果選用 * pageno:表示顯示的是第幾頁(數字是從1開始) * (3,1)每頁顯示3條記錄,當前頁為1 * pagesize(pageno-1)+1-->當前序號,需-1 * * */ private static void pageQuery2(int pageSize,int pageno) { SessionFactory sf = HibernateUtil.getSessionFactory(); Session s = sf.openSession(); Transaction tx = s.beginTransaction(); String hql = "select p from Person p "; Query q = s.createQuery(hql); q.setMaxResults(pageSize);//這個參數設定的其實是每頁記錄總數 q.setFirstResult(pageSize*(pageno-1));//每頁的第一條記錄所在序號公式 List<Person> list = q.list(); for(Person p: list){ System.out.println(p); } tx.commit(); s.close(); sf.close(); } }
二、多表連接查詢
(1)圖解
(2)多表連接查詢Main測試
package com.nf; import java.util.List; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.query.Query; import shuang.m2oo2m.Person; import util.HibernateUtil; public class Main { public static void main(String[] args) { //多表連接 //內連接 //innerQuery(); //左外連接1:以Person為主表 //leftOuterJoin(); //左外連接2:以ClassInfo為主表 //leftOuterJoin2(); fetchJoin() ; } private static void innerQuery() { SessionFactory sf = HibernateUtil.getSessionFactory(); Session s = sf.openSession(); Transaction tx = s.beginTransaction(); /*inner join p.ci中的p.ci是通過實體對象Person中的屬性ci映射找到對應的班級信息而來*/ String hql = "select p from Person p inner join p.ci c "; Query q = s.createQuery(hql); List<Person> list = q.list(); for(Person p: list){ System.out.println(p); } tx.commit(); s.close(); sf.close(); /*結果 Person [pid=p1, name=p111] Person [pid=p2, name=p222] Person [pid=p3, name=p333] Person [pid=p4, name=p444] * */ } private static void leftOuterJoin() { SessionFactory sf = HibernateUtil.getSessionFactory(); Session s = sf.openSession(); Transaction tx = s.beginTransaction(); String hql = "select p from Person p left join p.ci c "; Query q = s.createQuery(hql); List<Person> list = q.list(); for(Person p: list){ System.out.println(p); } /*結果 Person [pid=p1, name=p111] Person [pid=p2, name=p222] Person [pid=p3, name=p333] Person [pid=p4, name=p444] Person [pid=p5, name=p555] * */ tx.commit(); s.close(); sf.close(); } /* * 此方法演示的是,鏈接的時候,如果select多個實體 * 返回的是對象數組,而不是Person 的list集合 * 這樣導致取數據的時候麻煩 */ private static void leftOuterJoin2() { SessionFactory sf = HibernateUtil.getSessionFactory(); Session s = sf.openSession(); Transaction tx = s.beginTransaction(); String hql = "select p,c from Person p left join p.ci c "; Query q = s.createQuery(hql); List<Object[]> list = q.list(); for(Object[] data: list){ System.out.println(data[0]); System.out.println(data[1]); } /*結果 Person [pid=p1, name=p111] ClassInfo [cid=c111, name=banji1] Person [pid=p2, name=p222] ClassInfo [cid=c111, name=banji1] Person [pid=p3, name=p333] ClassInfo [cid=c222, name=banji2] Person [pid=p4, name=p444] ClassInfo [cid=c222, name=banji2] Person [pid=p5, name=p555] null * */ tx.commit(); s.close(); sf.close(); } /*返回的是整個Person類里有的所有屬性*/ private static void fetchJoin() { SessionFactory sf = HibernateUtil.getSessionFactory(); Session s = sf.openSession(); Transaction tx = s.beginTransaction(); String hql = "select p from Person p left join fetch p.ci c "; Query q = s.createQuery(hql); List<Person> list = q.list(); for(Person p: list){ System.out.println(p); System.out.println(p.getCi().getName()); } /*結果: Person [pid=p1, name=p111] banji1 Person [pid=p2, name=p222] banji1 Person [pid=p3, name=p333] banji2 Person [pid=p4, name=p444] banji2 Person [pid=p5, name=p555] * */ tx.commit(); s.close(); sf.close(); } }
/*以上個人整理筆記,如果有誤或者有不懂的地方,歡迎評論與指出*/