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类的依赖实现原理及步骤。