SSH之hibernate——get和load方法的區別
阿新 • • 發佈:2019-01-08
hibernate查詢資料可以用get()和load()方法,但是它們的機制還有一些不同,下面講解具體的區別。
一、建實體類User,並配置對映檔案
因為實體類建立非常簡單,這裡不多說,之間看對映檔案是如何配置的。
<hibernate-mapping> <class name="com.zx.hibernate.User" > <id name="id"> <generator class="uuid" /> </id> <property name="name" /> <property name="password" /> <property name="createTime" /> <property name="expireTime" /> </class> </hibernate-mapping>
對映檔案映射了實體的屬性,設定主鍵的生成方式,它一般是*.hbm.xml檔案
二、hibernate的核心檔案hibernate.cfg.xml
<hibernate-configuration> <session-factory> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_session</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">root</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <property name="hibernate.show_sql">true</property> <mapping resource="com/zx/hibernate/User.hbm.xml"/> </session-factory> </hibernate-configuration>
核心檔案不僅有資料庫驅動、使用者名稱、密碼等還配置了對映檔案,在程式執行時通過解析核心檔案找到對映檔案,從而和資料庫打交道。
配置好上述這些,然後寫一個匯出資料庫的方法,然後建立資料庫,再新增一些資料,這裡不做詳細介紹。
三、查詢存在的資料
1 .get()方法
public void testGet1() { Session session = null; try { session = hibernateUtils.getSession(); session.beginTransaction(); // get載入上來的是持久物件 // 執行get會馬上發出查詢語句 User user = (User) session.get(User.class, "4028980c47fdf5800147fdfa46770001"); System.out.println(user.getName()); session.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); session.getTransaction().rollback(); } finally { hibernateUtils.closeSession(session); } }
程式執行到get方法會馬上發出查詢語句
2.load()方法
public void testLoad1() {
Session session = null;
try {
session = hibernateUtils.getSession();
session.beginTransaction();
//不會馬上發出查詢語句,因為load支援延遲載入
//延遲載入:真正使用物件的時候才建立,對於hibernate來說,
//才真正的發出查詢語句,主要為了提高效能,lazy是hibernate中非常重要的特性
//hibernate的lazy如何實現?採用代理機制,代理物件主要用CGLIB庫生產
//而不是jdk的動態代理,因為jdk的動態代理只能對實現介面的類生產代理
//CGLIB生產代理,採用繼承方式
User user = (User) session.load(User.class,
"4028980c47fdeb1b0147fdebf6a10001");
System.out.println(user.getName());
user.setName("wangwu");
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
} finally {
hibernateUtils.closeSession(session);
}
}
執行到 load()方法不會馬上發出查詢語句,當執行user.getName()時才會發出查詢語句,具有延遲載入的功能四、查詢不存在的資料
1、get()方法
程式碼和上邊的一樣,只是id值是資料庫不存在的,這裡不再寫程式碼,只展示執行的結果
返回空指標,因為後邊我們使用了user.getName()。
2、load()方法
load方法查詢不存在的資料時會出現異常
五、總結
1、區別
a、get方法不支援延遲載入,load方法支援延遲載入
b、查詢不存在的資料get返回null,load返回objectnotfoundexception異常
2、延遲載入的好處
如果不延遲載入,每次執行都會把相關的物件都查出來,很可能包含許多沒用的資訊,所以會降低查詢的效率,相反延遲載入是用到什麼資料查什麼資料,減少了很多資料庫操作請求,提高了查詢的效率。
3、延遲載入並不是絕對的,load方法預設lazy="true",如果改為false,取消延遲載入。