一、 概述Hibernate的开发步骤
关于Hibernate的开发步骤,我只是简单的总结了一下,也许比较片面,但希望大家共勉之。
关于Hibernate的开发过程大体可总结为四步:
- 配置Hibernate,写出有关Hibernate的配置文件和数据库操作的对应的配置文件。
- 确定数据表,创建持久对象
- 编写对象和数据表的映射描述
- 编写和业务逻辑
二、举例说明
下面根据以上的步骤进行举例说明,这里只是一个简单的应用。所有代码均以经过了测试完全可以运行。
我的测试环境:Tomcat5.0+MySQL
该实例的总体结构:
- Java类文件结构:
- Course.java根据数据库中的表创建相对应的持久对象
- HibernateBase.java封装Hibernate的共性操作
- CourseBean.java根据持久对象的需要编写业务逻辑类,它继承HibernateBase类
- 配置信息结构
- hibernate.cfg.xml这是Hibernate的配置文件
- Course.hbm.xml持久对象的配置文件,它是对象与数据表的映射文件
- Jsp文件结构
- course.jsp主页面,可添加数据
- queryCourse.jsp提供的模糊查询操作
- viewAll.jsp显示全部数据
- deleteCourse.jsp删除指定的记录
下面,按照我说的开发步骤来做一个简单的Demo。
实例:
- 配置Hibernate(一次即可)
一般在WEB应用中Hibernate的配置文件最好是hibernate.cfg.xml文件,因为它可以方便的增加持久对象的映射描述文件,即类名+"hbm.xml",不必像hibernate.properties必须在初始化代码中加入。
hibernate.cfg.xml文件,一般放到应用服务器的当前应用的WEB-INF/classess目录下。
例:
这里配置了一个数据源,数据源的JNDI名称为jdbc/hibernate,SQL方言是MySQL。在App Server里需要配置数据源jdbc/hibernate,且需加上factory属性,值为org.apache.commons.dbcp.BasicDataSourceFactoryhiernate.cfg.xml <!DOCTYPE hibernate-configuration
PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.datasource">java:comp/env/jdbc/hibernate</property>
<property name="show_sql">false</property>
<property name="dialect">net.sf.hibernate.dialect.MySQLDialect</property>
<!-- Mapping files -->
<mapping resource="Course.hbm.xml"/>
</session-factory>
</hibernate-configuration> - 确定数据表,创建持久对象
使用hibernate来封装一个简单的数据表,这个表的名字为Courses,它有两个字段,一个是ID,它是Courses表的主键;另一个是name,表示Courses的名字。
在数据库中创建Courses表:
create table Courses(CourseId varchar(32) not null, name varchar(32), constraint pk_Courses primary key (CourseId) )
为Courses表书写持久对象,类Course
可以看出,在Course类中也包含了两个属性,id和name,它的属性和表Courses的字段是一一对应的,并且类型一致。Course.java package com.hellking.study.hibernate; public class Course { private String id; private String name; public void setId(String string) { id = string; } public String getId() { return id; } public void setName(String name) { this.name = name; } public String getName() { return this.name; } }
- 编写对象和数据表的映射描述,即o-r映射文件
在hibernate/WEB-INF/classes目录下新建一个Course.hbm.xml描述文件
在该描述文件中声明了类Course对应于数据库中的表Courses,设置类中的各个属性分别与表中的各个字段一一对应,其中的每个字段都设有不同的属性,它们可以针对不同的需要设置不同的属性。(具体各描述符的意思请参阅Hibernate中文参考文档)Course.hbm.xml <?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
<class name="com.hellking.study.hibernate.Course" table="Courses" dynamic-update="false">
<id name="id" column="CourseId" type="string" unsaved-value="any">
<generator class="assigned"/>
</id>
<property name="name" type="string" update="true" insert="true" column="name"/>
</class>
</hibernate-mapping>
同时,在hibernate.cfg.xml中需指定这个持久对象映射关系••••••
<!-- Mapping files -->
<mapping resource="Course.hbm.xml"/>
•••••• - 编写和业务逻辑
我们已经封装了一个名为Courses的表,并且配置完成。接下来的任务就是在Web应用开发中使用它们,为了演示在Hibernate中对数据库的不同类型的操作,我们开发的Web应用有以下的功能:- 增加一个Course
- 删除一个Course
- 按照Course的名字进行模糊搜索
- 查看系统中所有的Course
下面编写业务逻辑类CourseBean,它继承了HibernateBase类HibernateBase.java package com.hellking.study.hibernate; import net.sf.hibernate.*; import net.sf.hibernate.cfg.*; import org.apache.log4j.*; public class HibernateBase { protected static SessionFactory sessionFactory; //会话工厂,用于创建会话 protected Session session;//hibernate会话 protected Transaction transaction;//hibernate事务 private final static Logger logger=Logger.getLogger(HibernateBase.class); public HibernateBase(){ this.initHibernate(); } //帮助方法 protected void initHibernate(){ //装载配置,构造SessionFactory对象 try{ Configuration conf=new Configuration(); sessionFactory = new Configuration().configure().buildSessionFactory(); }catch(HibernateException he){ he.printStackTrace(); logger.error(he.getMessage()); } } /** * 开始一个hibernate事务 */ protected void beginTransaction(){ try{ session = sessionFactory.openSession(); transaction = session.beginTransaction(); }catch(HibernateException he){ he.printStackTrace(); logger.error(he.getMessage()); } } /** * 结束一个hibernate事务 */ protected void endTransaction(boolean commit){ try{ if(commit) transaction.commit(); else //如果是只读的操作,不需要commit这个事务 transaction.rollback(); }catch(HibernateException he){ he.printStackTrace(); logger.error(he.getMessage()); } } }
在CourseBean中,通过Hibernate来操作潜在的数据库资源CourseBean.java package com.hellking.study.hibernate; import net.sf.hibernate.*; import org.apache.log4j.Logger; import java.util.Iterator; public class CourseBean extends HibernateBase { private final static Logger log=Logger.getLogger(CourseBean.class); public CourseBean(){ super(); } /** *增加一个Course */ public void addCourse(Course st){ try{ beginTransaction(); session.save(st); endTransaction(true); }catch(HibernateException he){ he.printStackTrace(); log.error(he.getMessage()); } } /** *查询系统中所有的Course,返回的是包含有Course持久对象的Iterator。 */ public Iterator getAllCourses(){ Iterator it=null; try{ String queryString="select courses from Course as courses"; beginTransaction(); Query query=session.createQuery(queryString); it=query.iterate(); }catch(HibernateException he){ he.printStackTrace(); log.error(he.getMessage()); } return it; } /** *删除给定ID的course */ public void deleteCourse(String id){ try{ beginTransaction(); Course course=(Course)session.load(Course.class,id); session.delete(course); endTransaction(true); }catch(HibernateException he){ he.printStackTrace(); log.error(he.getMessage()); } } /** *按course的名字进行模糊查找,返回的是包含有Course持久对象的Iterator。 */ public Iterator getSomeCourse(String name){ Iterator it=null; try{ String queryString="select c from Course as c where c.name like :name"; beginTransaction(); Query query=session.createQuery(queryString); query.setString("name","%"+name+"%"); it=query.iterate(); }catch(HibernateException he){ he.printStackTrace(); log.error(he.getMessage()); } return it; } }
注:在查询语句select c from Course as c where c.name like :name中,它虽然和普通的SQL语句相似,但是不同,在数据库中,使用的表的名字是Courses,而在这个查询语句中使用的是Course,它和持久对象的名字一致,也就是说,这个查询的概念是查询持久对象,而不是数据库的记录。创建了查询对象Query后,需要设置查询的参数,它和在JDBC中PreparedStatement对象中设置参数的方法相似。通过"Iterator it= query.iterate()"语句来执行查询,并且返回一个Iterator对象。在这里使用了Hibernate提供的查询机制,一般的JDBC查询返回的是ResultSet对象,而这里返回的是包含了CourseBean对象的Iterator。
在删除操作的方法中,首先开始一个事务,然后通过session.load(Course.class,id)方法来装载指定ID的持久对象,接下来通过"session.delete(course)"来删除已经装载的course,并且结束Hibernate事务。 - 在JSP中调用业务逻辑
编写WEB页面,通过Hibernate的O—R映射,对持久对象进行操作。由于这些操作都是调用CourseBean类中的方法,所以,这里不在给出各个页面的代码,只是简单的说明一下- 添加数据,通过course.jsp页面完成。调用的是CourseBean类的addCourse(Course st)方法
- 模糊查询,通过queryCourse.jsp页面完成。调用的是CourseBean类的getSomeCourse(String name)方法
- 查询所有数据,通过viewAll.jsp页面完成。调用的是CourseBean类的getAllCourses()方法
- 删除指定的数据,通过deleteCourse.jsp页面完成。调用的是CourseBean类的deleteCourse(String id)方法。
总结,以上只是我在初学了Hibernate后,根据IBM developerWorks中的一篇介绍Hibernate的文章来实践学习的结果,可查看原文。这也算是基础入门吧,就算为大家抛砖引玉吧,呵呵!对于Hibernate的其它方面,比如父-子关系,事务等等方面的学习还没有深入研究,希望在今后的学习中能够补上。也请大家多多指教。谢谢。