02-00 Spring和JDBC

在传统的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开始被废弃。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181107G17VOC00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券