
本站地址:http://www.bajiao123.com

使用Hibernate的一个完整例子
在Course.hbm.xml映射文件中,指定了要映射的类和映射的表,并且指定了表的各个字段和Java对象中各个字段的映射关系,比如Course对象中的id属性对应了Courses表的courseId字段。
接下来的任务就是在hibernate.cfg.xml中指定这个映射关系。如下所示:
…
编写业务逻辑
到此,我们已经封装了一个名为Courses的表,并且配置完成。接下来的任务就是在Web应用开发中使用它们,为了演示在Hibernate中对数据库的不同类型的操作,我们开发的Web应用有以下的功能:
虽然我们可以直接在JSP中使用hibernate,但是往往我们不这样,而是把这些业务逻辑封装在JavaBean中,然后在JSP中通过调用JavaBean以访问Hibernate封装的对象。
由于访问通过使用hibernate有一些共性的操作,在这里我们把这些共性的操作封装在一个专门的类中,这样其它的类可以继承它,如例程5所示。
例程5 HibernateBase.java
package com.hellking.study.hibernate;
import net.sf.hibernate.*;
import net.sf.hibernate.cfg.*;
import java.util.*;
import java.io.IOException;
import java.io.PrintWriter;
public abstract class HibernateBase
{
protected SessionFactory sessionFactory;//会话工厂,用于创建会话
protected Session session;//hibernate会话
protected Transaction transaction; //hiberante事务
public HibernateBase()throws HibernateException
{
this.initHibernate();
}
// 帮助方法
protected void initHibernate()
throws HibernateException {
// 装载配置,构造SessionFactory对象
sessionFactory = new Configuration().configure().buildSessionFactory();
}
/**
*开始一个hibernate事务
*/
protected void beginTransaction()
throws HibernateException {
session = sessionFactory.openSession();
transaction = session.beginTransaction();
}
/**
*结束一个hibernate事务。
*/
protected void endTransaction(boolean commit)
throws HibernateException {
if (commit) {
transaction.commit();
} else {
//如果是只读的操作,不需要commit这个事务。
transaction.rollback();
}
session.close();
}
}
下面编写业务逻辑类,新建一个名为CourseBean的JavaBean,并且CourseBean继承HibernateBase类,代码如例程6所示。
例程6 CourseBean.java
package com.hellking.study.hibernate;
import net.sf.hibernate.*;
import net.sf.hibernate.cfg.*;
import java.util.*;
/**
*和course相关的业务逻辑
*/
public class CourseBean extends HibernateBase
{
public CourseBean()throws HibernateException
{
super();
}
/**
*增加一个Course
*/
public void addCourse(Course st)throws HibernateException
{
beginTransaction();
session.save(st);
endTransaction(true);
}
/**
*查询系统中所有的Course,返回的是包含有Course持久对象的Iterator。
*/
public Iterator getAllCourses()throws HibernateException
{
String queryString = "select courses from Course as courses";
beginTransaction();
Query query = session.createQuery(queryString);
Iterator it= query.iterate();
return it;
}
/**
*删除给定ID的course
*/
public void deleteCourse(String id)throws HibernateException
{
beginTransaction();
Course course=(Course)session.load(Course.class,id);
session.delete(course);
endTransaction(true);
}
/**
*按course的名字进行模糊查找,返回的是包含有Course持久对象的Iterator。
*/
public Iterator getSomeCourse(String name)throws HibernateException
{
String queryString = "select c from Course as c where c.name like :name" ;
beginTransaction();
Query query = session.createQuery(queryString);
query.setString("name", "%"+name+"%");
Iterator it= query.iterate();
return it;
}
}
在CourseBean封装了4个业务方法,你可以根据情况增加其它的业务方法。在CourseBean中,通过Hibernate来操作潜在的数据库资源。
要保存Course数据到数据库,可以通过:
session.save(Course);
方法来保存,它相当于使用在JDBC中执行以下语句:
Connection con=…
Statement stmt=con.createStatement();
stmt.executeUpdate("insert into courses values('"+course.getId(),+"','"+course.getName()+"')");
con.close();
可以看出,通过使用Hibernate,可以大大减少数据访问的复杂度。
在JSP中调用业务逻辑
添加数据
CourseBean这个业务对象封装了和Hibernate的交互关系,从而使JSP和Hibernate关系的解藕。我们来看测试主页面的部分代码,如例程7所示。
例程7 测试Hibernate开发的应用(course.jsp)
<%@ page import="java.sql.*,java.util.*" errorPage="error.jsp"%>
<%
try
{
if(course.getId().equals(null)||course.getId().equals(""));
else courseBusiness.addCourse(course);
%>
成功添加了Course:
name:<%=course.getName()%>
Id:<%=course.getId()%>
<%
}
catch(Exception e)
{
}
%>
::增加一个course::
::按名字模糊查找::
::删除一个Course::
本站地址:http://www.bajiao123.com

