10.3 DAO层实现 10.3.1 DAO的基础配置

10.3 DAO层实现

本系统的后台完全采用轻量级Java EE应用的架构,系统持久层访问使用DAO组件完成。DAO组件抽象出底层的数据访问,业务逻辑组件无须理会数据库访问的细节,只需专注于业务逻辑的实现即可。DAO 将数据访问集中在独立的一层,所有的数据访问都由DAO对象完成,从而使系统具有更好的可维护性。
DAO 组件还有助于提升系统的可移植性。独立的DAO层使得系统能在不同的数据库之间轻易切换,底层的数据库实现对于业务逻辑组件完全透明,移植数据库仅仅影响DAO层,切换不同的数据库不会影响业务逻辑组件,因此提高了系统的可移植性。
前面介绍的BaseDao接口、BaseDaoHibernate4接口可以极大地简化DAO组件的开发,因此本系统的DAO组件同样会继承BaseDaoBaseDaoHibernate4接口。

10.3.1 DAO的基础配置

对于BaseDaoHibernate4需要容器注入一个SessionFactory引用,该类也为依赖注入提供了setSessionFactory()方法。BaseDaoHibernate4 基类一旦获得SessionFactory 的引用,就可以完成大部分通用的增、删、改、查操作。
Spring为整合Hibernate提供了LocalSessionFactoryBean 类,这样可以将HibernateSessionFactory纳入其IoC容器内。在使用LocalSessionFactoryBean配置SessionFactory之前,必须为其提供对应的数据源。SessionFactory的相关配置片段如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
<?xml version="1.0" encoding="utf-8"?>
<!-- Spring配置文件的根元素,并指定Schema信息 -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">

<!-- 定义数据源Bean,使用C3P0数据源实现 -->
<!-- 注意修改这里的数据库密码 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
p:driverClass="com.mysql.jdbc.Driver"
p:jdbcUrl="jdbc:mysql://localhost:3306/auction"
p:user="root"
p:password="root"
p:maxPoolSize="200"
p:minPoolSize="2"
p:initialPoolSize="2"
p:maxIdleTime="2000"
destroy-method="close"/>
<!-- 定义Hibernate的SessionFactory
并为它注入数据源,设置Hibernate配置属性等。-->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"
p:dataSource-ref="dataSource">
<property name="annotatedClasses">
<list>
<value>org.crazyit.auction.domain.AuctionUser</value>
<value>org.crazyit.auction.domain.Bid</value>
<value>org.crazyit.auction.domain.Item</value>
<value>org.crazyit.auction.domain.Kind</value>
<value>org.crazyit.auction.domain.State</value>
</list>
</property>
<!-- 定义Hibernate的SessionFactory的属性 -->
<property name="hibernateProperties">
<props>
<!-- 指定数据库方言 -->
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQL5InnoDBDialect</prop>
<!-- 显示Hibernate持久化操作所生成的SQL -->
<prop key="hibernate.show_sql">true</prop>
<!-- 将SQL脚本进行格式化后再输出 -->
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
</bean>

<!-- 配置daoTemplate,作为所有DAO组件的模板,
为DAO组件注入SessionFactory引用 -->
<bean id="daoTemplate"
abstract="true"
p:sessionFactory-ref="sessionFactory" />
<!-- 配置stateDao组件 -->
<bean id="stateDao"
parent="daoTemplate"
class="org.crazyit.auction.dao.impl.StateDaoHibernate" />
<!-- 配置kindDao组件 -->
<bean id="kindDao"
parent="daoTemplate"
class="org.crazyit.auction.dao.impl.KindDaoHibernate" />
<!-- 配置auctionDao组件 -->
<bean id="auctionUserDao"
parent="daoTemplate"
class="org.crazyit.auction.dao.impl.AuctionUserDaoHibernate" />
<!-- 配置bidDao组件 -->
<bean id="bidDao"
parent="daoTemplate"
class="org.crazyit.auction.dao.impl.BidDaoHibernate" />
<!-- 配置itemDao组件 -->
<bean id="itemDao"
parent="daoTemplate"
class="org.crazyit.auction.dao.impl.ItemDaoHibernate" />
</beans>

可以将Hibernate属性直接放在LocalSessionFactoryBean内配置,也可以放在hibernate.cfg.xml文件中配置。