hibernate框架學習筆記12:查詢優化
阿新 • • 發佈:2018-02-20
不發送 方法 加載策略 單表查詢 lazy action private 對象 建議
類級別查詢優化:
創建一個實體類:
package domain; import java.util.HashSet; import java.util.Set; //客戶實體 public class Customer { private Long cust_id; private String cust_name; private String cust_source; private String cust_industry; private String cust_level; private String cust_linkman;View Codeprivate String cust_phone; private String cust_mobile; //使用set集合,表達一對多關系 private Set<LinkMan> linkMens = new HashSet<LinkMan>(); public Set<LinkMan> getLinkMens() { return linkMens; } public void setLinkMens(Set<LinkMan> linkMens) { this.linkMens = linkMens; } public Long getCust_id() { return cust_id; } public void setCust_id(Long cust_id) { this.cust_id = cust_id; } public String getCust_name() { return cust_name; } public void setCust_name(String cust_name) { this.cust_name = cust_name; }public String getCust_source() { return cust_source; } public void setCust_source(String cust_source) { this.cust_source = cust_source; } public String getCust_industry() { return cust_industry; } public void setCust_industry(String cust_industry) { this.cust_industry = cust_industry; } public String getCust_level() { return cust_level; } public void setCust_level(String cust_level) { this.cust_level = cust_level; } public String getCust_linkman() { return cust_linkman; } public void setCust_linkman(String cust_linkman) { this.cust_linkman = cust_linkman; } public String getCust_phone() { return cust_phone; } public void setCust_phone(String cust_phone) { this.cust_phone = cust_phone; } public String getCust_mobile() { return cust_mobile; } public void setCust_mobile(String cust_mobile) { this.cust_mobile = cust_mobile; } @Override public String toString() { return "Customer [cust_id=" + cust_id + ", cust_name=" + cust_name + "]"; } }
自定義工具類:
package utils; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateUtils { private static SessionFactory sf; static{ //1 創建,調用空參構造 Configuration conf = new Configuration().configure(); //2 根據配置信息,創建 SessionFactory對象 sf = conf.buildSessionFactory(); } //獲得session => 獲得全新session public static Session openSession(){ //3 獲得session Session session = sf.openSession(); return session; } //獲得session => 獲得與線程綁定的session public static Session getCurrentSession(){ //3 獲得session Session session = sf.getCurrentSession(); return session; } }View Code
測試類示例:
package lazy; import org.hibernate.Session; import org.hibernate.Transaction; import org.junit.Test; import domain.Customer; import utils.HibernateUtils; //懶加載|延遲加載 public class Demo { @Test // get方法 : 立即加載.執行方法時立即發送sql語句查詢結果 public void fun1(){ Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction(); //---------------------------------------------------- Customer c = session.get(Customer.class, 2l); System.out.println(c); //---------------------------------------------------- tx.commit(); session.close(); } @Test // load方法(默認):是在執行時,不發送任何sql語句.返回一個對象.使用該對象時,才執行查詢. // 延遲加載: 僅僅獲得沒有使用.不會查詢.在使用時才進行查詢. // 是否對類進行延遲加載: 可以在配置文件中通過在class元素上配置lazy屬性來控制. //lazy:true 加載時,不查詢.使用時才查詢b //lazy:false 加載時立即查詢. public void fun2(){ Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction(); //---------------------------------------------------- Customer c = session.load(Customer.class, 2l); //---------------------------------------------------- tx.commit(); session.close(); System.out.println(c); } }
為了提高效率,建議使用延遲加載,要確保調用屬性時候,session是打開的,否則會報出異常
關聯級別優化:
配置文件:集合的屬性配置
lazy屬性: 決定是否延遲加載
true(默認值): 延遲加載,懶加載
false: 立即加載
extra: 極其懶惰
fetch屬性: 決定加載策略.使用什麽類型的sql語句加載集合數據
select(默認值): 單表查詢加載
join: 使用多表查詢加載集合
subselect:使用子查詢加載集合
結論:為了提高效率.fetch的選擇上應選擇select. lazy的取值應選擇 true. 全部使用默認值.
hibernate框架學習筆記12:查詢優化