大多數入門教程混雜Tomcat、Eclipse、Log4j、Struts、XDoclet甚至JBoss,導致初學者誤以為Hibernate依賴重型容器。事實上,Hibernate是獨立框架,無需任何Web/App Server支援。本教程剝離所有干擾因素,僅保留JDK、Hibernate、Ant、JDBC驅動,建立最低門檻的Hello World。
ANT_HOME=c:\dev\apache-ant-1.6.1
PATH=%ANT_HOME%\bin;%PATH%
JAVA_HOME=c:\j2sdk1.4.x
PATH=%JAVA_HOME%\bin;%PATH%
c:\workspace\My1stHibernate\
├── src\ # 源碼與映射文件
├── classes\ # 編譯輸出
└── lib\
├── hibernate\ # hibernate2.jar + lib/* 所有依賴
└── db\ # JDBC驅動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.javapublic class Customer {
private int id;
private String username;
private String password;
// 標準getter/setter...
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }
public String getPassword() { return password; }
public void setPassword(String password) { this.password = password; }
}
Test.javaimport 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();
}
}
}
Customer.hbm.xml<?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>
build.xml<?xml version="1.0"?>
<project name="My1stHibernate" default="build" basedir=".">
<property name="src.dir" value="src"/>
<property name="lib.dir" value="lib"/>
<property name="build.dir" value="classes"/>
<path id="myclasspath">
<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" description="compile source">
<javac classpathref="myclasspath" 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="myclasspath" classname="Test" fork="true"/>
</target>
<target name="clean">
<delete includeEmptyDirs="true"><fileset dir="${build.dir}"/></delete>
</target>
</project>
hibernate.cfg.xml(Oracle 9i範例)<?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_username</property>
<property name="connection.password">your_password</property>
<property name="dialect">net.sf.hibernate.dialect.Oracle9Dialect</property>
<mapping resource="Customer.hbm.xml"/>
</session-factory>
</hibernate-configuration>
其他資料庫請參考Hibernate安裝目錄下src/hibernate.properties中的方言與驅動配置。
c:\workspace\My1stHibernate> ant run
預期輸出:
run:
[java] Hibernate: insert into CUSTOMER (USERNAME, PASSWORD, CID) values (?, ?, ?)
... (200條記錄)
BUILD SUCCESSFUL
資料庫中CUSTOMER表將新增200條記錄,全程零JDBC手寫代碼。遷移資料庫僅需修改hibernate.cfg.xml中的四個屬性值。