------------吾亦無他,唯手熟爾,謙卑若愚,好學若饑-------------
本篇部落格會講如何用get()或load()查詢單個對象和對緩存的簡單操作,以及他倆的差別和相同(前面有的那些配置不做重複展示,見諒)
Hibernate中查詢單個,就是用get()或load()任意一個做操作即可!
我會講明差別和相同的地方,再加上一些驗證我說的差別和相同的執行個體:
一,查詢單個
1.使用get()查詢單個
@Test
/*get他是直接加載*/
public void t4GetDemo01(){
System.out.println("----------------------------------");
Teacher teacher = session.get(Teacher.class, 1);
System.out.println("----------------------------------");
System.out.println(teacher.getName());
}
2.使用load()查詢單個
@Test
/*load他是懶加載*/
public void t5LoadDemo01(){
System.out.println("----------------------------------");
Teacher teacher = session.load(Teacher.class, 1);
System.out.println("----------------------------------");
System.out.println(teacher.getName());
}
二,相同處:
1.get()和load()都使用緩存,他們查找記錄的策咯是,先找一級緩存,有就拿來用,沒有再去找二級,二級還沒有就找資料庫
(驗證規則:同樣的查倆次,看看發幾次sql不就好了麼!)
/*get查記錄從一級緩存開始找,一級沒找到去二級找,二級沒找到去資料庫,資料庫沒找到傳回null*/
@Test
/*測試get緩存1*/
/*從他隻發一條sql就知道他走的有緩存,因為二級緩存沒有配置,是以,是一級緩存*/
public void t6GetCacheDemo01(){
System.out.println("----------------------------------");
Teacher teacher1 = session.get(Teacher.class, 1);
Teacher teacher2 = session.get(Teacher.class, 1);
System.out.println("----------------------------------");
}
2.他倆使用基本相似,傳的同樣倆個參數,傳回值也一樣
三,差別:
1.get()是直接加載,load是懶加載(又稱延遲加載)
(驗證:)
/*get和load都是查詢,差別:*/
@Test
/*get他是直接加載*/
public void t4GetDemo01(){
System.out.println("----------------------------------");
Teacher teacher = session.get(Teacher.class, 1);
System.out.println("----------------------------------");
System.out.println(teacher.getName());
}
@Test
/*load他是懶加載*/
public void t5LoadDemo01(){
System.out.println("----------------------------------");
Teacher teacher = session.load(Teacher.class, 1);
System.out.println("----------------------------------");
System.out.println(teacher.getName());
}
/*測試在有懶加載的時候不使用它查不查資料*/
public void t12LoadLazyTrueDemo02(){
Teacher teacher = session.load(Teacher.class, 1);
System.out.println("----------------------------------");
}
2.查詢一個沒有的記錄,get()傳回的是null,load()則會引發異常ObjectNotFoundException
@Test
/*測試get擷取一個沒有的值*/
public void t9GetHaventDemo01(){
Teacher teacher = session.get(Teacher.class, 5);
System.out.println("----------------------------------");
System.out.println(teacher);
}
@Test
/*測試load擷取一個沒有的值,會抛ObjectNotFoundException*/
public void t10LoadHaventDemo01(){
Teacher teacher = session.load(Teacher.class, 5);
System.out.println("----------------------------------");
System.out.println(teacher);
}
四,操作一級緩存檢視對get()和load()的影響(清除單個緩存,和全部緩存)
@Test
/*清除單個緩存*/
public void t7GetCacheDemo02(){
System.out.println("----------------------------------");
Teacher teacher1 = session.get(Teacher.class, 1);
Teacher teacher2 = session.get(Teacher.class, 2);
System.out.println("----------------------------------");
session.evict(teacher1);
teacher1= session.get(Teacher.class, 1);
}
@Test
/*清除全部緩存*/
public void t8GetCacheDemo03(){
System.out.println("----------------------------------");
Teacher teacher1 = session.get(Teacher.class, 1);
Teacher teacher2 = session.get(Teacher.class, 2);
System.out.println("----------------------------------");
session.clear();
teacher1= session.get(Teacher.class, 1);
teacher2 = session.get(Teacher.class, 2);
}
結論:get()和load()确實使用到了緩存,如果緩存被清除,他們就得再發sql到資料庫去查
五,load()也可以直接加載
方案:
在**.hbm.xml小配置檔案中,配置延遲加載lazy=false
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.dawn.day01.entity">
<!--如果上面指定package的話,class的name就不必寫全類名-->
<!--lazy:是否懶加載(延遲加載) 預設值是true,延遲加載-->
<!--<class name="Teacher">-->
<!--直接加載-->
<class name="Teacher" lazy="false">
<!--主鍵-->
<id name="id" column="tid">
<!--主鍵生成策咯 assigned程式員自己建立-->
<!--identity是mysql裡的自增,一會做增加操作不必再給主鍵指派-->
<!--increment是先查最大的主鍵列,在下一條給主鍵加一-->
<!--sequence是oracle的主鍵生成策咯,他一會需要指定序列名字<param name="sequence">序列名</param>-->
<generator class="assigned"></generator>
</id>
<property name="name" column="name"></property>
</class>
</hibernate-mapping>
測試:
@Test
/*測試在沒有懶加載的時候不使用它查不查資料*/
public void t12LoadLazyTrueDemo02(){
Teacher teacher = session.load(Teacher.class, 1);
System.out.println("----------------------------------");
}
作者:晨曦Dawn
轉載請注明出處,部落格位址:
https://www.cnblogs.com/DawnCHENXI/p/9090682.html如果有錯誤,請指出,感激不盡!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!