1.Spring中使用JdbcTemplate封装对Jdbc的支持,使用Spring JdbcTeamplate的例子如下:
(1). 假设如下SQL表中有数据username=test1,passwd=test1,address=test1 :
(2).在Spring配置文件中添加关于数据源和JdbcTeamplate的配置如下:
(3).Java持久化对象如下:
(4).使用JdbcTeamplate的DAO如下:
2.Spring JdbcTemplate的工作流程:
通过1中的小例子,我们可以总结出SpringJdbcTemplate的工作流程如下:
(1).配置数据源:
Spring中,将管理数据库连接的数据源当作普通Java Bean一样在Spring IoC容器中管理,当应用使用数据源时Spring IoC容器负责初始化数据源。
(2).将数据源注入JdbcTemplate:
JdbcTemplate中dataSource属性用于注入配置的数据源,Spring IoC容器通过依赖注入将配置的数据源注入到Spring对Jdbc操作的封装类JdbcTemplate中。
(3).应用中使用JdbcTemplate:
注入了数据源的JdbcTemplate就可以在应用中使用了,应用中对数据源的增删改查等操作都可以使用JdbcTemplate对外提供的方法操作数据库。
3.JdbcTemplate处理Statement的相关方法实现:
JdbcTemplate的execute方法是JdbcTemplate的核心方法,是JdbcTemplate调用jdbc进行查询,添加,删除和更新操作的基础方法,在execute方法中,主要实现对数据库的基本操作,如:获取数据库连接;根据应用对数据库的需要创建数据库的Statement;对数据库操作进行回调;处理数据库异常;关闭数据库连接等等。JdbcTemplate中有真的Jdbc中Statement、PreparedStatement和CallableStatement处理的execute方法,首先我们分析处理Statement的相关方法:
(1).处理Statement的execute方法:
Execute方法是JdbcTemplate执行jdbc操作的核心,其他的方法都是通过调用execute方法来操作数据库。
(2). Statement的查询方法:
JdbcTemplate处理Statement的查询方法有很多,但是其中最基本的方法源码如下:
(3).Statement的更新方法:
通过对Statement相关处理的方法源码分析,我们可以看出execute方法是核心方法,在execute方法中,主要获取数据库连接和创建Statement,同时当执行完jdbc操作之后释放连接和资源等数据库操作的通用流程,所有的查询,更新等具体操作均是通过向execute方法传递合适的回调参数来使用execute方法中的数据库通用流程和资源,真正执行jdbc操作的方法由具体的回调内部类来实现。
4.JdbcTemplate处理PreparedStatement的相关方法实现:
(1).处理PreparedStatement的execute方法:
(2). PreparedStatement的查询方法:
和Statement类似,JdbcTemplate中PreparedStatement的查询方法也非常多,我们以最基本的查询方法源码为例分析其处理流程:
(3). PreparedStatement的更新方法:
通过对PreparedStatement相关处理方法的源码分析,我们可以看到PreparedStatement和Statement的处理流程基本是相同的,不同之处在于PreparedStatement需要处理设置参数值的操作。
5.JdbcTemplate处理CallableStatement的相关方法实现:
(1).处理CallableStatement的execute方法:
(2).CallableStatement的call方法:
通过上面对CallableStatement相关处理方法的源码分析我们可以看到,execute方法基本和Statement和PreparedStatement是相同的,不同之处在于CallableStatement是通过jdbc调用数据库的存储过程,对于输入输出参数的组装,以及返回结果的处理方面有些特殊处理。
6.JdbcTemplate通过DataSourceUtils获取数据库连接:
JdbcTemplate的execute方法中通过DataSourceUtils.getConnection(getDataSource());获取数据库连接,下面我们就分析DataSourceUtils类获取数据库连接的实现过程:
通过对JdbcTemplate的源码分析,我们看到Spring只是将jdbc的一些常用操作封装,将通用的获取数据库连接、创建创建Statement、关闭资源释放连接等操作封装在不同种类的execute方法中,同时调用不同的回调处理Action来具体执行jdbc操作,对jdbc熟悉的人很容易看懂这部分源码,当然Spring还对jdbc进行了一些高级的封装和扩展,例如RowMapper将结果集转换为指定对象等,这部分有兴趣可以自己研究。