1.获取Hibernate,可到Hibernate组织的网站下载最新版本,http://www.hibernate.org。同时由于Hibernate加入了JBoss组织,所以也可从JBoss组织(http://www.jboss.org)获得技术支持。我用的是Hibernate3.0。下载到的软件包中有:Hibernate3.jar,其他引用的Jar文件在LIB子目录下,其源代码和测试用例位于src和test子目录下。
2.配置开发环境
2.1:下载Eclipse3.2.1,J2se5.0,配合Eclipse3.2.1使用JBossIDE1.4.0,可利用Eclipse的升级功能。升级站点为:
http://jboss.sourceforge.net/jbosside/updates
2.2:启动Eclipse,创建名为“Chapter02”的JAVA项目,添加src和lib目录,将Hibernate发行包中的Hibernate3.jar和lib子目录下的所有jar文件,包含Mysql数据库驱动的Jar文件一起复制到Chapter02项目的lib文件目录中。并将其导入此项目的CLASSPATH中,并添加log4j.properties属性文件类配置Hibernate的log输出。同时还使用到一个监视数据库状态的工具--JFaceDBC工具,可到http://jfacedbc.sourceforge.net下载。
3.开发实例
3.1在MYSQL中建立一个名为hibernate的数据库:
CREATE DATABASE hibernate;
USE hibernate;
3.2设计名为Computer的数据表:
create table computer(
id int(11) not null primary key auto_increment,
cpu varchar(50),
mainboard varchar(50)
);
3.3在项目的src目录下创建hibernate.cfg.xml文件,这个文件用于配置hibernate。在代码的com.joy_cz.computer包路径下创建Computer类和与名称相对应的Computer.hbm.xml映射文件
3.3.1hibernate.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>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="connection.driver_class">org.gjt.mm.mysql.Driver</property>
<property name="connection.url">jdbc:mysql://localhost/hibernate</property>
<property name="connection.username">root</property>
<property name="connection.password">123456</property>
<mapping resource="com/joy_cz/computer/computer.hbm.xml"/>
</session-factory></hibernate-configuration>
dialect:数据库方言。
connection.dirver_class:数据库驱动名
3.3.2*.hbm.xml文件
Hibernate用以hbm.xml结尾的文件描述POJO对象和数据库资源的映射关系,称为映射文件。严格遵守标准的配置文件的第一部分应该与POJO的类名一致,放置的位置也应该与对应的POJO类的包路径一致,这样做是为了方便在Hibernate程序中以资源的方式导入这些配置文件。例如:Computer.hbm.xml对应com.joy_cz.computer.Computer,而且Computer.hbm.xml文件被放置在com/joy_cz/computer路径下。其文件如下:
<?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-mapping>
<class name ="com.joy_cz.computer.Computer">
<id name="id" type="int">
<generator class="native"/>
</id>
<property name="cpu" length="50"/>
<property name="mainboard" length="50"/>
</class>
</hibernate-mapping>
对应的Computer类如下:
package com.joy_cz.computer;
public class Computer {
private int id;
private String cpu;
private String mainboard;
public String getCpu()
{
return cpu;
}
public void setCpu(String cpu){
this.cpu=cpu;
}
public String getMainboard(){
return mainboard;
}
public void setMainboard(String mainboard){
this.mainboard=mainboard;
}
public int getId(){
return id;
}
}
在Computer代码中,每个映射文件中列出的字段都必须拥有自己的getXX和setXX方法,方法的命名方式必须符合JavaBean的规范。
3.3.3配置log4j.properties文件
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.rootLogger=warn,stdout
完成了以上的配置后,就可以利用Hibernate的API进行数据持久化的编程了。
4.下面的程序实现了向Computer数据库表插入了一条新的数据记录的功能。
package com.joy_cz.computer;
import java.sql.SQLException;
import org.apache.log4j.PropertyConfigurator;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class ComputerCreate{
public static void main(String[] args) throws HibernateException{
//配置log4j.Properties
PropertyConfigurator.configure("log4j.properties");
//从hibernate.cfg.xml导入Hibernate配置数据
Configuration cfg=new Configuration();
cfg.configure();
//创建一个Hibernate的会话工厂
SessionFactory sf=cfg.buildSessionFactory();
//创建一个hibernate会话
Session sess=sf.openSession();
//新建一个Computer对象
Computer pc=new Computer();
//把新记录的数据设置到Computer对象中
pc.setCpu("Intel奔腾 4 2.4GB");
pc.setMianboard("技佳");
//利用hibernate会话保存Computer对象到数据库
sess.save(pc);
//提交当前Hibernate会话的数据
sess.flush();
try{
//提交Hibernate会话连接的状态
sess.connection().commit();}catch(HibernateException e){
e.printStackTrace();
}catch(SQLException e){e.printStackTrace();}
sess.close();}}