日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Hibernate框架--学习笔记(下):hibernate的查询方式、多表查询、检索策略、批量抓取

發布時間:2024/9/30 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的查询方式、多表查询、检索策略、批量抓取的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。