1. 程式人生 > >Hibernate旅程(四)Hibernate對資料庫刪除、查詢、更新操作

Hibernate旅程(四)Hibernate對資料庫刪除、查詢、更新操作

上篇,我們以向資料庫新增操作來演示hibernate對資料庫的其他操作,刪除、查詢、修改。

Hibernate對資料刪除操作

刪除User表中個一條資料,是需要更具User表的主鍵id值來刪除的。首先根據id值向資料庫中查詢出來對應的物件。可以採用兩種方式一是sessionget方法,一個是sessionload方法。

SessionGet方法:呼叫這個方法會返回一個Object物件。然後我們對其強制轉換。Useruser = (User)session.get(User.class,” 402881e5441c035e01441c0360510003”); 當我們傳遞id值在資料中查詢沒有相應的結果時,

get方法會返回一個null值。

區別:get方法載入的時候會立刻發出sql語句去查詢,而load方法在執行的時候沒有立刻的發出sql去查詢,生成一個代理User,沒有生成真正的User。當我們真正的去用這個user的時候才會載入真正的UserLoad()支援延遲載入,而Get()不支援延遲載入。Get載入的物件不存在時返回的是null物件,而Load()載入物件不存在時會丟擲ObjectNotFoundException異常。

SessionLoad方法:同樣是呼叫這個方法返回一個Object物件,再進行強制轉換。

然後我們通過getload載入上來對應userid的物件,再呼叫session

delete方法刪除該物件同時刪除表中的一條記錄,程式碼如下所示。

第一種刪除方式。

publicvoid testDel1()

{

Sessionsession =null;

try

{

session= HibernateUtils.getSession();

//開啟事務.

session.beginTransaction();

//採用load查詢不存在的資料,hibernate會丟擲object not found exception

Useruser = (User)session.load(User.class,"402881e5441c035e01441c0360510003");

//刪除表中的記錄

.

//刪除,建議用此種方式刪除,先載入再刪除.

session.delete(user);

//提交事務.把記憶體的改變提交到資料庫上.

session.getTransaction().commit();

}catch(Exception e){

e.printStackTrace();

session.getTransaction().rollback();

}finally{

HibernateUtils.closeSession(session);

}

}

第二種刪除方式,手動構造detached物件再刪除。程式碼如下所示。

//測試方法以test開頭.測試del方法.返回存在的載入的.

publicvoid testDel2()

{

Sessionsession =null;

try

{

session= HibernateUtils.getSession();

//開啟事務.

session.beginTransaction();

//手動構造的Detached物件.

Useruser =new User();

user.setId("402881e4441b3d1c01441b3f5dfe0001");

session.delete(user);

//提交事務.把記憶體的改變提交到資料庫上.

session.getTransaction().commit();

}catch(Exception e){

e.printStackTrace();

session.getTransaction().rollback();

}finally{

HibernateUtils.closeSession(session);

}

}

Hibernate對資料查詢操作

一般查詢,程式碼如下所示。

//查詢方法.

publicvoid testQuery1()

{

Sessionsession =null;

try

{

session= HibernateUtils.getSession();

session.beginTransaction();

//引數是一個字串,HQL的查詢語句.注意此時的的UserU為大寫,為物件的,而不是表的.

Queryquery = session.createQuery("from User");

//使用List方法.

ListuserList = query.list();

//迭代器去迭代.

for(Iteratoriter=userList.iterator();iter.hasNext();)

{

Useruser =(User)iter.next();

System.out.println("id="+user.getId() + "name="+user.getName());

}

session.getTransaction().commit();

}catch(Exception e){

e.printStackTrace();

session.getTransaction().rollback();

}finally{

HibernateUtils.closeSession(session);

}

}

分頁查詢,程式碼如下所示。

//分頁查詢,從什麼地方查,查幾個;

publicvoid testQuery2()

{

Sessionsession =null;

try

{

session=HibernateUtils.getSession();

session.beginTransaction();

//引數是一個字串,HQL的查詢語句.注意此時的的UserU為大寫,為物件的,而不是表的.

Queryquery = session.createQuery("from User");

//從第一個開始查起.可以設定從第幾個查起.

query.setFirstResult(0);

//最大條數為兩個

query.setMaxResults(2);

//使用List方法.

ListuserList = query.list();

//迭代器去迭代.

for(Iteratoriter=userList.iterator();iter.hasNext();)

{

Useruser =(User)iter.next();

System.out.println("id="+user.getId() + "name="+user.getName());

}

session.getTransaction().commit();

}catch(Exception e){

e.printStackTrace();

session.getTransaction().rollback();

}finally{

HibernateUtils.closeSession(session);

}

}

Hibernate對資料更新操作

手動構造detached物件,呼叫sessionupdate()方法,程式碼如下所示。

//測試方法以test開頭.測試update方法.返回存在的載入的.

publicvoid testUpdate1()

{

Sessionsession =null;

try

{

session= HibernateUtils.getSession();

//開啟事務.

session.beginTransaction();

//採用load查詢不存在的資料,hibernate會丟擲object not found exception

//手動構造的Detached物件.

Useruser =newUser();

user.setId("402881e5441bfb0601441bfb075b0002");

user.setName("週六");

session.update(user);

//提交事務.把記憶體的改變提交到資料庫上.

session.getTransaction().commit();

}catch(Exception e){

e.printStackTrace();

session.getTransaction().rollback();

}finally{

HibernateUtils.closeSession(session);

}

}

載入物件,呼叫sessionupdate()方法,讓物件處於持久化狀態的時候進行更新操作,程式碼如下所示。

//測試方法以test開頭.測試update方法.返回存在的載入的.

publicvoid testUpdate2()

{

Sessionsession =null;

try

{

session= HibernateUtils.getSession();

//開啟事務.

session.beginTransaction();

//採用load查詢不存在的資料,hibernate會丟擲object not found exception

//先把要更新的查出來.

//建議採用此種方式,先載入再更新的方式.

Useruser = (User)session.load(User.class,"402881e5441bfb0601441bfb075b0002");

//查出來的話就直接放入了.處於持久化狀態.

user.setName("週日");

//顯示的呼叫,因為為持久化狀態也可以不顯示呼叫.

session.update(user);

//提交事務.把記憶體的改變提交到資料庫上.

session.getTransaction().commit();

}catch(Exceptione){

e.printStackTrace();

session.getTransaction().rollback();

}