Hibernate用法:查詢,更新,刪除!(轉載)

Hibernate用法:查詢,更新,刪除!
 
 

一、基本數據查詢

使用Hibernate進行數據查詢是一件簡單的事,Java程序設計人員可以使用對象操作的方式來進行數據查詢,查詢時使用一種類似SQL的HQL(Hibernate Query Language)來設定查詢的條件,與SQL不同的是,HQL是具備對象導向的繼承、多型等特性的語言。
 
直接使用範例來看看如何使用Hibernate進行數據庫查詢,在這之前,請先照之前介紹過的主題在數據庫中新增幾筆數據:

在Hibernate中新增資料 
 
查詢數據時,我們所使用的是Session的find()方法,並在當中指定HQL設定查詢條件,查詢的結果會裝載在List對象中傳回,您所需要的是將它們一一取出,一個最簡單的例子如下:

HibernateTest.java

import onlyfun.caterpillar.*; import net.sf.hibernate.*; import net.sf.hibernate.cfg.*; import java.util.*;

public class HibernateTest {     public static void main(String[] args) throws HibernateException {         SessionFactory sessionFactory =            new Configuration().configure().buildSessionFactory();

        Session session = sessionFactory.openSession();         List users = session.find("from User");         session.close();         sessionFactory.close();         for (ListIterator iterator = users.listIterator(); iterator.hasNext(); ) {             User user = (User) iterator.next();             System.out.println(user.getName() +                                "\n\tAge: " + user.getAge() +                                "\n\tSex: " + user.getSex());         }     } }

find()中的“from User”即HQL,User指的是User類別,藉由映射文件,它將會查詢USER表格中的數據,相當於SQL中的SELECT * FROM USER,實際上我們的User類別是位於onlyfun.caterpillar下,Hibernate會自動看看import中的package名稱與類別名稱是否符合,您也可以直接指定package名稱,例如:

session.find("from onlyfun.caterpillar.User");

這個程序的運行結果可能是這樣的:

log4j:WARN No appenders could be found for logger (net.sf.hibernate.cfg.Environment). log4j:WARN Please initialize the log4j system properly. Hibernate: select user0_.user_id as user_id, user0_.name as name, user0_.sex as sex,

user0_.age as age from USER user0_ caterpillar    Age: 28    Sex: M momor    Age: 25    Sex: F Bush    Age: 25    Sex: M Becky    Age: 35    Sex: F

上面所介紹的查詢是最簡單的,只是從數據表中查詢所有的數據,Hibernate所查詢得回的數據,是以對象的方式傳回,以符合程序中操作的需要,我們也可以限定一些查詢條件,並只傳回我們指定的字段,例如:

List names = session.find("select user.name from User as user where age = 25"); for (ListIterator iterator = names.listIterator(); iterator.hasNext(); ) {     String name = (String) iterator.next();     System.out.println("name: " + name); }

在find()中的HQL示範了條件限定的查詢,User as user爲User類別取了別名,所以我們就可以使用user.name來指定表格傳回字段,where相當於SQL中的WHERE子句,我們限定查詢age等於25的數據,這次查詢的數據只有一個字段,而型態是String,所以傳回的List內容都是String對象,一個運行的例子如下:

log4j:WARN No appenders could be found for logger (net.sf.hibernate.cfg.Environment). log4j:WARN Please initialize the log4j system properly. Hibernate: select user0_.name as x0_0_ from USER user0_ where (age=25 ) name: momor name: Bush

如果要傳回兩個以上的字段,也不是什麼問題,直接來看個例子:

List results = session.find("select user.name, user.age from User as user where sex = 'F'"); for (ListIterator iterator = results.listIterator(); iterator.hasNext(); ) {     Object[] rows = (Object[]) iterator.next();     String name = (String) rows[0];     Integer age = (Integer) rows[1];     System.out.println("name: " + name + "\n\t" + age); }

從上面的程序中不難看出,傳回兩個以上字段時,每一次ListIterator會以Object數組的方式傳回一筆數據,我們只要指定數組索引,並轉換爲適當的型態,即可取得數據,一個查詢的結果如下:

log4j:WARN No appenders could be found for logger (net.sf.hibernate.cfg.Environment). log4j:WARN Please initialize the log4j system properly. Hibernate: select user0_.name as x0_0_, user0_.age as x1_0_ from USER user0_ where (sex='F') name: momor    25 name: Becky    35

您也可以在HQL中使用一些函數來進行結果統計,例如:

List results = session.find("select count(*), avg(user.age) from User as user"); ListIterator iterator = results.listIterator(); Object[] rows = (Object[]) iterator.next(); System.out.println("資料筆數: " + rows[0] + "\n平均年齡: " + rows[1]);

一個查詢的結果如下所示:

log4j:WARN No appenders could be found for logger (net.sf.hibernate.cfg.Environment). log4j:WARN Please initialize the log4j system properly. Hibernate: select count(*) as x0_0_, avg(user0_.age) as x1_0_ from USER user0_ 資料筆數: 4 平均年齡: 28.25

#p#

二、更新和刪除數據

如果您是在同一個Session中取出數據並想要馬上進行更新,則只要先查詢並取出對象,透過setXXX()方法設定好新的值,然後呼叫session.flush()即可在同一個Session中更新指定的數據,例如:

HibernateTest.java

import onlyfun.caterpillar.*; import net.sf.hibernate.*; import net.sf.hibernate.cfg.*; import java.util.*;

public class HibernateTest {     public static void main(String[] args) throws HibernateException {         SessionFactory sessionFactory =            new Configuration().configure().buildSessionFactory();         Session session = sessionFactory.openSession();             List users = session.find("from User");         User updated = null;          for (ListIterator iterator = users.listIterator(); iterator.hasNext(); ) {             User user = (User) iterator.next();             if(updated == null)                 updated = user;              System.out.println(user.getName() +                                         "\n\tAge: " + user.getAge() +                                         "\n\tSex: " + user.getSex());         }         updated.setName("justin");         session.flush();         users = session.find("from User");           session.close();         sessionFactory.close();         for (ListIterator iterator = users.listIterator(); iterator.hasNext(); ) {             User user = (User) iterator.next();                        System.out.println(user.getName() +                                         "\n\tAge: " + user.getAge() +                                         "\n\tSex: " + user.getSex());         }           } }

這個程序會顯示數據表中的所有數據,並將數據表中的第一筆數據更新,一個執行的結果如下:

log4j:WARN No appenders could be found for logger (net.sf.hibernate.cfg.Environment). log4j:WARN Please initialize the log4j system properly. Hibernate: select user0_.user_id as user_id, user0_.name as name, user0_.sex as sex,

user0_.age as age from USER user0_ caterpillar    Age: 28    Sex: M momor    Age: 25    Sex: F Bush    Age: 25    Sex: M Becky    Age: 35    Sex: F Hibernate: update USER set name=?, sex=?, age=? where user_id=? Hibernate: select user0_.user_id as user_id, user0_.name as name, user0_.sex as sex,

user0_.age as age from USER user0_ justin    Age: 28    Sex: M momor    Age: 25    Sex: F Bush    Age: 25    Sex: M Becky    Age: 35    Sex: F

如果您開啓了一個Session,從數據表中取出數據顯示到使用者接口上,之後關閉Session,當使用者在接口上操作完畢並按下儲存時,這時您要重新開啓一個Session,使用update()方法將對象中的數據更新至對應的數據表中,一個例子如下:

HibernateTest.java

import onlyfun.caterpillar.*; import net.sf.hibernate.*; import net.sf.hibernate.cfg.*; import java.util.*; public class HibernateTest {     public static void main(String[] args) throws HibernateException {         SessionFactory sessionFactory =           new Configuration().configure().buildSessionFactory();         Session session = sessionFactory.openSession();             List users = session.find("from User");         // 關閉這個Session         session.close();         User updated = null;         for (ListIterator iterator = users.listIterator(); iterator.hasNext(); ) {             User user = (User) iterator.next();             if(updated == null)                 updated = user;             System.out.println(user.getName() +                                        "\n\tAge: " + user.getAge() +                                        "\n\tSex: " + user.getSex());         }         // 使用者作一些操作,之後儲存         updated.setName("caterpillar");         // 開啓一個新的Session         session = sessionFactory.openSession();           // 更新數據         session.update(updated);         users = session.find("from User");              session.close();         sessionFactory.close();         for (ListIterator iterator = users.listIterator(); iterator.hasNext(); ) {             User user = (User) iterator.next();                        System.out.println(user.getName() +                                        "\n\tAge: " + user.getAge() +                                        "\n\tSex: " + user.getSex());         }           } }

這個程序執行的結果範例如下,您可以看看實際上執行了哪些SQL:

log4j:WARN No appenders could be found for logger (net.sf.hibernate.cfg.Environment). log4j:WARN Please initialize the log4j system properly. Hibernate: select user0_.user_id as user_id, user0_.name as name, user0_.sex as sex,

ser0_.age as age from USER user0_ justin    Age: 28    Sex: M momor    Age: 25    Sex: F Bush    Age: 25    Sex: M Becky    Age: 35    Sex: F Hibernate: update USER set name=?, sex=?, age=? where user_id=? Hibernate: select user0_.user_id as user_id, user0_.name as name, user0_.sex as sex,

ser0_.age as age from USER user0_ caterpillar    Age: 28    Sex: M momor    Age: 25    Sex: F Bush    Age: 25    Sex: M Becky    Age: 35    Sex: F

Hibernate提供了一個saveOrUpdate()方法,爲數據的儲存或更新提供了一個統一的操作接口,藉由定義映像文件時,設定標籤的unsaved-value來決定什麼是新的值必需,什麼是已有的值必須更新:

User.hbm.xml

       

#p#

unsaved-value

可以設定的值包括:

◆any - 總是儲存 
◆none - 總是更新 
◆null - id爲null時儲存(預設) 
◆valid - id爲null或是指定值時儲存 
 
這樣設定之後,您可以使用session.saveOrUpdate(updated);來取代上一個程序的session.update(updated);方法。
 
如果要刪除數據,只要使用delete()方法即可,直接看個例子。

HibernateTest.java

import onlyfun.caterpillar.*; import net.sf.hibernate.*; import net.sf.hibernate.cfg.*; import java.util.*; public class HibernateTest {     public static void main(String[] args) throws HibernateException {         SessionFactory sessionFactory =           new Configuration().configure().buildSessionFactory();         Session session = sessionFactory.openSession();          List users = session.find("from User");         User updated = null;         for (ListIterator iterator = users.listIterator(); iterator.hasNext(); ) {             User user = (User) iterator.next();             if(updated == null)                 updated = user;                      System.out.println(user.getName() +                                             "\n\tAge: " + user.getAge() +                                              "\n\tSex: " + user.getSex());        }         session.delete(updated);         users = session.find("from User");         session.close();         sessionFactory.close();         for (ListIterator iterator = users.listIterator(); iterator.hasNext(); ) {             User user = (User) iterator.next();                        System.out.println(user.getName() +                                        "\n\tAge: " + user.getAge() +                                        "\n\tSex: " + user.getSex());         }           } }

一個執行的結果範例如下:

log4j:WARN No appenders could be found for logger (net.sf.hibernate.cfg.Environment). log4j:WARN Please initialize the log4j system properly. Hibernate: select user0_.user_id as user_id, user0_.name as name, user0_.sex as sex,

ser0_.age as age from USER user0_ justin    Age: 28    Sex: M momor    Age: 25    Sex: F Bush    Age: 25    Sex: M Becky    Age: 35    Sex: F Hibernate: delete from USER where user_id=? Hibernate: select user0_.user_id as user_id, user0_.name as name, user0_.sex as sex,

ser0_.age as age from USER user0_ momor    Age: 25    Sex: F Bush    Age: 25    Sex: M Becky    Age: 35    Sex: F User user = (User) session.load(User.class, id);

Hibernate對於數據的更新、刪除等動作,是依賴id值來判定,如果您已知id值,則可以使用load()方法來加載資料。這邊我們先介紹的是一些簡單的查詢動作,將來有機會的話,再介紹一些進階的查詢,如果您想要先認識一些HQL,可以看看參考手冊的第11章,當中對於HQL有詳細的說明。


轉載自:http://www.51cto.com/specbook/229/34123.htm

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章