- 浏览: 401877 次
- 性别:
- 来自: 南京
最新评论
-
x981114171:
不知大家有没发现,国产书,国人写的书就没几本是给力的,以后国人 ...
《Spring技术内幕》的读者问题交流 -
x981114171:
买了这本书,感觉很不值。来吐槽下,也许你自己是专家,不过写的书 ...
《Spring技术内幕》的读者问题交流 -
851228082:
作者,写的书很好,我觉得幸亏有源码,所以我才能看懂。一边看,一 ...
《Spring技术内幕》的读者问题交流 -
yueshang520:
说的真不错。。学习了
Spring技术内幕——深入解析Spring架构与设计原理(一)IOC实现原理 -
faith789510:
TransactionProxyFactoryBean 什么情 ...
Spring源代码解析(六):Spring声明式事务处理
引用自博客:http://jiwenke-spring.blogspot.com/
下面我们看看Spring JDBC相关的实现,
在Spring中,JdbcTemplate是经常被使用的类来帮助用户程序操作数据库,在JdbcTemplate为用户程序提供了许多便利的数据库操作方法,比如查询,更新等,而且在Spring中,有许多类似 JdbcTemplate的模板,比如HibernateTemplate等等 - 看来这是Rod.Johnson的惯用手法,一般而言这种Template中都是通过回调函数CallBack类的使用来完成功能的,客户需要在回调接口中实现自己需要的定制行为,比如使用客户想要用的SQL语句等。不过往往Spring通过这种回调函数的实现已经为我们提供了许多现成的方法供客户使用。一般来说回调函数的用法采用匿名类的方式来实现,比如:
在模板中嵌入的是需要客户化的代码,由Spring来作或者需要客户程序亲自动手完成。下面让我们具体看看在JdbcTemplate中的代码是怎样完成使命的,我们举JdbcTemplate.execute()为例,这个方法是在JdbcTemplate中被其他方法调用的基本方法之一,客户程序往往用这个方法来执行基本的SQL语句:
对于JdbcTemplate中给出的其他方法,比如query,update,execute等的实现,我们看看query():
辅助类DataSourceUtils来用来对数据库连接进行管理的主要工具,比如打开和关闭数据库连接等基本操作:
那我们实际的DataSource对象是怎样得到的?很清楚我们需要在上下文中进行配置:它作为JdbcTemplate父类JdbcAccessor的属性存在:
而对于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中可以找到:
而这个declareParameters维护的是一个列表:
这个列表在以后compile的过程中会被使用。
3.然后用户程序需要实现MappingSqlQuery的mapRow接口,将具体的ResultSet数据生成我们需要的对象,这是我们迭代使用的方法。1,2,3步实际上为我们定义好了一个迭代的基本单元作为操作模板。
4.在应用程序,我们直接调用execute()方法得到我们需要的对象列表,列表中的每一个对象的数据来自于执行SQL语句得到记录集的每一条记录,事实上执行的execute在父类SqlQuery中起作用:
在这里我们可以看到template模式的精彩应用和对JdbcTemplate的灵活使用。通过使用它,我们免去了手工迭代ResultSet并将其中的数据转化为对象列表的重复过程。在这里我们只需要定义SQL语句和SqlParameter - 如果需要的话,往往SQL语句就常常能够满足我们的要求了。这是灵活使用JdbcTemplate的一个很好的例子。
Spring还为其他数据库操作提供了许多服务,比如使用SqlUpdate插入和更新数据库,使用UpdatableSqlQuery更新ResultSet,生成主键,调用存储过程等。
书中还给出了对BLOB数据和CLOB数据进行数据库操作的例子:
对BLOB数据的操作通过LobHander来完成,通过调用JdbcTemplate和RDBMS都可以进行操作:
在JdbcTemplate中,具体的调用可以参考书中的例子 - 是通过以下调用起作用的:
然后通过对实现PreparedStatementCallback接口的AbstractLobCreatingPreparedStatementCallback的回调函数来完成:
而我们注意到setValues()是一个需要实现的抽象方法,应用程序通过实现setValues来定义自己的操作 - 在setValues中调用lobCreator.setBlobAsBinaryStrem()。让我们看看具体的BLOB操作在LobCreator是怎样完成的,我们一般使用DefaultLobCreator作为BLOB操作的驱动:
上面提到的是零零碎碎的Spring JDBC使用的例子,可以看到使用Spring JDBC可以帮助我们完成许多数据库的操作。Spring对数据库操作最基本的服务是通过JdbcTeamplate和他常用的回调函数来实现的,在此之上,又提供了许多RMDB的操作来帮助我们更便利的对数据库的数据进行操作 - 注意这里没有引入向Hibernate这样的O/R方案。对这些O/R方案的支持,Spring由其他包来完成服务。
书中还提到关于execute和update方法之间的区别,update方法返回的是受影响的记录数目的一个计数,并且如果传入参数的话,使用的是java.sql.PreparedStatement,而execute方法总是使用 java.sql.Statement,不接受参数,而且他不返回受影响记录的计数,更适合于创建和丢弃表的语句,而update方法更适合于插入,更新和删除操作,这也是我们在使用时需要注意的。
有道理,Rod Jonson的书里也提到了,O/R mapping并不是所有情况下都适用的,有时候直接使用JDBC反而更好。
不过如果混合使用hibernate和jdbc有一些地方得小心,比如hibernate的缓存....
可能大家都不太喜欢使用Spring JDBC,而喜欢用Spring Hibernate来处理数据库的问题。其实有些时候不需要这么复杂的O/R Mapping来解决问题。
如果项目只有很少的需要持久化的类,我觉得使用JDBC就可以了。
有道理,Rod Jonson的书里也提到了,O/R mapping并不是所有情况下都适用的,有时候直接使用JDBC反而更好。
可能大家都不太喜欢使用Spring JDBC,而喜欢用Spring Hibernate来处理数据库的问题。其实有些时候不需要这么复杂的O/R Mapping来解决问题。
如果项目只有很少的需要持久化的类,我觉得使用JDBC就可以了。
下面我们看看Spring JDBC相关的实现,
在Spring中,JdbcTemplate是经常被使用的类来帮助用户程序操作数据库,在JdbcTemplate为用户程序提供了许多便利的数据库操作方法,比如查询,更新等,而且在Spring中,有许多类似 JdbcTemplate的模板,比如HibernateTemplate等等 - 看来这是Rod.Johnson的惯用手法,一般而言这种Template中都是通过回调函数CallBack类的使用来完成功能的,客户需要在回调接口中实现自己需要的定制行为,比如使用客户想要用的SQL语句等。不过往往Spring通过这种回调函数的实现已经为我们提供了许多现成的方法供客户使用。一般来说回调函数的用法采用匿名类的方式来实现,比如:
JdbcTemplate = new JdbcTemplate(datasource); jdbcTemplate.execute(new CallBack(){ public CallbackInterfacedoInAction(){ ...... //用户定义的代码或者说Spring替我们实现的代码 } }
在模板中嵌入的是需要客户化的代码,由Spring来作或者需要客户程序亲自动手完成。下面让我们具体看看在JdbcTemplate中的代码是怎样完成使命的,我们举JdbcTemplate.execute()为例,这个方法是在JdbcTemplate中被其他方法调用的基本方法之一,客户程序往往用这个方法来执行基本的SQL语句:
public Object execute(ConnectionCallback action) throws DataAccessException { //这里得到数据库联接 Connection con = DataSourceUtils.getConnection(getDataSource()); try { Connection conToUse = con; //有些特殊的数据库,需要我们使用特别的方法取得datasource if (this.nativeJdbcExtractor != null) { // Extract native JDBC Connection, castable to OracleConnection or the like. conToUse = this.nativeJdbcExtractor.getNativeConnection(con); } else { // Create close-suppressing Connection proxy, also preparing returned Statements. conToUse = createConnectionProxy(con); } //这里调用的是传递进来的匿名类的方法,也就是用户程序需要实现CallBack接口的地方。 return action.doInConnection(conToUse); } catch (SQLException ex) { //如果捕捉到数据库异常,把数据库联接释放,同时抛出一个经过Spring转换过的Spring数据库异常, //我们知道,Spring做了一个有意义的工作是把这些数据库异常统一到自己的异常体系里了。 DataSourceUtils.releaseConnection(con, getDataSource()); con = null; throw getExceptionTranslator().translate("ConnectionCallback", getSql(action), ex); } finally { //最后不管怎样都会把数据库连接释放 DataSourceUtils.releaseConnection(con, getDataSource()); } }
对于JdbcTemplate中给出的其他方法,比如query,update,execute等的实现,我们看看query():
public Object query(PreparedStatementCreator psc, final PreparedStatementSetter pss, final ResultSetExtractor rse) throws DataAccessException { .......... //这里调用了我们上面看到的execute()基本方法,然而这里的回调实现是Spring为我们完成的查询过程 return execute(psc, new PreparedStatementCallback() { public Object doInPreparedStatement(PreparedStatement ps) throws SQLException { //准备查询结果集 ResultSet rs = null; try { //这里配置SQL参数 if (pss != null) { pss.setValues(ps); } //这里执行的SQL查询 rs = ps.executeQuery(); ResultSet rsToUse = rs; if (nativeJdbcExtractor != null) { rsToUse = nativeJdbcExtractor.getNativeResultSet(rs); } //返回需要的记录集合 return rse.extractData(rsToUse); } finally { //最后关闭查询的纪录集,对数据库连接的释放在execute()中释放,就像我们在上面分析的看到那样。 JdbcUtils.closeResultSet(rs); if (pss instanceof ParameterDisposer) { ((ParameterDisposer) pss).cleanupParameters(); } } } }); }
辅助类DataSourceUtils来用来对数据库连接进行管理的主要工具,比如打开和关闭数据库连接等基本操作:
public static Connection doGetConnection(DataSource dataSource) throws SQLException { //把对数据库连接放到事务管理里面进行管理 ConnectionHolder conHolder = (ConnectionHolder) TransactionSynchronizationManager.getResource(dataSource); if (conHolder != null && (conHolder.hasConnection() || conHolder.isSynchronizedWithTransaction())) { conHolder.requested(); if (!conHolder.hasConnection()) { logger.debug("Fetching resumed JDBC Connection from DataSource"); conHolder.setConnection(dataSource.getConnection()); } return conHolder.getConnection(); } // 这里得到需要的数据库连接,在配置文件中定义好的。 logger.debug("Fetching JDBC Connection from DataSource"); Connection con = dataSource.getConnection(); if (TransactionSynchronizationManager.isSynchronizationActive()) { logger.debug("Registering transaction synchronization for JDBC Connection"); // Use same Connection for further JDBC actions within the transaction. // Thread-bound object will get removed by synchronization at transaction completion. ConnectionHolder holderToUse = conHolder; if (holderToUse == null) { holderToUse = new ConnectionHolder(con); } else { holderToUse.setConnection(con); } holderToUse.requested(); TransactionSynchronizationManager.registerSynchronization( new ConnectionSynchronization(holderToUse, dataSource)); holderToUse.setSynchronizedWithTransaction(true); if (holderToUse != conHolder) { TransactionSynchronizationManager.bindResource(dataSource, holderToUse); } } return con; }
那我们实际的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步实际上为我们定义好了一个迭代的基本单元作为操作模板。
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并将其中的数据转化为对象列表的重复过程。在这里我们只需要定义SQL语句和SqlParameter - 如果需要的话,往往SQL语句就常常能够满足我们的要求了。这是灵活使用JdbcTemplate的一个很好的例子。
Spring还为其他数据库操作提供了许多服务,比如使用SqlUpdate插入和更新数据库,使用UpdatableSqlQuery更新ResultSet,生成主键,调用存储过程等。
书中还给出了对BLOB数据和CLOB数据进行数据库操作的例子:
对BLOB数据的操作通过LobHander来完成,通过调用JdbcTemplate和RDBMS都可以进行操作:
在JdbcTemplate中,具体的调用可以参考书中的例子 - 是通过以下调用起作用的:
public Object execute(String sql, PreparedStatementCallback action) throws DataAccessException { return execute(new SimplePreparedStatementCreator(sql), action); }
然后通过对实现PreparedStatementCallback接口的AbstractLobCreatingPreparedStatementCallback的回调函数来完成:
public final Object doInPreparedStatement(PreparedStatement ps) throws SQLException, DataAccessException { LobCreator lobCreator = this.lobHandler.getLobCreator(); try { //这是一个模板方法,具体需要由客户程序实现 setValues(ps, lobCreator); return new Integer(ps.executeUpdate()); } finally { lobCreator.close(); } } //定义的需要客户程序实现的虚函数 protected abstract void setValues(PreparedStatement ps, LobCreator lobCreator) throws SQLException, DataAccessException;
而我们注意到setValues()是一个需要实现的抽象方法,应用程序通过实现setValues来定义自己的操作 - 在setValues中调用lobCreator.setBlobAsBinaryStrem()。让我们看看具体的BLOB操作在LobCreator是怎样完成的,我们一般使用DefaultLobCreator作为BLOB操作的驱动:
public void setBlobAsBinaryStream( PreparedStatement ps, int paramIndex, InputStream binaryStream, int contentLength) throws SQLException { //通过JDBC来完成对BLOB数据的操作,对Oracle,Spring提供了OracleLobHandler来支持BLOB操作。 ps.setBinaryStream(paramIndex, binaryStream, contentLength); ........ }
上面提到的是零零碎碎的Spring JDBC使用的例子,可以看到使用Spring JDBC可以帮助我们完成许多数据库的操作。Spring对数据库操作最基本的服务是通过JdbcTeamplate和他常用的回调函数来实现的,在此之上,又提供了许多RMDB的操作来帮助我们更便利的对数据库的数据进行操作 - 注意这里没有引入向Hibernate这样的O/R方案。对这些O/R方案的支持,Spring由其他包来完成服务。
书中还提到关于execute和update方法之间的区别,update方法返回的是受影响的记录数目的一个计数,并且如果传入参数的话,使用的是java.sql.PreparedStatement,而execute方法总是使用 java.sql.Statement,不接受参数,而且他不返回受影响记录的计数,更适合于创建和丢弃表的语句,而update方法更适合于插入,更新和删除操作,这也是我们在使用时需要注意的。
评论
6 楼
wanta
2007-10-09
我做的这个项目就是只能用JdbcTemplate,因为涉及的表特别多,用hibernate反倒不好配置。
5 楼
jiwenke
2007-08-16
zhoyan 写道
有道理,Rod Jonson的书里也提到了,O/R mapping并不是所有情况下都适用的,有时候直接使用JDBC反而更好。
不过如果混合使用hibernate和jdbc有一些地方得小心,比如hibernate的缓存....
4 楼
zhoyan
2007-08-13
引用
可能大家都不太喜欢使用Spring JDBC,而喜欢用Spring Hibernate来处理数据库的问题。其实有些时候不需要这么复杂的O/R Mapping来解决问题。
如果项目只有很少的需要持久化的类,我觉得使用JDBC就可以了。
有道理,Rod Jonson的书里也提到了,O/R mapping并不是所有情况下都适用的,有时候直接使用JDBC反而更好。
3 楼
amenglai
2007-08-02
2 楼
jiwenke
2007-06-09
tacone 写道
Spring JDBC
写得是很不错的,但SPRING的文档却介绍的不多
写得是很不错的,但SPRING的文档却介绍的不多
可能大家都不太喜欢使用Spring JDBC,而喜欢用Spring Hibernate来处理数据库的问题。其实有些时候不需要这么复杂的O/R Mapping来解决问题。
如果项目只有很少的需要持久化的类,我觉得使用JDBC就可以了。
1 楼
tacone
2007-06-06
Spring JDBC
写得是很不错的,但SPRING的文档却介绍的不多
写得是很不错的,但SPRING的文档却介绍的不多
发表评论
-
开放注册了!我们的任务推客 - 群组任务和流程协同SaaS工具
2010-06-30 20:31 621经过这几天团队的努力,为软件增加了开放注册功能,大家可以自己动 ... -
我们团队研发的SaaS软件产品:应用于群组任务协同和流程管理
2010-06-21 15:39 846任务协同及流程管理SaaS软件:任务推客上线,欢迎大家免费体验 ... -
随笔:Spring与云计算(六)
2009-12-17 18:49 3817这样,就说到国内了, ... -
随笔:Spring与云计算(五)
2009-12-16 19:58 3432那其他呢,我们看看还 ... -
随笔:Spring与云计算(四)
2009-12-15 16:26 4196前面我们提到,Spring被VMWare收购而进入云计算领域, ... -
随笔:Spring与云计算(三)
2009-12-14 14:05 3770在前面的那张图中,可以看到SpringSource产品和云计算 ... -
随笔:Spring与云计算(二)
2009-12-11 14:57 4344这么大的范围的模式转 ... -
随笔:Spring与云计算(一)
2009-12-10 15:19 7040对Spring和云计算的关注 ... -
《Spring技术内幕 - 深入解析Spring架构与设计原理》上市了!
2009-12-09 15:17 9158详细的书本目录和章节节选请见附件!欢迎下载指正。 可以购买到 ... -
Spring技术内幕——深入解析Spring架构与设计原理(六)Spring ACEGI
2009-11-20 12:27 14585Spring ACEGI 作为Spring丰富生态系统中的一个 ... -
Spring技术内幕——深入解析Spring架构与设计原理(五)Spring与远端调用
2009-11-16 20:23 11226在应用开发中,常常涉及服务器系统中各种不同进程之间的通信与计算 ... -
Spring技术内幕——深入解析Spring架构与设计原理(四)Web MVC的实现
2009-11-08 08:55 21285以前的欠账,现在补上,欢迎指正和讨论。 Spring Web ... -
Spring技术内幕——深入解析Spring架构与设计原理(三)数据库的操作实现
2009-11-02 17:34 13848最近事情实在是比较多,没有及时更新帖子,还望大家见谅啊。今天, ... -
Spring技术内幕——深入解析Spring架构与设计原理(二)AOP
2009-10-20 08:30 23133关于AOP的个人理解 AOP联盟定义的AOP体系结构把与AO ... -
Spring技术内幕——深入解析Spring架构与设计原理(一)IOC实现原理
2009-10-19 10:47 99000内容较多,新开一贴, ... -
Spring技术内幕——深入解析Spring架构与设计原理(一)引子
2009-10-17 20:31 11330缘起 已经很久没有写 ... -
Hadoop的mapred JobTracker端源码概览
2009-02-18 19:40 5211上一节看到TaskTracker启动新任务的过程,这里接着看看 ... -
Hadoop的mapred TaskTracker端源码概览
2009-02-17 14:39 4119花了许多功夫把Hadoop的mapreduce实现过了一遍,基 ... -
Hadoop的mapred TaskTracker端源码概览
2009-02-17 14:37 1665这篇文章和博客的另一篇重复,删掉了。对不起,请参阅博客的另一篇 ... -
发布用javaeye生成的博客版本 - Spring源代码解析
2008-11-20 08:49 3653呵呵,试试javaeye的新功能。帮助大家阅读,文中的很多错误 ...
相关推荐
Spring源代码解析3:Spring JDBC .doc Spring源代码解析4:Spring MVC .doc Spring源代码解析5:Spring AOP获取Proxy .doc Spring源代码解析6:Spring声明式事务处理 .doc Spring源代码解析7:Spring AOP中对拦截器...
Spring源代码解析3:Spring JDBC ; Spring源代码解析4:Spring MVC ;Spring源代码解析5:Spring AOP获取Proxy;Spring源代码解析6:Spring声明式事务处理 ; Spring源代码解析7:Spring AOP中对拦截器调用的实现...
Spring源代码解析(三):Spring JDBC Spring源代码解析(四):Spring MVC Spring源代码解析(五):Spring AOP获取Proxy Spring源代码解析(六):Spring声明式事务处理 Spring源代码解析(七):Spring AOP中对拦截器...
Spring源代码解析3:Spring JDBC ; Spring源代码解析4:Spring MVC ;Spring源代码解析5:Spring AOP获取Proxy;Spring源代码解析6:Spring声明式事务处理 ; Spring源代码解析7:Spring AOP中对拦截器调用的实现...
在Spring框架中,Spring JDBC是用于简化数据库操作的重要模块,主要通过`JdbcTemplate`类提供了一种方便、灵活且易于使用的API。`JdbcTemplate`设计的核心理念是模板方法模式,它将通用的数据库操作逻辑封装起来,而...
3. **Spring JDBC**:"spring源代码解析(三):spring JDBC.doc"深入剖析了Spring如何简化数据库操作,如JdbcTemplate和NamedParameterJdbcTemplate的使用,以及事务管理在JDBC层面上的实现。 4. **AOP(面向切面...
本篇文章将深入解析Spring JDBC的实现,特别是JdbcTemplate类。JdbcTemplate是Spring为简化数据库操作而设计的一个模板类,它封装了数据库连接获取、SQL执行、异常处理等细节,使开发者可以更专注于业务逻辑。 ...
Spring源代码分析(三):Spring JDBC.doc Spring源代码解析(四):Spring MVC.doc Spring源代码解析(五):Spring AOP获取Proxy.doc Spring源代码解析(六):Spring声明式事务处理.doc Spring源代码解析(七):Spring...
赠送源代码:spring-jdbc-5.3.15-sources.jar; 赠送Maven依赖信息文件:spring-jdbc-5.3.15.pom; 包含翻译后的API文档:spring-jdbc-5.3.15-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.springframework:...
《Spring源代码解析》 Spring框架作为Java领域最流行的开源框架之一,它的设计思想和实现方式一直是广大开发者关注的焦点。深入理解Spring的源代码,能够帮助我们更好地掌握其工作原理,提高我们的开发效率和代码...
Spring JDBC是Spring框架的一个核心模块,它为Java数据库连接(JDBC)提供了一种抽象层,使得开发者可以更轻松地处理数据库操作。Spring JDBC模块的主要目标是减少对JDBC API的直接依赖,通过提供一种更加高级、易于...
本文将深入探讨Spring对JDBC(Java Database Connectivity)的支持,以及如何在实际项目中使用这些功能。 首先,Spring JDBC的核心是`org.springframework.jdbc`包,它提供了一套高级抽象,用于简化数据库操作。在...
这个“Spring源代码解析”压缩包文件很可能是对Spring框架内部实现原理的详细分析,帮助开发者深入理解其工作机制。 在Spring框架中,依赖注入是核心概念之一,它允许开发者在运行时通过容器来管理对象的创建和依赖...
JavaEE源代码 spring-jdbcJavaEE源代码 spring-jdbcJavaEE源代码 spring-jdbcJavaEE源代码 spring-jdbcJavaEE源代码 spring-jdbcJavaEE源代码 spring-jdbcJavaEE源代码 spring-jdbcJavaEE源代码 spring-jdbcJavaEE源...
### MySQL-JDBC-Spring源代码分析 #### 一、引言 MySQL-JDBC与Spring框架的结合,在现代Java企业级应用开发中极为常见。通过Spring框架管理数据访问层(DAO层),可以极大地简化数据库操作,并提供一致的异常处理...
源代码分析有助于深入理解Spring的工作原理,提升编程技能,并且能够帮助开发者在遇到问题时进行调试和优化。 1. **Spring IoC容器**: Spring的核心是IoC容器,它负责管理对象的生命周期和依赖关系。通过XML配置...