Hibernate是ORM的解決方案,其底層對數據庫的操作依賴於JDBC,所以您必須先取得JDBC驅動程序,在這邊所使用的是MySQL,所以您必須至 MySQL®
Connector/J 取得MySQL的JDBC驅動程序。
解開zip檔案後,當中的hibernate3.jar是必要的,而在lib目錄中還包括了許多jar檔案,您可以在 Hibernate 3官方參考手冊上找到這些jar的相關說明,其中必要的是antlr、dom4j、CGLIB、asm、Commons Collections、Commons Logging、 EHCache(預設快取),Hibernate底層還需要JavaTransaction API,所以您還需要jta.jar,如果您需要連接池,可以使用C3P0連接池,到這邊爲止,總共需要以下的jar檔案:
- mysql-connector-java-5.0.5.jar
- hibernate3.jar
- antlr.jar
- asm.jar
- c3p0.jar
- cglib.jar
- commons-logging.jar
- commons-collections.jar
- dom4j.jar
- log4j.jar
- ehcache.jar
- jta.jar
Hibernate可以運行於單機之上,也可以運行於Web應用程序之中,如果是運行於單機,則將所有用到的jar檔案(包括JDBC驅動程序)設定至CLASSPATH中,如果是運行於Web應用程序中,則將jar檔案置放於WEB-INF/lib中。
如果您還需要額外的Library,再依需求加入,例如JUnit、Proxool等等,接下來可以將etc目錄下的log4j.properties復 制至Hibernate項目的Classpath下,並修改一下當中的log4j.logger.org.hibernate爲error,也就是隻在在 錯誤發生時顯示必要的訊息。
接着設置基本的Hibernate配置文件,可以使用XML或Properties檔案,這邊先使用XML,檔名預設爲hibernate.cfg.xml,直接置放於Classpath路徑之中:
- hibernate.cfg.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 顯示實際操作數據庫時的SQL -->
<property name="show_sql">true</property>
<!-- 將顯示的SQL排版,方便觀看 -->
<property name="format_sql">true</property>
<!-- SQL方言,這邊設定的是MySQL -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- JDBC驅動程序 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- JDBC URL -->
<property name="connection.url">jdbc:mysql://localhost/demo</property>
<!-- 數據庫用戶 -->
<property name="connection.username">caterpillar</property>
<!-- 數據庫密碼 -->
<property name="connection.password">123456</property>
<!-- 以下設置對象與數據庫表格映像文件 -->
<mappingresource="onlyfun/caterpillar/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>- User.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="onlyfun.caterpillar.User" table="T_USER">
<id name="id" column="id">
<generator class="native"/>
</id>
<property name="name" column="name"/>
<property name="age" column="age"/>
</class>
</hibernate-mapping>
- User.java
public class User {
private Long id;
private String name;
private Long age;
// 以使得Hibernate可以使用Constructor.newInstance()建立物件
public User() {
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Long getAge() {
return age;
}
public void setAge(Long age) {
this.age = age;
}
}
- HibernateUtil.java
package onlyfun.caterpillar;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {
private static SessionFactory sessionFactory;
static {
try {
sessionFactory = new Configuration().configure()
.buildSessionFactory();
} catch (Throwable ex) {
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
public static void shutdown() {
getSessionFactory().close();
}
}
- HibernateDemo.java(插入)
import org.hibernate.Session;
import org.hibernate.Transaction;
public class HibernateDemo {
public static void main(String[] args) {
User user = new User();
user.setName("Angelo");
user.setAge(new Long(30));
// 開啓Session,相當於開啓JDBC的Connection
Session session = HibernateUtil.getSessionFactory().openSession();
// Transaction表示一組會話操作
Transaction tx= session.beginTransaction();
// 將物件映射至數據庫表格中儲存
session.save(user);
tx.commit();
session.close();
System.out.println("OK!用MySQL查看結果!");
HibernateUtil.shutdown();
}
}
- HibernateDemo.java(查詢)
import java.util.Iterator;
import org.hibernate.Query;
import org.hibernate.Session;
public class HibernateDemo {
public static void main(String[] args) {
Session session = HibernateUtil.getSessionFactory().openSession();
// 使用HQL建立查詢
Query query = session.createQuery("from User");
Iterator users = query.list().iterator();
System.out.println("id \t name/age");
while(users.hasNext()) {
User user = (User) users.next();
System.out.println(user.getId() +
" \t " + user.getName() +
"/" + user.getAge());
}
System.out.println();
// 使用HQL建立查詢
query = session.createQuery("from User user where user.name like ?");
// 設定查詢參數
query.setParameter(0, "Angelo");
users = query.list().iterator();
System.out.println("id \t name/age");
while(users.hasNext()) {
User user = (User) users.next();
System.out.println(user.getId() +
" \t " + user.getName() +
"/" + user.getAge());
}
session.close();
HibernateUtil.shutdown();
}
}
Query的 setParameter()方法第一個參數是指定 ? 出現的位置,從0 開始,第二個參數則是設定查詢條件。