許多入門教學混雜了 Tomcat、Eclipse、Struts、JBoss 等雜項,嚇退初學者。本文回歸本質:Hibernate 是獨立框架,只需 JDK、JDBC Driver、Ant (建構工具) 即可運行。以下提供最精簡的「Hello World」級實作步驟。
JAVA_HOME。c:\dev\hibernate-x.x。c:\dev\ant-x.x,設定 ANT_HOME 並加入 PATH。c:\workspace\My1stHibernate\
├── src\ (原始碼、映射檔、設定檔)
├── classes\ (編譯輸出、資源檔複製處)
└── lib\
├── hibernate\ (hibernate2.jar + lib/*.jar)
└── db\ (JDBC Driver jar)
CREATE DATABASE hibernate_test;
USE hibernate_test;
CREATE TABLE CUSTOMER (
CID INTEGER NOT NULL PRIMARY KEY,
USERNAME VARCHAR(12) NOT NULL,
PASSWORD VARCHAR(12)
);
Customer.java (POJO,置於 src)
public class Customer {
private int id;
private String username;
private String password;
// getter / setter 略
}
Customer.hbm.xml (置於 src,與 Customer.java 同目錄)
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"https://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
<class name="Customer" table="CUSTOMER">
<id name="id" column="CID">
<generator class="increment"/>
</id>
<property name="username" column="USERNAME"/>
<property name="password" column="PASSWORD"/>
</class>
</hibernate-mapping>
hibernate.cfg.xml (置於 src)
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"https://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd">
<hibernate-configuration>
<session-factory name="java:/hibernate/HibernateFactory">
<property name="show_sql">true</property>
<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="connection.url">jdbc:oracle:oci8:@hibernate_test</property>
<property name="connection.username">your_user</property>
<property name="connection.password">your_pass</property>
<property name="dialect">net.sf.hibernate.dialect.Oracle9Dialect</property>
<mapping resource="Customer.hbm.xml"/>
</session-factory>
</hibernate-configuration>
其他資料庫請參考 Hibernate 套件內
src/hibernate.properties範例替換 driver、url、dialect。
build.xml (專案根目錄)
<project name="My1stHibernate" default="build" basedir=".">
<property name="src.dir" value="src"/>
<property name="build.dir" value="classes"/>
<property name="lib.dir" value="lib"/>
<path id="cp">
<fileset dir="${lib.dir}"><include name="**/*.jar"/></fileset>
<pathelement location="${build.dir}"/>
</path>
<target name="init"><mkdir dir="${build.dir}"/></target>
<target name="build" depends="init">
<javac classpathref="cp" srcdir="${src.dir}" destdir="${build.dir}"/>
<copy todir="${build.dir}">
<fileset dir="${src.dir}"><exclude name="**/*.java"/></fileset>
</copy>
</target>
<target name="run" depends="build">
<java classpathref="cp" classname="Test" fork="true"/>
</target>
<target name="clean">
<delete includeEmptyDirs="true"><fileset dir="${build.dir}"/></delete>
</target>
</project>
Test.java (置於 src)
import net.sf.hibernate.*;
import net.sf.hibernate.cfg.*;
public class Test {
public static void main(String[] args) {
try {
SessionFactory sf = new Configuration().configure().buildSessionFactory();
Session session = sf.openSession();
Transaction tx = session.beginTransaction();
for (int i = 0; i < 200; i++) {
Customer c = new Customer();
c.setUsername("customer" + i);
c.setPassword("customer");
session.save(c);
}
tx.commit();
session.close();
} catch (HibernateException e) { e.printStackTrace(); }
}
}
命令列進入專案目錄,執行 ant run。若見到 Hibernate: insert into CUSTOMER ... 及 BUILD SUCCESSFUL,即代表成功寫入 200 筆資料,全程未寫一行 JDBC 代碼。
未來更換資料庫,僅需修改 hibernate.cfg.xml 中的連線參數與方言,代碼零修改。