01- 配置文件
hibernate.cfg.xml的配置就不说了,我们先看看xml文件的读取:
XML配置文件的位置必須在CLASSPATH的設定中,例如單機執行時主程式的位置,或是Web程式的WEB-INF/classes中,我們使用下面的方式來讀入XML文件以配置Hibernate:
SessionFactory sf = new Configuration().configure().buildSessionFactory();預設的XML文件名稱是hibernate.cfg.xml,您也可以指定文件的名稱,例如:
SessionFactory sf = new Configuration().configure("db.cfg.xml").buildSessionFactory();
02 提供JDBC連接
方法1: Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/HibernateTest?user=root&password=";
java.sql.Connection conn = DriverManager.getConnection(url);
SessionFactory sessionFactory = cfg.buildSessionFactory();
Session session = sessionFactory.openSession(conn);
方法2:
是透過XML文件hibernate.cfg.xml則是如下進行配置
<hibernate-configuration>
<session-factory>
<!-- 顯示實際操作資料庫時的SQL -->
<property name="show_sql">true</property>
<!-- SQL方言,這邊設定的是MySQL -->
<property name="dialect">net.sf.hibernate.dialect.MySQLDialect</property>
<!-- JDBC驅動程式 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- JDBC URL -->
<property name="connection.url">jdbc:mysql://localhost/HibernateTest</property>
<!-- 資料庫使用者 -->
<property name="connection.username">caterpillar</property>
<!-- 資料庫密碼 -->
<property name="connection.password">123456</property>
<!-- 物件與資料庫表格映射文件 -->
<mapping resource="User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
03 - 基本资料查询
查詢資料時,我們所使用的是Session的find()方法,並在當中指定HQL設定查詢條件,查詢的結果會裝載在List物件中傳回,您所需要的是將它們一一取出,一個最簡單的例子如下:
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());
}
}
简单的条件查询:}
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);
}
如果要傳回兩個以上的字段,也不是什麼問題,直接來看個例子:
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);
}
04- 更新,删除操作
更新操作:
List users = session.find("from User");
User user = (User) session.load(User.class, id);
user.setName("caterpillar");
// 開啟一個新的Session
session = sessionFactory.openSession();
// 更新資料
session.update(updated);
users = session.find("from User");
session.close();
sessionFactory.close();
删除操作:
User user = (User) session.load(User.class, id);
session.delete(user);
users = session.find("from User");
session.close();
sessionFactory.close();
05 - Query介面
01- 除了直接使用find()方法並配合HQL來進行查詢之外,我們還可以透過 net.sf.hibernate.Query介面的實例來進行查詢,透過Query介面,您可以先設定查詢參數,之後透過setXXX()等方法,將指定的參數值填入,而不用每次都撰寫完整的HQL,直接來看個例子:
Query query = session.createQuery("select user.name from User as user where user.age = ? and user.sex = ?");
query.setInteger(0, 25);
query.setCharacter(1, 'M');
List names = query.list();
for (ListIterator iterator = names.listIterator(); iterator.hasNext(); ) {
String name = (String) iterator.next();
System.out.println("name: " + name);
}
在設定參數值時,必須依照 ? 所設定的順序,並使用對應型態的setXXX()方法
02- 您可以使用命名參數(Named Parameter)來取代這個方法,這可以不用依照特定的順序來設定參數值,並擁有較好的可讀性,直接來看個例子:
Query query = session.createQuery("select user.name from User as user where user.age = :age and user.sex = :sex");
query.setInteger("age", 25);
query.setCharacter("sex", 'M');
List names = query.list();
for (ListIterator iterator = names.listIterator(); iterator.hasNext(); ) {
String name = (String) iterator.next();
System.out.println("name: " + name);
}
06- Criteria 查詢
Hibernate支援一種符合Java撰寫習慣的查詢API,使用Session建立一個net.sf.hibernate.Criteria,您可以在不使用SQL甚至HQL的情況下進行對資料庫的查詢。
Criteria crit = session.createCriteria(User.class);
List users = crit.list();
for (ListIterator iterator = users.listIterator(); iterator.hasNext(); ) {
User user = (User) iterator.next();
System.out.println("name: " + user.getName());
System.out.println("age: " + user.getAge());
}如果我們要為查詢限定條件,則可以透過net.sf.hibernate.expression.Expression設定查詢條件,Expression擁有許多條件查詢方法,舉個實際的例子說明:Criteria crit = session.createCriteria(User.class);
crit.add(Expression.ge("age", new Integer(25))); //Expression的ge()方法即great-equal,也就是大於等於(>=),
List users = crit.list();
您也可以設定多個查詢條件,例如:
crit.add(Expression.gt("age", new Integer(20)));
crit.add(Expression.between("weight", new Integer(60),new Integer(80))); //上例中我們查詢age大於20,而weight介於60到80之間的User
List users = crit.list();
setMaxResults()方法可以限定查詢回來的筆數,如果配合setFirstResult()設定傳回查詢結果第一筆資料的位置,就可以實現簡單的分頁,例如:
Criteria crit = session.createCriteria(User.class);
crit.setFirstResult(51);
crit.setMaxResult(50);
List users = crit.list();