Spring Framework 开发参考手册 之十 使用JDBC进行数据访问

本文详细介绍了Spring Framework中使用JDBC进行数据访问的相关内容,包括JdbcTemplate的使用,数据源的配置,SQLException的转换,以及如何执行Statement、查询和更新数据库。文章还探讨了DataSourceUtils、SmartDataSource等工具类的使用,强调了Spring JDBC抽象层的优势,如异常转换和资源管理,以简化JDBC编程并提高代码的可维护性。
摘要由CSDN通过智能技术生成

第 10 章 使用JDBC进行数据访问

10.1. 简介

Spring提供的JDBC抽象框架由coredatasourceobject和 support四个不同的包组成。

就和它名字的暗示一样,org.springframework.jdbc.core包里定义了提供核心功能的类。 其中有各种SQLExceptionTranslator和DataFieldMaxValueIncrementer的实现以及一个用于JdbcTemplate的DAO基础类。

org.springframework.jdbc.datasource包里有一个用以简化数据源访问的工具类, 以及各种数据源的简单实现,以被用来在J2EE容器之外不经修改地测试JDBC代码。 这个工具类提供了从JNDI获得连接和可能用到的关闭连接的静态方法。 它支持绑定线程的连接,比如被用于DataSourceTransactionManager。

接着,org.springframework.jdbc.object包里是把关系数据库的查询, 更新和存储过程封装为线程安全并可重用对象的类。 这中方式模拟了JDO,尽管查询返回的对象理所当然的“脱离”了数据库连接。 这个JDBC的高层抽象依赖于org.springframework.jdbc.core包中所实现的底层抽象。

最后在org.springframework.jdbc.support包中你可以找到 SQLException的转换功能和一些工具类。

在JDBC调用中被抛出的异常会被转换成在定义org.springframework.dao包中的异常。 这意味着使用Spring JDBC抽象层的代码不需要实现JDBC或者RDBMS特定的错误处理。 所有的转换后的异常都是unchecked,它允许你捕捉那些你可以恢复的异常, 并将其余的异常传递给调用者。

10.2. 使用JDBC核心类控制基本的JDBC处理和错误处理

10.2.1. JdbcTemplate

这是在JDBC核心包中最重要的类。它简化了JDBC的使用, 因为它处理了资源的建立和释放。 它帮助你避免一些常见的错误,比如忘了总要关闭连接。它运行核心的JDBC工作流, 如Statement的建立和执行,而只需要应用程序代码提供SQL和提取结果。这个类执行SQL查询, 更新或者调用存储过程,模拟结果集的迭代以及提取返回参数值。它还捕捉JDBC的异常并将它们转换成 org.springframework.dao包中定义的通用的,能够提供更多信息的异常体系。

使用这个类的代码只需要根据明确定义的一组契约来实现回调接口。 PreparedStatementCreator回调接口创建一个由该类提供的连接所建立的PreparedStatement, 并提供SQL和任何必要的参数。CallableStatementCreateor实现同样的处理, 只是它创建了CallableStatement。RowCallbackHandler接口从数据集的每一行中提取值。

这个类可以直接通过数据源的引用实例化,然后在服务中使用, 也可以在ApplicationContext中产生并作为bean的引用给服务使用。 注意:数据源应当总是作为一个bean在ApplicationContext中配置, 第一种情况它被直接传递给服务,第二种情况给JdbcTemplate。 因为这个类把回调接口和SQLExceptionTranslator接口作为参数表示,所以没有必要为它定义子类。 这个类执行的所有SQL都会被记入日志。

10.2.2. 数据源

为了从数据库获得数据,我们需要得到数据库的连接。 Spring采用的方法是通过一个数据源数据源是JDBC规范的一部分,它可以被认为是一个通用的连接工厂。 它允许容器或者框架将在应用程序代码中隐藏连接池和事务的管理操作。 开发者将不需要知道连接数据库的任何细节,那是设置数据源的管理员的责任。 虽然你很可能在开发或者测试的时候需要兼任两种角色,但是你并不需要知道实际产品中的数据源是如何配置的。

使用Spring的JDBC层,你可以从JNDI得到一个数据源,也可以通过使用Spring发行版提供的实现自己配置它。 后者对于脱离Web容器的单元测试是十分便利的。 我们将在本节中使用DriverManagerDataSource实现,当然以后还会提到其他的一些的实现。 DriverManagerDataSource和传统的方式一样获取JDBC连接。 为了让DriverManager可以装载驱动类,你必须指定JDBC驱动完整的类名。 然后你必须提供相对于各种JDBC驱动的不同的URL。你必须参考你所用的驱动的文档,以获得需要使用的正确参数。 最后,你还必须提供用来连接数据库的用户名和密码 下面这个例子说明如何配置DriverManagerDataSource:

DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName( "org.hsqldb.jdbcDriver");
dataSource.setUrl( "jdbc:hsqldb:hsql://localhost:");
dataSource.setUsername( "sa");
dataSource.setPassword( ""); 

10.2.3. SQLExceptionTranslator

SQLExceptionTranslator是一个需要实现的接口, 它被用来处理SQLException和我们的数据访问异常org.springframework.dao.DataAccessException之间的转换。

实现可以是通用的(比如使用JDBC的SQLState值),也可以为了更高的精确度特殊化 (比如使用Oracle的ErrorCode)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值