1. 程式人生 > >hibernate框架學習筆記12:查詢優化

hibernate框架學習筆記12:查詢優化

不發送 方法 加載策略 單表查詢 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;
    
private 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 + "]"; } }
View Code

自定義工具類:

技術分享圖片
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:查詢優化