Hibernate框架--学习笔记(下):hibernate的查询方式、多表查询、检索策略、批量抓取
?
一、hibernate的查詢方式:
主要有五種:對象導航查詢;OID查詢;hql查詢;QBC查詢;本地sql查詢。
?
1、對象導航查詢:根據id查詢某個客戶,再查詢這個客戶里面所有的聯系人。
2、OID查詢:根據id查詢某一條記錄,返回對象。
//演示 OID查詢,對象導航查詢//OID查詢:根據id查詢,返回一個對象//對象導航查詢:根據id查詢客戶,在根據這個客戶查詢所有的聯系人@Testpublic void TextSelect1(){SessionFactory sessionfactory=null;Session session=null;Transaction tx=null;try{sessionfactory=HibernateUtil.getSessionFactory();session=sessionfactory.openSession();tx=session.beginTransaction();Customer customer=session.get(Customer.class, 1);Set<LinkMan> linkman=customer.getSetLinkMan();System.out.println(linkman.size());tx.commit();}catch(Exception e){e.printStackTrace();tx.rollback();}finally{//session.close();//sessionfactory.close();}}?
3、hql查詢:Query對象,寫hql語句實現查詢:
①查詢所有:
//1.查詢所有數據:from 實體類名稱@Testpublic void Texthql1(){SessionFactory sessionfactory=null;Session session=null;Transaction tx=null;try{sessionfactory=HibernateUtil.getSessionFactory();session=sessionfactory.openSession();tx=session.beginTransaction();Query query=session.createQuery("from Customer");List<Customer> list=query.list();for(Customer customer:list){System.out.println(customer.getCid()+"::"+customer.getCustName());}tx.commit();}catch(Exception e){e.printStackTrace();tx.rollback();}finally{session.close();sessionfactory.close();}}②條件查詢:
//2.條件查詢//2.1from 實體類名稱 where 實體類屬性=? and 實體類屬性=?@Testpublic void Texthql2(){SessionFactory sessionfactory=null;Session session=null;Transaction tx=null;try{sessionfactory=HibernateUtil.getSessionFactory();session=sessionfactory.openSession();tx=session.beginTransaction();//創建Query對象Query query=session.createQuery("from Customer c where c.cid=? and c.custName=?");//給問號設值//setParamer方法兩個參數:第一個表示?的位置,從0開始;第二個表示具體參數值query.setParameter(0, 2);query.setParameter(1, "騰訊");List<Customer> list=query.list();for(Customer customer:list){System.out.println(customer.getCid()+"::"+customer.getCustName());}tx.commit();}catch(Exception e){e.printStackTrace();tx.rollback();}finally{session.close();sessionfactory.close();}} //2.2模糊查詢:from 實體類名稱 like 實體類屬性=?@Testpublic void Texthql22(){SessionFactory sessionfactory=null;Session session=null;Transaction tx=null;try{sessionfactory=HibernateUtil.getSessionFactory();session=sessionfactory.openSession();tx=session.beginTransaction();//創建Query對象Query query=session.createQuery("from Customer c where c.custName like ?");//給問號設值//setParamer方法兩個參數:第一個表示?的位置,從0開始;第二個表示具體參數值query.setParameter(0, "%度%");List<Customer> list=query.list();for(Customer customer:list){System.out.println(customer.getCid()+"::"+customer.getCustName());}tx.commit();}catch(Exception e){e.printStackTrace();tx.rollback();}finally{session.close();sessionfactory.close();}}③排序查詢:
//排序查詢:from 實體類名稱 order by 實體類屬性名稱 asc/desc@Testpublic void Texthql3(){SessionFactory sessionfactory=null;Session session=null;Transaction tx=null;try{sessionfactory=HibernateUtil.getSessionFactory();session=sessionfactory.openSession();tx=session.beginTransaction();//創建Query對象Query query=session.createQuery("from Customer order by cid asc");//Query query=session.createQuery("from Customer order by cid desc");List<Customer> list=query.list();for(Customer customer:list){System.out.println(customer.getCid()+"::"+customer.getCustName());}tx.commit();}catch(Exception e){e.printStackTrace();tx.rollback();}finally{session.close();sessionfactory.close();}}④分頁查詢:
開始位置=(當前頁-1)*每頁記錄數
//mysql數據庫://分頁查詢:先查詢所有數據,在使用Query封裝好的兩個方法://設置開始位置:query.setFirstResult();//設置每頁數據個數query.setMaxResults();@Testpublic void Texthql4(){SessionFactory sessionfactory=null;Session session=null;Transaction tx=null;try{sessionfactory=HibernateUtil.getSessionFactory();session=sessionfactory.openSession();tx=session.beginTransaction();//創建Query對象Query query=session.createQuery("from Customer");query.setFirstResult(0);//設置開始位置query.setMaxResults(3);//設置每頁數據個數List<Customer> list=query.list();for(Customer customer:list){System.out.println(customer.getCid()+"::"+customer.getCustName());}tx.commit();}catch(Exception e){e.printStackTrace();tx.rollback();}finally{session.close();sessionfactory.close();}}⑤投影查詢:
//投影查詢:查詢不是所有字段值,而是部分字段的值//寫法:select 實體類屬性名稱1,實體類屬性名車2 from 實體類//select后面不能寫*,不支持@Testpublic void Texthql5(){SessionFactory sessionfactory=null;Session session=null;Transaction tx=null;try{sessionfactory=HibernateUtil.getSessionFactory();session=sessionfactory.openSession();tx=session.beginTransaction();//創建Query對象Query query=session.createQuery("select custName from Customer");List<Customer> list=query.list();for(Object object:list){System.out.println(object);}tx.commit();}catch(Exception e){e.printStackTrace();tx.rollback();}finally{session.close();sessionfactory.close();}}⑥聚集函數使用:
//聚集函數://count、sum、avg、max、min@Testpublic void Texthql6(){SessionFactory sessionfactory=null;Session session=null;Transaction tx=null;try{sessionfactory=HibernateUtil.getSessionFactory();session=sessionfactory.openSession();tx=session.beginTransaction();//1.創建Query對象Query query=session.createQuery("select count(*) from Customer");//2.調用方法得到結果//也可以用list():Object obj = query.uniqueResult();System.out.println(obj);//轉成Int類型:首先把object變成long類型,再變成int類型//不能直接變int,會拋出異常Long lobj=(Long)obj;int count=lobj.intValue();System.out.println(count);tx.commit();}catch(Exception e){e.printStackTrace();tx.rollback();}finally{session.close();sessionfactory.close();}}?
4、QBC查詢:
使用hql查詢需要寫hql語句實現,但使用qbc時候,不需要寫語句,使用方法實現;
使用qbc時候,操作實體類和屬性;使用qbc的時候,使用Criteria對象;
Criteria對象:
①查詢所有:
//查詢所有@Testpublic void TextQBC1(){SessionFactory sessionfactory=null;Session session=null;Transaction tx=null;try{sessionfactory=HibernateUtil.getSessionFactory();session=sessionfactory.openSession();tx=session.beginTransaction();Criteria criteria=session.createCriteria(Customer.class);List<Customer> list=criteria.list();for(Customer customer:list){System.out.println(customer.getCid()+"::"+customer.getCustName());}tx.commit();}catch(Exception e){e.printStackTrace();tx.rollback();}finally{session.close();sessionfactory.close();}}②條件查詢:
//條件查詢@Testpublic void TextQBC2(){SessionFactory sessionfactory=null;Session session=null;Transaction tx=null;try{sessionfactory=HibernateUtil.getSessionFactory();session=sessionfactory.openSession();tx=session.beginTransaction();//1.創建對象Criteria criteria=session.createCriteria(Customer.class);//使用Criteria對象里面的方法設置條件值://首先使用add方法,表示設置條件值//在add方法里面使用類的方法實現條件設置//類似于cid=?//criteria.add(Restrictions.eq("cid",4));//criteria.add(Restrictions.eq("custName","百度"));criteria.add(Restrictions.like("custName","%歌%"));List<Customer> list=criteria.list();for(Customer customer:list){System.out.println(customer.getCid()+"::"+customer.getCustName());}tx.commit();}catch(Exception e){e.printStackTrace();tx.rollback();}finally{session.close();sessionfactory.close();}}③排序查詢:
//排序查詢:@Testpublic void TextQBC3(){SessionFactory sessionfactory=null;Session session=null;Transaction tx=null;try{sessionfactory=HibernateUtil.getSessionFactory();session=sessionfactory.openSession();tx=session.beginTransaction();Criteria criteria=session.createCriteria(Customer.class);//升序://criteria.addOrder(Order.asc("cid"));//降序:criteria.addOrder(Order.desc("cid"));List<Customer> list=criteria.list();for(Customer customer:list){System.out.println(customer.getCid()+"::"+customer.getCustName());}tx.commit();}catch(Exception e){e.printStackTrace();tx.rollback();}finally{session.close();sessionfactory.close();}}④分頁查詢:
開始位置=(當前頁-1)*每頁記錄數
//mysql數據庫的分頁查詢:@Testpublic void TextQBC4(){SessionFactory sessionfactory=null;Session session=null;Transaction tx=null;try{sessionfactory=HibernateUtil.getSessionFactory();session=sessionfactory.openSession();tx=session.beginTransaction();Criteria criteria=session.createCriteria(Customer.class);//設置開始位置,最前面的位置是0:criteria.setFirstResult(3);//設置每頁顯示的數據:criteria.setMaxResults(3);List<Customer> list=criteria.list();for(Customer customer:list){System.out.println(customer.getCid()+"::"+customer.getCustName());}tx.commit();}catch(Exception e){e.printStackTrace();tx.rollback();}finally{session.close();sessionfactory.close();}}⑤統計查詢:
//統計查詢@Testpublic void TextQBC5(){SessionFactory sessionfactory=null;Session session=null;Transaction tx=null;try{sessionfactory=HibernateUtil.getSessionFactory();session=sessionfactory.openSession();tx=session.beginTransaction();Criteria criteria=session.createCriteria(Customer.class);criteria.setProjection(Projections.rowCount());Object object=criteria.uniqueResult();//將Object轉成int類型:先轉Long類型再轉int類型Long lobj=(Long)object;int count=lobj.intValue();System.out.println(count);tx.commit();}catch(Exception e){e.printStackTrace();tx.rollback();}finally{session.close();sessionfactory.close();}}⑥離線查詢:
//離線查詢:一開始不使用session@Testpublic void TextQBC6(){SessionFactory sessionfactory=null;Session session=null;Transaction tx=null;try{sessionfactory=HibernateUtil.getSessionFactory();session=sessionfactory.openSession();tx=session.beginTransaction();//Criteria criteria=session.createCriteria(Customer.class);//1.創建對象:不需要使用sessionDetachedCriteria detachedCriteria=DetachedCriteria.forClass(Customer.class);//2.最終執行的時候才需要用到sesisonCriteria criteria=detachedCriteria.getExecutableCriteria(session);List<Customer> list=criteria.list();for(Customer customer:list){System.out.println(customer.getCid()+"::"+customer.getCustName());}tx.commit();}catch(Exception e) {e.printStackTrace();tx.rollback();}finally{session.close();sessionfactory.close();}}5、本地sql查詢:SQLQuery對象,使用普通sql實現查詢。
?
?
二、Hibernate的多表查詢:
1、在介紹hibernate的多表查詢之前,首先介紹一下mysql的多表查詢方式:
--內連接:
select?*?from?t_customer c,t_linkman l where?c.cid=l.clid;
select?*?from?t_customer c inner?join?t_linkman l on?c.cid=l.clid;
--左外連接:
select?*?from?t_customer c left?outer?join?t_linkman l on?c.cid=l.clid;
--右外連接:
select?*?from?t_customer c right?outer?join?t_linkman l on?c.cid=l.clid;
2、hIbernate的多表查詢:
(1)內連接:返回list,list里面每部分是數組形式:
// 內連接:@Testpublic void ManyTableSelect1() {SessionFactory sessionfactory = null;Session session = null;Transaction tx = null;try {sessionfactory = HibernateUtil.getSessionFactory();session = sessionfactory.openSession();tx = session.beginTransaction();// 1.創建對象Query query = session.createQuery("from Customer c inner join c.setLinkMan");// 內連接返回的list,list里面的每一部分都是數組形式List list = query.list();System.out.println(list.size());tx.commit();} catch (Exception e) {e.printStackTrace();tx.rollback();} finally {session.close();sessionfactory.close();}}(2)迫切內連接:底層實現與內連接是一樣的,不過返回的list每部分是對象::
// 迫切內連接@Testpublic void ManyTableSelect2() {SessionFactory sessionfactory = null;Session session = null;Transaction tx = null;try {sessionfactory = HibernateUtil.getSessionFactory();session = sessionfactory.openSession();tx = session.beginTransaction();// 1.創建對象,在hql語句中加fetch關鍵字Query query = session.createQuery("from Customer c inner join fetch c.setLinkMan");// 迫切內連接返回的list,list里面的每一部分都是對象形式,底層和內連接是一樣的List list = query.list();System.out.println(list.size());tx.commit();} catch (Exception e) {e.printStackTrace();tx.rollback();} finally {session.close();sessionfactory.close();}}(3)左外連接:返回list,list里面每部分是數組形式:
// 左外連接@Testpublic void ManyTableSelect3() {SessionFactory sessionfactory = null;Session session = null;Transaction tx = null;try {sessionfactory = HibernateUtil.getSessionFactory();session = sessionfactory.openSession();tx = session.beginTransaction();// 1.創建對象Query query = session.createQuery("from Customer c left outer join c.setLinkMan");// 左外連接返回的list,list里面的每一部分都是數組形式List list = query.list();System.out.println(list.size());tx.commit();} catch (Exception e) {e.printStackTrace();tx.rollback();} finally {session.close();sessionfactory.close();}}(4)迫切左外連接:底層實現與內連接是一樣的,不過返回的list每部分是對象:
// 迫切左外連接@Testpublic void ManyTableSelect4() {SessionFactory sessionfactory = null;Session session = null;Transaction tx = null;try {sessionfactory = HibernateUtil.getSessionFactory();session = sessionfactory.openSession();tx = session.beginTransaction();// 1.創建對象,在hql語句中加fetch關鍵字Query query = session.createQuery("from Customer c left outer join fetch c.setLinkMan");// 迫切左外連接返回的list,list里面的每一部分都是對象形式,底層和內連接是一樣的List list = query.list();System.out.println(list.size());tx.commit();} catch (Exception e) {e.printStackTrace();tx.rollback();} finally {session.close();sessionfactory.close();}}(5)右外連接:返回list,list里面每部分是數組形式(沒有迫切右外連接):
// 右外連接@Testpublic void ManyTableSelect5() {SessionFactory sessionfactory = null;Session session = null;Transaction tx = null;try {sessionfactory = HibernateUtil.getSessionFactory();session = sessionfactory.openSession();tx = session.beginTransaction();// 1.創建對象Query query = session.createQuery("from Customer c right outer join c.setLinkMan");// 右外連接返回的list,list里面的每一部分都是數組形式List list = query.list();System.out.println(list.size());tx.commit();} catch (Exception e) {e.printStackTrace();tx.rollback();} finally {session.close();sessionfactory.close();}}?
三、hibernate的檢索策略:
Hibernate的檢索策略主要分成兩種:立即查詢和延遲查詢。
1、立即查詢:根據id查詢,調用get方法,一調用get方法,馬上發送語句查詢數據庫。
2、延遲查詢:根據id查詢,還有load方法,調用load方法,不會馬上發送語句查詢數據,只有得到對象里面的值時候才會發送語句查詢數據庫。(即想要查詢對象里面不是id的其他值得時候才會發送語句,提高性能)
(1)延遲查詢分為:
①類級別延遲:根據id查詢返回實體類對象,調用load方法,不會馬上發送語句。
②關聯級別延遲:查詢某個客戶,在查詢這個客戶的所有聯系人,查詢客戶的所有聯系 人的過程是否需要延遲,這個過程稱為關聯級別延遲。
(2)關聯級別延遲操作:
①根據客戶得到所有的聯系人,在客戶映射文件中配置;
②在set標簽上使用屬性
---fetch:值select(默認)
---lazy的值:true:延遲(默認);false:不延遲;extra:極其延遲。
<!-- 在客戶映射文件中,表示所有聯系人。 關聯級別延遲操作:fetch="select" lazy="true"。 fetch值:select(默認) 。lazy值:true延遲(默認) false不延遲 extra極其延遲--> <set name="setLinkMan" cascade="save-update,delete" inverse="true" fetch="select" lazy="true"><key column="clid"></key><!-- 客戶所有的聯系人,class里面寫聯系人實體全路徑 --><one-to-many class="com.zwp.onetomany.LinkMan"/> </set>?
?
四、Hibernate的批量抓取:
<!-- 在客戶映射文件中,表示所有聯系人。batch-size="10":批量抓取,值越大,效率越高 --> <set name="setLinkMan" cascade="save-update,delete" inverse="true" fetch="select" lazy="true" batch-size="10"><key column="clid"></key><!-- 客戶所有的聯系人,class里面寫聯系人實體全路徑 --><one-to-many class="com.zwp.onetomany.LinkMan"/> </set>總結
以上是生活随笔為你收集整理的Hibernate框架--学习笔记(下):hibernate的查询方式、多表查询、检索策略、批量抓取的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hibernate框架--学习笔记(中)
- 下一篇: Struts2框架--学习笔记(上):搭