一、基本數據查詢
使用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
|