十八、Spring整合Hibernate
Spring整合Hibernate
1.Spring提供的DAO支持
(1)DAO模式是一种标准的JavaEE设计模式,DAO模式的核心思想是,所有数据库访问都通过DAO组件完成,DAO组件封装了数据库的增、删、改等原子操作。业务逻辑组件依赖于DAO组件提供的书苦苦原子操作,完成系统业务逻辑的实现;
(2)JavaEE应用大致上可分为如下三层:
1)表现层
2)业务逻辑层
3)数据持久层
(3)轻量级JavaEE应用架构:
2.管理Hibernate的SessionFactory
(1)Spring的IoC提供用声明式的方式管理SessionFactory,还能为SessionFactory注入数据源引用;
(2)一旦在Spring的IoC容器中配置了SessionFactory Bean,它将随应用的启动而加载,并可以利用IoC容器的功能,将SessionFactory注入任何Bean中,比如DAO组件。一旦DAO组件获得了SessionFactory Bean的引用,它就可以完成实际的数据库访问;
(3)配置:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd" > <!-- 定义数据源Bean,使用C3P0数据源实现,并注入数据源的必要信息 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close" p:driverClass="com.mysql.jdbc.Driver" p:jdbcUrl="jdbc:mysql://localhost/test" p:user="root" p:password="stx12345" p:maxPoolSize="40" p:minPoolSize="2" p:initialPoolSize="20" p:maxIdleTime="30" /> <!-- 定义Hibernate的SessionFactory,SessionFactory需要依赖数据源,注入dataSource --> <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" p:dataSource-ref="dataSource" > <!-- annotatedClasses用来列出所有的持久化类 --> <!-- <property name="annotatedClasses"> --> <!-- <list> --> <!-- 以下用来列出所有的PO类 --> <!-- <value></value> --> <!-- </list> --> <!-- </property> --> <!-- 定义SessionFactory的属性 --> <property name="hibernateProperties"> <props> <!-- 指定Hibernate的数据库连接方言 --> <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop> <!-- 显示hibernate持久化操作生成的SQL --> <prop key="show_sql">true</prop> <!-- 将SQL脚本格式化后再输出 --> <prop key="hibernate.format_sql">true</prop> <!-- 根据需要自动创建数据表 --> <prop key="hibernate.hbm2ddl.auto">update</prop> </props> </property> </bean> </beans>
3.实现DAO组件的基类
(1)使用Spring管理SessionFactory后就可以将SessionFactory注入应用的DAO组件中,Spring推荐使用SessionFactory的getCurrentSession()方法获取Hibernate Session,其余的持久化操作与直接使用Hiberntate持久化操作的代码基本相同;
(2)为了简化应用中各DAO组件的设计,程序考虑将所有的DAO组件都需要提供的方法提取出来,由一个BaseDap来实现,这样应用中的其他DAO组件只要继承BaseDao即可;
(3)通常来说所有的DAO组件都应该提供如下方法:
1)根据ID加载持久化实体;
2)保存持久化实体;
3)更新持久化实体;
4)删除持久化实体,以及根据ID删除持久化实体;
5)获取所有的持久化实体;
6)其他一些查询方法;
(4)BaseDao接口代码:
import java.io.Serializable; import java.util.List; public interface BaseDao<T> { //根据ID加载实体 T get(Class<T> entityClazz,Serializable id); //保存实体 Serializable save(T entity); //更新实体 void update(T entity); //删除实体 void delete(T entity); //根据ID删除实体 void delete(T entity,Serializable id); //获取所有实体 List<T> findAll(Class<T> entityClazz); //获取实体总数 long findCount(Class<T> enetityClazz); }
(5)BaseDao实现类:BaseDaoImpl
4.传统的HibernateTemplate和HibernateDaoSupport
5.实现Dao组件
6.使用IoC容器组装各种组件
7.使用声明式事务