上篇大概的介绍了Hibernate框架,本篇一个简单的hibernate例子来学习。
(1) 创建自己的java项目。
(2) 向自己的项目中添加Hibernate的相关的jar,我们可以创建自己的UserLibrary,这样就直接加入这个依赖包就可以了(如图2.1图2.2)。
图2.1
图2.2
需要添加上的jar包包括,a、加入hibernate-3.2/lib/*.jar b、加入hibernate-3.2/hibernate2.jar c、加入数据库驱动(mysql驱动可以去官网上下载)这样添加到我们自定义的依赖包中,再在程序中引入这个包就可以了。
(3)加入hibernate配置文件,在学struts的时候我们常用的配置文件是struts-config.xml,hibernate的配置文件hibernate.cfg.xml,我们可以在hibernate-3.2\etc\hibernate.cfg.xml目录下拷贝到我们项目中的src下。
这样以上步骤就完成了几本hibernate的基本配置。
(4)接下来我们要建立我们的实体类了,以便完成对象与表的映射。建立User实体类,完成实体类的映射User.hbm.xml。代码如下所示。
User类代码:
package com.bjpowernode.hibernate; import java.util.Date; //user实体。 public class User { //用户编号。 private String id; //名字。 private String name; //密码。 private String password; //创建日期。 private Date createTime; //失效时间。 private Date expireTime; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } public Date getExpireTime() { return expireTime; } public void setExpireTime(Date expireTime) { this.expireTime = expireTime; } }
User.hbm.xml代码如下所示:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="org.hibernate.auction"> <class name="com.bjpowernode.hibernate.User" > <id name="id"> <generator class="uuid" /> </id> <property name="name"/> <property name="password"/> <property name="createTime"/> <property name="expireTime"/> </class> </hibernate-mapping>
(5) 将User.hbm.xml文件加入到hibernate.cfg.xml文件中,代码如下所示。
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory name="foo"> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/Hibernate_first</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">root</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <property name="hibernate.show_sql">true</property> <!--<property name="hibernate.format_sql">true</property> --> <mapping resource="com/bjpowernode/hibernate/User.hbm.xml"/> </session-factory> </hibernate-configuration>
(6) 编写工具类,ExportDB.java生成数据库中的表,代码如下所示。
package com.bjpowernode.hibernate; import org.hibernate.cfg.Configuration; import org.hibernate.tool.hbm2ddl.SchemaExport; /** * 将hbm生成ddl. * @author summer * */ public class ExportDB { /**将hbm生成ddl. * @param args */ public static void main(String[] args) { //使用hibernate相关类configuation. //默认读取hibernate.cfg.xml文件. Configuration cfg = new Configuration().configure(); //接受配置文件. SchemaExport export = new SchemaExport(cfg); //打印到控制台,输出到数据库. export.create(true, true); } }
(7) 建立客户端类Client,向表User中添加数据。代码如下所示。
package com.bjpowernode.hibernate; import java.util.Date; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; /** * 客户端向表中添加数据. * @author summer * */ public class client { public static void main(String[] args) { //默认读取的是hibernate.cfg.xml 文件. Configuration cfg = new Configuration().configure(); //建立SessionFactory. SessionFactory factroy = cfg.buildSessionFactory(); //取得session. Session session = null; try { //通过工厂取得session session = factroy.openSession(); //开启事务. session.beginTransaction(); //给对象赋值. User user = new User(); user.setName("张三"); user.setPassword("123"); user.setCreateTime(new Date()); user.setExpireTime(new Date()); //保存user对象到数据库. // 一个实体类对象对应一个数据库中的表. session.save(user); //先拿到前面事务的对象.再提交事务. session.getTransaction().commit(); }catch( Exception e) { e.printStackTrace(); //回滚事务. session.getTransaction().rollback(); }finally{ if(session!=null) { if(session.isOpen()) { //关闭session. //hibernate中已经将connection的的关闭封装了. //我们没有看到任何一条sql语句. session.close(); } } } } }
(8) 加入log4j配置文件,将该配置文件拷贝到我们自己项目的src下,便于调试和跟踪。
(9)建立自己的数据库,执行ExportDB.java生成数据库中的表,执行client.java完成了对象与关系数据库表的对应,如下图3.2,建立的User表。
图3.2
上述代码中,Configuration类负责管理Hibernate的配置信息,一个Configuration类的实例代表了应用程序中java类到数据库映射的集合。我们创建一个Configuration实例,并通过这个实例创建SessionFactory实例。 //默认读取的是hibernate.cfg.xml文件.
Configurationcfg = new Configuration().configure();
//建立SessionFactory.
SessionFactoryfactroy = cfg.buildSessionFactory();
在这里默认读取的是hibernate.cfg.xml文件,在新建一个Configuration的实例时,Hibernate会在类路径中查找hibernate.properties文件和hibernate.cfg.xml文件,如果两个文件同时存在,则hibernate.cfg.xml将覆盖hibernate.properties文件。如果两个文件都不存在则抛出异常。我们也可以指定配置文件的路径,不用系统默认的hibernate.cfg.xml文件:Stringfilename= “my_hibernate_cfg.xml” Configuration config = new Configuration().configure(filename);
从配置文件中可以看出,这个配置文件描述的是数据库的信息,如数据库看的URL、用户名、密码,hibernate使用方言(那种数据库),同时还可以管理数据库中各个表的映射文件,还可以配置事务策略等。
SessionFactory负责Session实例的创建,为了创建一个SessionFactory对象,必须在Hibernate初始化的时候创建一个Configuration类的实例,并将已经写好的映射文件交给它处理。这样Configuration对象就可以创建一个SessionFactory对象,当SessionFactory对象创建成功后,Configuration对象就没用过了。SessionFactory是线程安全的,可以被多个单线程调用以取得session对象,而构造SessionFactory要消耗资源,所以多数情况下一个应用中只初始化一个SessionFactory,在这里我们可以考虑使用静态方法,来解决这个问题。在上述代码的基础上我们抽取出一个工具类,用来专门实例化工厂管理session,并且采用static每次只初始化一次,代码如下所示。
package com.bjpowernode.hibernate; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateUtils { private static SessionFactory factory; //static只初始化一次. static { try{ //默认读取的是hibernate.cfg.xml 文件. Configuration cfg = new Configuration().configure(); //建立SessionFactory. factory = cfg.buildSessionFactory(); }catch(Exception e ) { e.printStackTrace(); } } public static Session getSession() { //打开session. return factory.openSession(); } //关闭session. public static void closeSession(Session session) { //判断是否为空. //判断是否是打开状态再进行关闭. if(session!=null) { if(session.isOpen()) { session.close(); } } } //返回工厂类. public static SessionFactory getSessionFactory() { return factory; } }
Session是Hibernate运作的核心,对象的声明周期、事务的管理以及数据库的存取都与它息息相关。Session是由SessionFactory创建的,SessionFactory是线程安全的,而Session不是线程安全的,所以让多个线程共享一个session,会引起冲突。
下一篇Hibernate持久化对象的三个状态。