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