Hibernate的简单应用

来源:互联网 发布:男士润肤乳 知乎 编辑:程序博客网 时间:2024/04/27 20:27

Hibernate的简单应用

前言:
      本人非常荣幸,近一个月来,浏览我的《Hibernate的简介及使用规则》这篇文章的人气很旺,说明大家现在都非常注重Hibernate的学习,我对它也很感兴趣,不过目前没有时间在学习,正在学习其它的开源软件,但是,我希望继续学习,所以我想将我的拙作和大家共分享,包括这篇文章,这都是我过去学习过的,在这里希望大家能够提出宝贵意见和建议,来共同学习进步。

一、 概述Hibernate的开发步骤 
      关于Hibernate的开发步骤,我只是简单的总结了一下,也许比较片面,但希望大家共勉之。
      关于Hibernate的开发过程大体可总结为四步:

  • 配置Hibernate,写出有关Hibernate的配置文件和数据库操作的对应的配置文件。
  • 确定数据表,创建持久对象
  • 编写对象和数据表的映射描述
  • 编写和业务逻辑

 

二、举例说明


      下面根据以上的步骤进行举例说明,这里只是一个简单的应用。所有代码均以经过了测试完全可以运行。
      我的测试环境:Tomcat5.0+MySQL

该实例的总体结构:

  1. Java类文件结构:
    • Course.java根据数据库中的表创建相对应的持久对象
    • HibernateBase.java封装Hibernate的共性操作
    • CourseBean.java根据持久对象的需要编写业务逻辑类,它继承HibernateBase类
  2. 配置信息结构
    • hibernate.cfg.xml这是Hibernate的配置文件
    • Course.hbm.xml持久对象的配置文件,它是对象与数据表的映射文件
  3. Jsp文件结构
    • course.jsp主页面,可添加数据
    • queryCourse.jsp提供的模糊查询操作
    • viewAll.jsp显示全部数据
    • deleteCourse.jsp删除指定的记录

      下面,按照我说的开发步骤来做一个简单的Demo。

实例:

  1. 配置Hibernate(一次即可)
    一般在WEB应用中Hibernate的配置文件最好是hibernate.cfg.xml文件,因为它可以方便的增加持久对象的映射描述文件,即类名+“hbm.xml”,不必像hibernate.properties必须在初始化代码中加入。
    hibernate.cfg.xml文件,一般放到应用服务器的当前应用的WEB-INF/classess目录下。
    例: hiernate.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>
    这里配置了一个数据源,数据源的JNDI名称为jdbc/hibernate,SQL方言是MySQL。在App Server里需要配置数据源jdbc/hibernate,且需加上factory属性,值为org.apache.commons.dbcp.BasicDataSourceFactory
  2. 确定数据表,创建持久对象
    使用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.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; }}
    可以看出,在Course类中也包含了两个属性,id和name,它的属性和表Courses的字段是一一对应的,并且类型一致。
  3. 编写对象和数据表的映射描述,即o-r映射文件
    在hibernate/WEB-INF/classes目录下新建一个Course.hbm.xml描述文件 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>
    在该描述文件中声明了类Course对应于数据库中的表Courses,设置类中的各个属性分别与表中的各个字段一一对应,其中的每个字段都设有不同的属性,它们可以针对不同的需要设置不同的属性。(具体各描述符的意思请参阅Hibernate中文参考文档)
    同时,在hibernate.cfg.xml中需指定这个持久对象映射关系  ••••••
    <!-- Mapping files -->
    <mapping resource="Course.hbm.xml"/>
    ••••••
  4. 编写和业务逻辑
    我们已经封装了一个名为Courses的表,并且配置完成。接下来的任务就是在Web应用开发中使用它们,为了演示在Hibernate中对数据库的不同类型的操作,我们开发的Web应用有以下的功能:
    • 增加一个Course
    • 删除一个Course
    • 按照Course的名字进行模糊搜索
    • 查看系统中所有的Course
    由于访问通过使用hibernate有一些共性的操作,在这里我们把这些共性的操作封装在一个专门的类中,这样其它的类可以继承它 //编写共性操作的类,封装Hibernate的操作,即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,它继承了HibernateBase类
    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;    }}
    在CourseBean中,通过Hibernate来操作潜在的数据库资源
    注:在查询语句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事务。
  5. 在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的其它方面,比如父-子关系,事务等等方面的学习还没有深入研究,希望在今后的学习中能够补上。也请大家多多指教。谢谢。
原创粉丝点击