<!--
Spring将数据访问过程中固定的和可变的部分明确划分为两个不同的类:模板(template)和回调(callback).
模板管理过程中固定的部分,而回调处理自定义的数据访问代码。
针对不同的持久化平台,Spring提供了多个可选模板。如果直接使用JDBC,可以选择JdbcTemplate。如果希望使用对象关系映射框架,则
HibernateTemplate或JpaTemplate可能更好。iBATIS的SqlMap客户端使用SqlMapClientTemplate
Dao支持类,基于模板-回调设计,Spring提供了Dao支持类,而将业务自己的Dao类作为它的子类。
当编写Dao实现时,可以继承自Dao支持类并调用模板获取方法来直接访问底层的数据访问模板。
如果需要访问底层的持久化平台,则每个Dao支持类都能够访问其与数据库进行通信的类。
Spring所支持的大多数持久化功能都依赖于数据源,因此需要先配置数据源。
1.通过JDBC驱动程序定义的数据源
2.通过JNDI查找的数据源
3.连接池的数据源
对于即将发布到生产环境中的应用程序,建议使用从连接池获取连接的数据源。如果可能的话,更倾向于通过应用服务器的JNDI来获取池中的数据源。
jndi-name:用于指定JNDI中资源的名称
如果应用程序运行在Java应用程序服务器中,则需要将resource-ref属性设置为true,这样给定的jndi-name将会自动添加java:comp/env/前缀
-->
<jee:jndi-lookup id="dataSource" jndi-name="/jdbc/SpitterDS" resource-ref="true"/>
<!--
如果不能从JNDI中查找数据源,那么就直接在spring中配置数据源连接池。Spring并没有提供数据源连接池的实现,但是使用DBCP是一个不错的选择。
DBCP包含多个提供连接池功能的数据源,其中BasicDataSource是最常用的,它在spring中易于配置,而且类似于spring自带的DriverManagerDataSource。
其中前四个属性是必须的:
1.driverClassName:JDBC驱动类的全限定类名
2.url:用于设置数据库的JDBC URL
3.username:数据库连接用户名
4。password:数据库连接密码
BasicDataSource的池配置属性
-------------------------------------------------------------------------------
池配置属性 |所指定的内容
-------------------------------------------------------------------------------
initialSize |池启动时创建的连接数量
-------------------------------------------------------------------------------
maxActive |同一时间可以从池中分配的最多连接数,如果设置为0,则表示无限制
-------------------------------------------------------------------------------
maxIdle |池里不会被释放的最多空闲连接数,如果设置为0,则表示无限制
-------------------------------------------------------------------------------
maxOpenPreparedStatements |在同时间能够从语句池中分配的预处理语句的最大数量。如果设置为0,则表示无限制
-------------------------------------------------------------------------------
maxWait |在抛出异常之前,池等待连接回收的最大时间(当没有可用连接时)。如果设置为-1,则表示无限等待
-------------------------------------------------------------------------------
minEvictableIdleTimeMillis|连接在池中保持空闲而不被回收的最大时间
-------------------------------------------------------------------------------
minIdle |在不创建新连接的情况下,池中保持空闲的最小连接数
-------------------------------------------------------------------------------
poolPreparedStatements |是否对预处理语句进行池管理(布尔值)
-------------------------------------------------------------------------------
-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
<property name="url" value="jdbc:hsqldb:hsql://localhost/spitter/spitter"/>
<property name="username" value="sa"/>
<property name="password" value=""/>
<property name="initialSize" value="5"/>
<property name="maxActive" value="10"/>
</bean>
<!--
基于JDBC驱动的数据源
在Spring中,通过JDBC驱动定义数据源是最简单的配置方式。Spring提供了两种数据源供选择
1.DriverManagerDataSource:在每个连接请求时都会返回一个新建的连接,和上面说过的DBCP的BasicDataSource不同
由DriverManagerDataSource提供的连接并没有进行池化管理。
2.SingleConnectionDataSource:在每个连接请求时都会返回同一个连接。尽管SingleConnectionDataSource不是
严格意义上的连接池数据源,但是可以将其当作只有一个连接的池
-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
<property name="url" value="jdbc:hsqldb:hsql://localhost/spitter/spitter"/>
<property name="username" value="sa"/>
<property name="password" value=""/>
</bean>
<!--
使用JDBC模板
Spring为JDBC提供了3个模板类供使用
1.JdbcTemplate:最基本的Spring JDBC模板,这个模板支持最简单的JDBC数据库访问功能以及简单的索引参数查询
2.NamedParameterJdbcTemplate:使用该模板类执行查询语句,可以将查询值以命名参数的形式绑定到SQL中,而不是使用简单的索引参数
3.SimpleJdbcTemplate:该模板类利用Java5的一些特性,
-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.simple.SimpleJdbcTemplate">
<constructor-arg ref="dataSource"/>
</bean>
<!-- 还需要配置JdbcSpitterDao中的jdbcTemplate属性 -->
<bean id="spitterDao" class="com.bean.SimpleJdbcTemplateSpitterDao">
<property name="jdbcTemplate" ref="jdbcTemplate"/>
</bean>
<!--
使用如上配置,在每个dao中都要设置一个属性及setter方法,如果dao有很多的话,就会有很多重复工作。
这种情况下,一个解决方案是为所有的dao使用一个通用的父类。其中有SimpleJdbcTemplate属性。然后让所有的dao集成这个类并使用父类的SimpleJdbcTemplate进行数据访问
可以继承SimpleJdbcDaoSupport来实现,但是在spring中配置dao时,和没有继承的dao无差别,所以要用另一种方案。
直接将数据源配置给JdbcSpitterDao的dataSource属性,这个属性是继承自SimpleJdbcDaoSupport的。
-->
<bean id="spitterDao" class="com.bean.JdbcSpitterDao">
<property name="dataSource" ref="dataSource"/>
</bean>