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.使用声明式事务