在传统的java开发的数据访问过程中,我们必须初始化数据访问框架、打开连接、处理各种异常和关闭连接。处理起来非常繁琐,Spring自带了一组数据访问框架,集成了多种数据访问技术,不管是通过JDBC还是对象关系映射框架实现数据持久化。
Spring的数据访问
为了避免持久化的逻辑分散到应用的各个组件中,最好将数据库访问的功能放到一个或多个专注于此项任务的组件中。这样的组件称为数据访问对象(DAO)或Repository。为了避免应用与特定的数据访问策略耦合在一起,编写良好的Repository应该以接口的方式暴露功能。
服务对象通过接口来访问Repository接口。这样可以实现松耦合的代码。
Spring数据访问的异常体系
在编写JDBC代码时,如果不强制捕获SQLException的话,无法使用JDBC做任何事情,SQLException表示在尝试访问数据库时出现了问题,但这个异常却没有告诉你哪里出了错以及如何进行处理。实际上,能够触发SQLException的问题通常是不能在catch中解决的。所以SQLException感觉用处不大。
一些持久化框架提供了相对丰富的异常体系,如Hibernate等。Spring JDBC提供的数据访问异常体系提供了多个数据访问异常,分别描述了它们抛出时所对应的问题,Spring为读取和写入数据库几乎提供了所有的错误异常。尽管Spring的异常体系比JDBC的SQLException丰富的多,但并没有与特定的持久化方式相关联,这意味着可以使用Spring抛出一致的异常,而不用关心所选择的持久化方案,这有助于将所选择的持久化机制与数据访问层隔离开。
Spring的异常都继承自DataAccessException。DataAccessException是一个非检查型异常,所以在编写相关代码的时候不需要捕获Spring抛出的数据访问异常。
还有许多其他异常,懒的列了。
模板方法模式是定义过程的主要框架。在某些特定的步骤上,处理过程会将其工作委派给子类来完成一些特定实现的细节。模板方法将过程中与特定实现相关的部分委托给接口,而这个接口的不同实现定义了过程中的具体行为。Spring在数据访问中使用的模式就是模板方法模式。不管使用什么样的技术,都需要使用特定的数据访问步骤。Spring将数据访问过程中固定的和可变的部分明确划分为两个不同的类:模板和回调。模板管理过程中固定的部分,而回调处理自定义的数据访问代码。
针对不同的持久化平台,Spring提供了不同的模板。
配置数据源
Spring提供了在Spring上下文中配置数据源bean的多种方式:
通过JDBC驱动程序定义的数据源
通过JNDI查找的数据源
连接池的数据源
使用JNDI数据源
Spring应用程序经常部署在javaEE应用服务器中。这些服务器允许配置通过JNDI获取数据源。这种配置的好处在于数据源完全可以在应用程序之外进行管理,这样的应用程序只需在访问数据库的时候查找数据源就可以了。
以下为XML配置:
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jee="http://www.springframework.org/schema/jee"
xsi:schemaLocation="http://www.springframework.org/schema/jeehttp://www.springframework.org/schema/jee/spring-jee.xsd"
profile="dev">
以下为java配置
@Bean
publicJndiObjectFactoryBeandataSource(){
JndiObjectFactoryBean jndiObjectFactoryBean =newJndiObjectFactoryBean();
jndiObjectFactoryBean.setJndiName("jdbc/testDb");
jndiObjectFactoryBean.setResourceRef(true);
jndiObjectFactoryBean.setProxyInterface(javax.sql.DataSource.class);
returnjndiObjectFactoryBean;
}
使用数据源连接池
常见的数据源连接池的开源实现有:
Apache Commons DBCP
c3p0
BoneCp
这些连接池大多数都能配置为Spring的数据源,在一定程度上与Spring自带的DirverManagerDataSource或SingleConnectionDataSource类似。
Xml配置:
p:url="jdbc:h2:tcp://localhost/~/test"p:username="test"p:password="123456"
p:initialSize="5"p:maxActive="10"/>
Java配置:
@Bean
publicBasicDataSourcedataSource(){
BasicDataSource dataSource =newBasicDataSource();
dataSource.setDriverClassName("org.h2.Dirver");
dataSource.setUrl("jdbc:h2:tcp://localhost/~/test");
dataSource.setUsername("test");
dataSource.setPassword("123456");
dataSource.setInitialSize(5);
dataSource.setMaxActive(10);
returndataSource;
}
基于JDBC驱动的数据源
在Spring中,通过JDBC驱动定义数据源是最简单的配置方式,Spring提供了三个数据源类:
DirverManagerDataSource:在每个链接请求都会返回一个新建的链接。
SimpleDriverDataSource:与DirverManagerDataSource的工作方式类似,但直接使用JDBC驱动,来解决在特定环境下的类加载问题
SingleConnectionDataSource:在每个链接请求时都会返回同一个的链接。
配置和上边两种方式基本一样,懒得写了←_←。
在Spring中使用JDBC
JDBC能够更好的对数据访问的性能进行调优。JDBC允许使用数据库的所有特性,这是其他框架不鼓励甚至禁止的。相对于持久层框架,JDBC能够在更低的层次上处理数据,可以完全控制应用程序如何读取和管理数据,包括访问和管理数据库中的单独列。但JDBC虽然强大、灵活但是操作起来异常繁琐。
如果使用JDBC所提供的直接操作数据库的API,需要负责处理与数据库访问相关的所有事情,其中包含管理数据库资源和处理异常。步骤异常繁琐:1.获取连接,2.创建语句,3.绑定参数,4执行语句,5.处理异常,6.清理资源。这么多步操作只有一步是真正需要的。而且在增删改查中重复性的样板代码经常出现。但这些样板代码又非常重要,清理资源和处理错误确保了数据访问的健壮性。
Spring的JDBC框架承担了资源管理和异常处理的工作,从而简化了JDBC代码,只需编写从数据库读写数据的必须代码。Spring为JDBC提供了三个模板类供选择:
JdbcTempalte:最基本的SpringJDBC模板,这个模板支持简单的JDBC数据库访问功能以及基于索引参数的查询
NameParameterJdbcTemplate:该模板类执行查询时可以将值以命名参数的形式绑定到SQL中,而不是简单的索引参数
SimpleJdbcTemplate:该模板类利用java5的一些特性简化JDBC模板的使用。Spring3.1开始被废弃。
领取专属 10元无门槛券
私享最新 技术干货