spring数据持久化
Posted 东方印象
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring数据持久化相关的知识,希望对你有一定的参考价值。
1、spring提供了一组数据访问框架,集成了多种数据访问技术。支持JDBC、ibatis、hibernate、jpa等持久化框架。
2、spring的数据访问哲学
spring的目标之一就是允许开发人员在开发应用程序时,能够遵循面向对象原则中的“针对接口编程”。spring对数据访问的支持也不例外。DAO是数据访问对象(data access object)的缩写,DAO提供了数据读取和写入到数据库中的一种方式。他们以接口的方式发布功能,应用程序的其他部分可以通过接口来进行访问。如图:
服务对象通过接口来访问DAO,它使得服务对象易于测试,因为他们不再与特定的数据访问实现绑定在一起。此外,数据访问层是以持久化技术无关的方式来进行访问的。持久化方式的选择独立于DAO,只有相关的数据访问方法通过接口来进行发布。这可以实现灵活的设计并使得切换持久化框架对应用程序其他部分所带来的影响最小。如果将数据访问层的实现细节渗透到应用程序的其他部分中,那么整个应用程序将与数据访问层耦合在一起,从而导致僵化的设计。
3、spring的数据访问异常体系
JDBC访问数据会强制捕获SQLException异常,JDBC对于所有的数据访问问题都会抛出SQLException异常,但是这个异常却没有告诉你哪里出错了以及如何进行处理,不能再catch块中解决问题。一些持久化框架提供了相对丰富的异常体系。分别对应于特定的数据访问问题。这样就可以针对想处理的异常编写catch代码块。
不同于JDBC,spring提供了多个数据访问异常,分别描述了它们抛出时所对应的问题。如图:
尽管spring的异常体系比JDBC简单的SQLException丰富得多,但它并没有与特定的持久化方式相关联。这意味着我们可以用spring抛出一致的异常,而不用关心所选择的持久化方案。这有助于我们将所有持久化机制与数据访问隔离开来。spring认为触发异常的很多问题是不能在catch代码块中修复的。spring使用了非检查型异常,而不是强制开发人员编写catch代码块。这把是否要捕获异常的权力留给了开发人员。
4、数据访问模板化
spring将数据访问过程中固定的和可变的部分明确划分为两个不同的类:模板(template)和回调(callback)。模板管理过程中固定的部分,而回调处理自定义的数据访问代码。如图:
针对不同的持久化平台,spring提供了多个可选的模板。如图:
使用数据访问模板只需将其配置为spring上下文中的bean并将织入到应用程序的DAO中。或者,你还可以使用spring的DAO支持类进一步简化应用程序的DAO配置。尽管直接织入模板是不错的选择,但是spring还提供了一系列便利的DAO基类,这些基类可以用于管理模板。
5、使用DAO支持类
数据访问模板并不是spring数据访问框架的全部。每个模板提供了一些简便的方法,使我们不必创建明确的回调实现,从而简化了数据访问。另外,基于模板-回调设计,spring提供了DAO支持类,而将业务自己的DAO类作为它的子类。如图:
spring不仅提供了多个数据模板实现类,还为每种模板提供了对应的DAO支持类。如图:
6、配置数据源
不管选择哪一种spring DAO的支持方式,都需要配置一个数据源的引用。spring提供了在spring上下文中配置数据源bean的多种方式,包括:
1)通过JNDI查找的数据源;
Spring应用程序经常部署在JavaEE应用服务器中,如WebSphere、JBoss或者像Tomcat这样的Web容器。这些服务器允许你配置通过JNDI获取数据源。这种配置的好处在于数据源完全可以在应用程序之外进行管理,这样应用程序只需在访问数据库的时候查找数据源完全可以在应用程序之外进行管理,这样应用程序只需在访问数据库的时候查找数据源就可以了。另外,在应用服务器中管理的数据源通过以池的方式组织,从而具备更好的性能,并且支持系统管理员对其进行热切换。
利用spring,我们可以像使用Spring Bean那样配置JNDI中数据源的引用并将其装配到需要的类中。位于jee命名空间下的<jee:jndi-lookup>元素并将其装配到Spring中。如:<jee:jndi-lookup id="dataSource" jndi-name="/jdbc/zhyypt" resource-ref="true" />
2)连接池的数据源;
尽管Spring并没有提供数据源连接池实现,但Jakarta Commons Data-base Connection Pooling(DBCP)项目是一个不错的选择。
DBCP包含了多个提供连接池功能的数据源,其中BasicDataSource是最常用的,因为它易于在Spring中配置,而且类似于Spring自带的DriverManagerData-Source。配置如下:
3)通过JDBC驱动程序定义的数据源;
在Spring中,通过JDBC驱动定义数据源是最简单的配置方式。Spring提供了两种数据源对象供选择。
DriverManagerDataSource:在每个连接请求时都会返回一个新建的连接。与DBCP的BasicDataSource不同,由DriverManagerDataSource提供的连接并没有进行池化管理。
SingleConnectionDataSource:在每个连接请求时都会返回同一个连接。尽管SingleConnectionDataSource不是严格意义上的连接池数据源,但是你可以将其视为只有一个连接的池。
以上两个连接的配置如下:
7、使用JDBC模板
Spring的JDBC框架承担了资源管理和异常处理的工作,从而简化了JDBC代码。Spring为JDBC提供了3个模板类使用。
JdbcTemplate:最基本的Spring JDBC模板,这个模板支持最简单的JDBC数据库访问功能以及简单的索引参数查询。
NamedParameterJdbcTemplate:使用该模板执行查询时,可以将查询值以命名参数的形式绑定到SQL中,而不是使用简单的索引参数。
SimpleJdbcTemplate:该模板类利用Java5的一些特性,如自动装箱、泛型以及可变参数列表来简化JDBC模板的使用。
在Spring3.0中,对NamedParameterJdbcTemplate已经不在支持——所以相对于SimpleJdbcTemplate,没有理由在选择简单的JdbcTemplate了。只需要设置DataSource就能够让SimpleJdbcTemplate正常工作。在Spring中配置SimpleJdbcTemplate非常容易,如下所示:
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.simple.SimpleJdbcTemplate">
<constructor-arg ref="dataSource"/>
</bean>
属性dataSource所引用的dataSource可以是javax.sql.DataSource的任意实现。
现在,可以将jdbcTemplate装配到DAO中并使用它来访问数据库。
public class JdbcSpitterDAO impliments SpitterDAO{
private SimpleJdbcTemplate jdbcTemplate;
public void setJdbcTemplate(SimepleJdbcTemplate jdbcTemplate){
this.jdbcTemplate = jdbcTemplate;
}
}
还需要装配JdbcSpitterDAO的jdbcTemplate属性,如下:
<bean id="spitterDao" class="com.zhyypt.spitter.SimpleJdbcTemplateSpitterDao">
<property name="jdbcTemplate" ref="jdbcTemplate"/>
</bean>
对于应用程序中的每一个JDBC DAO类,我们都需要添加一个SimpleJdbcTemplate属性以及对应的setter方法,并确保将SimpleJdbcTemplate Bean装配到每个DAO的SimpleJdbcTemplate属性中。这会产生大量的重复工作。
一种可行的解决方案就是为所有的DAO创建一个通用的父类,在其中会有SimpleJdbcTemplate属性。然后让所有的DAO类继承这个类并使用父类的SimpleJdbcTemplate进行数据访问。Spring提供了内置的基类(JdbcDaoSupport、SimpleJdbcDaoSupport和NamedParameterJdbcDaoSupport),分别对应于不同的Spring JDBC模板。要使用这些DAO支持类,就要确保DAO类继承此类。如:
public class JdbcSpitterDao extends SimpleJdbcDaoSuppoort implements SpitterDao{
...
}
以上是关于spring数据持久化的主要内容,如果未能解决你的问题,请参考以下文章
“BasicBatchConfigurer”已保护访问 - Spring Batch/Spring Boot 未将数据持久化到数据库