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的其它方面,比如父-子关系,事务等等方面的学习还没有深入研究,希望在今后的学习中能够补上。也请大家多多指教。谢谢。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值