1. 程式人生 > >SSH之hibernate——get和load方法的區別

SSH之hibernate——get和load方法的區別

       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,取消延遲載入。