上篇,我們以向數據庫添加操作來演示[hibernate](http://blog.csdn.net/lovesummerforever/article/details/19171571)[持久化對象的三種狀態](http://blog.csdn.net/lovesummerforever/article/details/19171571)。本節繼續hibernate對數據庫的其他操作,刪除、查詢、修改。
Hibernate對數據刪除操作
刪除User表中個一條數據,是需要更具User表的主鍵id值來刪除的。首先根據id值向數據庫中查詢出來對應的對象。可以采用兩種方式一是session的get方法,一個是session的load方法。
Session的Get方法:調用這個方法會返回一個Object對象。然后我們對其強制轉換。Useruser = (User)session.get(User.class,” 402881e5441c035e01441c0360510003”); 當我們傳遞id值在數據中查找沒有相應的結果時,get方法會返回一個null值。
??區別:get方法加載的時候會立刻發出sql語句去查詢,而load方法在執行的時候沒有立刻的發出sql去查詢,生成一個代理User,沒有生成真正的User。當我們真正的去用這個user的時候才會加載真正的User。Load()支持延遲加載,而Get()不支持延遲加載。Get加載的對象不存在時返回的是null對象,而Load()加載對象不存在時會拋出ObjectNotFoundException異常。
??Session的Load方法:同樣是調用這個方法返回一個Object對象,再進行強制轉換。
然后我們通過get或load加載上來對應user表id的對象,再調用session的delete方法刪除該對象同時刪除表中的一條記錄,代碼如下所示。
第一種刪除方式。
~~~
?**public**void**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方法.返回存在的加載的.
??????????**public**void**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對數據查詢操作
一般查詢,代碼如下所示。
//查詢方法.
~~~
?**public**void**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);
????}
?}
~~~
分頁查詢,代碼如下所示。
//分頁查詢,從什么地方查,查幾個;
~~~
?**public**void**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對象,調用session的update()方法,代碼如下所示。
~~~
??????????//測試方法以test開頭.測試update方法.返回存在的加載的.
??????????**public**void**testUpdate1()
??????????{
??????????????Sessionsession =**null**;
??????????????
??????????????**try**
??????????????{
?????????????????session= HibernateUtils.*getSession*();
?????????????????//開啟事務.
?????????????????session.beginTransaction();
?????????????????//采用load查詢不存在的數據,hibernate會拋出object not found exception
?????????????????
?????????????????//手動構造的Detached對象.
?????????????????Useruser =**new**User();
?????????????????user.setId("402881e5441bfb0601441bfb075b0002");
?????????????????user.setName("周六");
?????????????????
?????????????????session.update(user);
?????????????????
?????????????????
?????????????????//提交事務.把內存的改變提交到數據庫上.
?????????????????session.getTransaction().commit();
?????????????????
??????????????}**catch**(Exception e){
?????????????????e.printStackTrace();
?????????????????session.getTransaction().rollback();
??????????????}**finally**{
?????????????????HibernateUtils.*closeSession*(session);
??????????????}
??????????}
~~~
加載對象,調用session的update()方法,讓對象處于持久化狀態的時候進行更新操作,代碼如下所示。
~~~
?//測試方法以test開頭.測試update方法.返回存在的加載的.
??????????**public**void**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();
??????????????}**finally**{
?????????????????HibernateUtils.*closeSession*(session);
??????????????}
??????????}
~~~
- 前言
- Struts旅程(一)Struts簡介和原理
- struts旅程(二)Struts登錄示例
- Struts旅程(三)Struts表單處理器ActionForm(靜態動態)
- Struts旅程(四)MVC向struts MVC框架演變過程
- Struts旅程(五)struts控制器DispatchAction
- Struts旅程(六)Struts頁面轉發控制ActionForward和ActionMapping
- Hibernate旅程(一)Hibernate架構概述
- Hibernate旅程(二)Hibernate實例
- Hibernate旅程(三)Hibernate持久化對象的三個狀態
- Hibernate旅程(四)Hibernate對數據庫刪除、查找、更新操作
- Hibernate旅程(五)Hibernate映射--基本類映射和對象關系映射
- Hibernate旅程(六)Hibernate映射--繼承映射
- Hibernate旅程(七)Hibernate緩存機制--一級緩存
- Hibernate旅程(八)Hibernate緩存機制--二級緩存
- Hibernate旅程(九)Hibernate緩存機制--查詢緩存
- Spring旅程(一)為什么使用Spring
- Spring旅程(二)非Spring向Spring過渡-- Spring IOC容器的使用
- Spring旅程(三) AOP--Spring AOP容器基礎
- Spring旅程(四) AOP--Spring AOP實例
- SSH旅程(五)Spring運用到Hibernate中
- SSH旅程(六)Spring和struts結合(方案一)