快速业务通道

Spring源代码解析(三):Spring JDBC - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-18
9 javaeye jiwenke

那我们实际的DataSource对象是怎样得到的?很清楚我们需要在上下文中进行配置: 它作为JdbcTemplate父类JdbcAccessor的属性存在:

代码

public abstract class JdbcAccessor implements InitializingBean {    /** 这里是我们依赖注入数据库数据源的地方。*/    private DataSource dataSource;    /** Helper to translate SQL exceptions to DataAccessExceptions */    private SQLExceptionTranslator exceptionTranslator;    private boolean lazyInit = true;    ........ } 

而对于DataSource的缓冲池实现,我们通过定义Apache Jakarta Commons DBCP或者 C3P0提供的DataSource来完成,然后只要在上下文中配置好就可以使用了。从上面我们看 到JdbcTemplate提供了许多简单查询和更新功能,但是如果需要更高层次的抽象,以及更 面向对象的方法来访问数据库。Spring为我们提供了org.springframework.jdbc.object 包,这里面包含了SqlQuery,SqlMappingQuery, SqlUpdate和StoredProcedure等类,这些 类都是Spring JDBC应用程序可以使用的主要类,但我们要注意使用这些类的时候,用户 需要为他们配置好一个JdbcTemplate作为其基本的操作的实现。

比如说我们使用MappingSqlQuery来将表数据直接映射到一个对象集合 - 具体可以参 考书中的例子

1.我们需要建立DataSource和sql语句并建立持有这些对象的MappingSqlQuery对象

2.然后我们需要定义传递的SqlParameter,具体的实现我们在MappingSqlQuery的父类 RdbmsOperation中可以找到:

代码

public void declareParameter(SqlParameter param) throws InvalidDataAccessApiUsageException {   //如果声明已经被编译过,则该声明无效   if (isCompiled()) {     throw new InvalidDataAccessApiUsageException("Cannot add parameters once query is compiled");   }   //这里对参数值进行声明定义   this.declaredParameters.add(param);

而这个declareParameters维护的是一个列表:

代码

/** List of SqlParameter objects */ 

private List declaredParameters = new LinkedList();

这个列表在以后compile的过程中会被使用。

3.然后用户程序需要实现MappingSqlQuery的mapRow接口,将具体的ResultSet数据生 成我们需要的对象,这是我们迭代使用的方法。1,2,3步实际上为我们定义好了一个迭 代的基本单元作为操作模板。

Spring源代码解析(三):Spring JDBC(4)

时间:2011-03-29 javaeye jiwenke

4.在应用程序,我们直接调用execute()方法得到我们需要的对象列表,列表中的每一 个对象的数据来自于执行SQL语句得到记录集的每一条记录,事实上执行的execute在父类 SqlQuery中起作用:

代码

public List executeByNamedParam(Map paramMap, Map context) throws DataAccessException {    validateNamedParameters(paramMap);    Object[] parameters = NamedParameterUtils.buildValueArray(getSql(), paramMap);    RowMapper rowMapper = newRowMapper(parameters, context);    String sqlToUse = NamedParameterUtils.substituteNamedParameters(getSql (), new MapSqlParameterSource(paramMap));    //我们又看到了JdbcTemplate,这里使用JdbcTemplate来完成对数据库的查询操作 ,所以我们说JdbcTemplate是基本的操作类。    return getJdbcTemplate().query(newPreparedStatementCreator(sqlToUse, parameters), rowMapper); }

在这里我们可以看到template模式的精彩应用和对JdbcTemplate的灵活使用。通过使 用它,我们免去了手工迭代ResultSet并将其中的数据转化为对象列表的重复过程

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号