Hibernate在SSH项目中的应用

这篇博客详细介绍了在SSH项目中如何集成并使用Hibernate,包括配置数据库信息、创建实体类和映射文件、使用SessionFactory和Session。还对比了直接使用JDBC与Hibernate的区别,并展示了Spring与Hibernate集成后简化DAO类的方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

         Hibernate的应用(包括关联关系的映射和HQL等)可以参考其在线文档:http://docs.jboss.org/hibernate/core/3.6/reference/zh-CN/html/

Hibernate打破了以往先建立好表在创建实体类的传统方式,hibernate可以如此操作,但也可以选择直接从实体类开始,它能够使面向对像分析、面向对象设计、面向对象编程更加一体化,我们不必关系对象层到关系层的转化问题。

使用hibernate就要先引入其核心jar包和第三方jar包,以及借以与数据库交互的JDBCjar包。

 

        而后在hibernate.cfg.xml中配置数据库信息可以参照hibernate.properties文件,样例如下所示:

      

   <!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/ssh_hibernate_test</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">618</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="hibernate.show_sql">true</property>
        <!-- <propertyname="hibernate.format_sql">true</property> -->
        <property name="hibernate.hbm2ddl.auto">update</property>
        <mapping resource="com/myHibernate/Person.hbm.xml"></mapping>
    </session-factory>
</hibernate-configuration>

第三步就是要建立实体类及其映射文件,如:Person实体类,其映射文件一般命名为Person.hbm.xml(建议将映射文件和实体类对象放到一起),而后将实体映射文件Person.hbm.xml加入到Hibernate的核心文件hibernate.cfg.xml中。映射文件如下所示:

<hibernate-mapping >
    <class name="com.myHibernate.Person" table="t_person">
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="name" />
    </class>
</hibernate-mapping>


第四步在数据库服务器中创建在hibernate.cfg.xml文件中指定的数据库名称的数据库

第五步创建读取hibernate.cfg.xml的信息导出到数据库的类。代码如下所示:

package com.bjpowernode.hibernate;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
public class ExportDB {
 
    public static void main(String[] args) {
 
        //默认读取hibernate.cfg.xml文件
        Configurationcfg=new Configuration().configure();
        SchemaExport export=new SchemaExport(cfg);
        export.create(true, true);
    }
}


      最后将log4j.properties文件放到项目src目录下有了这个配置文件hibernate就可以进行日志记录了。

      有了上述配置我们就可以在SSH项目中应用hibernate了。下面简单对比下直接使用JDBC与使用hibernate以及将Spring与hibernate集成后的使用效果。

     直接使用jdbc需要注册下jdbc驱动——》取得connection——》建立sql语句——》参数赋值——》执行,样例代码如下所示:

importjava.sql.Connection;
importjava.sql.DriverManager;
importjava.sql.PreparedStatement;
importjava.sql.SQLException;
 
public classPersonDao4MySqlImpl implements PersonDao {
 
    public void addPerson(Stringname) {
       
        //注册jdbc驱动
        try{
            Class.forName("com.mysql.jdbc.Driver");
        }catch(ClassNotFoundExceptione){
            System.out.println("未能找到驱动程序!");
        }
        //获取connection
        String url="jdbc:mysql://localhost:3306/ssh_hibernate_test";
        Stringusername="root";
        Stringpassword="618";
        Connectionconn=null;
        PreparedStatementpstmt=null;
        try {
            conn=DriverManager.getConnection(url,username, password);
       
            StringsqlInser="insert into t_person(name)values(?)";
           
            //connect to database
            if(!conn.isClosed()){
                pstmt=conn.prepareStatement(sqlInser);
                pstmt.setString(1,name);
                pstmt.execute();
               
                pstmt.close();
                conn.close();
               
                System.out.println("插入成功!");
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            System.out.println("获取connection错误!");
        }finally{
           
        }
    }


Hibernate本身是对JDBC的轻量级封装,使用hibernate查询数据的代码如下所示:

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import com.myHibernate.Person;
 
public class PersonDao4MySqlImplWithHibernate implements PersonDao {
 
    public String getName(int id) {
        //要返回的数据
        String name="";
       
        //读取hibernate.cfg.xml文件
        Configuration cfg=new Configuration().configure();
        //建立sessionFactory
        SessionFactory sessionFactory=cfg.buildSessionFactory();
        //get session
        Session session=null;
        try{
            session=sessionFactory.openSession();
            session.beginTransaction();
           
            Query query=session.createQuery("from Person");
            List personList=query.list();
        for(java.util.Iteratoriter=personList.iterator();iter.hasNext();){
                Person person=(Person)iter.next();
                if(person.getId()==id){
                    name=person.getName();
                }
            }
        }catch(HibernateException e){
            e.printStackTrace();
            session.getTransaction().rollback();
        }catch(Exception e){
            e.printStackTrace();
            session.getTransaction().rollback();
        }finally{
            if(session!=null){
                if(session.isOpen()){
                    session.close();
                }
            }
        }
        return name;
    }
}


其关键类包括Configuration、SessionFactory、session等,它们的作用在上述代码中已有所展示,但我们的dao是要创建的SessionFactory类,随着与数据库的交换,会频繁的创建SessionFactory类。而利用spring为提供的方法,则不需要频繁的创建SessionFactory了。并且spring也帮我们省去了对事务提交与回滚等的处理。应用了spring后的代码如下所示:

 
import java.util.List;
 
import org.hibernate.HibernateException;
importorg.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
importorg.springframework.orm.hibernate3.support.HibernateDaoSupport;
importcom.myHibernate.Person;
 
public classPersonDao4MySqlImplWithHibernate extends HibernateDaoSupport implements PersonDao {
 
  public String getName(int id) {
      //要返回的数据
      String name="";
         
          Queryquery=this.getSession().createQuery("fromPerson");
          ListpersonList=query.list();
          for(java.util.Iteratoriter=personList.iterator();iter.hasNext();){
              Personperson=(Person)iter.next();
              if(person.getId()==id){
                  name=person.getName();
              }
          }
      return name;
  }
}


       Hibernate中无论是执行hql语句,还是提交或回滚事务离不开的是Session类,而创建它的是SessionFactory类,它依赖着Hibernate.cfg.xml文件(由Configuration类来解析)。

        集成了spring后仍旧能做Session可以做的事情,原因是“SessionFactory”(“Sessionfactory”指定是spring实现的类org.springframework.orm.hibernate3.LocalSessionFactoryBean)被依赖注入到了PersonDao4MySqlImplWithHibernate 类中。其原因是PersonDao4MySqlImplWithHibernate类继承了HibernateDaoSupport类,这个类可以依赖注入“sessionFactory”。具体做法描述如下:

        在applicationContext.xml文件配置org.springframework.orm.hibernate3.LocalSessionFactoryBean,并指定其属性configLocation,为classpath:hibernate.cfg.xml,这样就可以获得SessionFactory等hibernate核心类了。

        我们还需需要在spring的配置文件applicationContext.xml中配置PersonDao4MySqlImplWithHibernate类,并指定其属性sessionFactory值为上上面配置的spring实现的“sessionFactory”.

        此过程图解如下所示:

 

Hibernate.cfg.xml文件的代码如下所示:

    

<!-- 配置SessionFactory -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="configLocation">
            <value>classpath:hibernate.cfg.xml</value>
        </property>
    </bean>
    <!-- 配置事物管理 -->
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory">
            <ref bean="sessionFactory"></ref>
        </property>
    </bean>
    <!-- 配置哪些类,哪些方法使用事物 -->
    <aop:config>
        <aop:pointcut id="allManagerMethod"  expression="execution(*com.mySpring.manager.*.*(..))"/>
        <aop:advisor pointcut-ref="allManagerMethod" advice-ref="txAdvice"/>
    </aop:config>
    <!-- 事务的传播特性 -->  
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="add*"propagation="REQUIRED"/>
            <tx:method name="del*"propagation="REQUIRED"/>
            <tx:method name="modify*"propagation="REQUIRED"/>
            <tx:method name="*"propagation="REQUIRED" read-only="true"/>
        </tx:attributes>
    </tx:advice>
   
     
    <bean id="PersonDao4MySqlImplWithHibernate" class="com.mySpring.dao.PersonDao4MySqlImplWithHibernate">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>
    <bean id="PersonManager" class="com.mySpring.manager.PersonManagerImpl">
        <constructor-arg ref="PersonDao4MySqlImplWithHibernate"></constructor-arg>
    </bean>

本文简单介绍了hibernate在ssh中使用时的搭建步骤,简单描述了在项目中直接使用jdbc访问数据库和使用hibernate访问数据库的用法以及将spring与hibernate集成来消除在项目中dao类对hibernate类的依赖实现原理及步骤。


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值