Spring源码解析三

下面我们看看SpringJDBC相关的实现,在Spring中,JdbcTemplate是经常被使用的类来帮助用户程序操作数据库,在JdbcTemplate为用户程序提供了许多便利的数据库操作方法,比如查询,更新等,而且在Spring中,有许多类似JdbcTemplate的模板,比如HibernateTemplate等等–看来这是Rod.Johnson的惯用手法,一般而言这种Template中都是通过回调函数CallBack类的使用来完成功能的,客户需要在回调接口中实现自己需要的定制行为,比如使用客户想要用的SQL语句等。不过往往Spring通过这种回调函数的实现已经为我们提供了许多现成的方法供客户使用。一般来说回调函数的用法采用匿名类的方式来实现,比如:如请注明,自:关注Java[.gbsou.]本文:Spring源代码分析(三):SpringJDBCJava代码1.JdbcTemplate=newJdbcTemplate(datasource);2.jdbcTemplate.execute(newCallBack(){3.publicCallbackInterfacedoInAction(){4.……5.//用户定义的代码或者说Spring替我们实现的代码6.}7.}在模板中嵌入的是需要客户化的代码,由Spring来作或者需要客户程序亲自动手完成。下面让我们具体看看在JdbcTemplate中的代码是怎样完成使命的,我们举JdbcTemplate.execute()为例,这个方法是在JdbcTemplate中被其他方法调用的基本方法之一,客户程序往往用这个方法来执行基本的SQL语句:Java代码1.publicObjectexecute(ConnectionCallbackaction)throwsDataAccessException{2.//这里得到数据库联接3.Connectioncon=DataSourceUtils.getConnection(getDataSource());4.try{5.ConnectionconToUse=con;6.//有些特殊的数据库,需要我们使用特别的方法取得datasource7.if(this.nativeJdbcExtractor!=null){8.//ExtractnativeJDBCConnection,castabletoOracleConnectionorthelike.9.conToUse=this.nativeJdbcExtractor.getNativeConnection(con);10.}11.else{12.//Createclose-suppressingConnectionproxy,alsopreparingreturnedStatements.13.conToUse=createConnectionProxy(con);14.}15.//这里调用的是传递进来的匿名类的方法,也就是用户程序需要实现CallBack接口的地方。16.returnaction.doInConnection(conToUse);17.}18.catch(SQLExceptionex){19.//如果捕捉到数据库异常,把数据库联接释放,同时抛出一个经过Spring转换过的Spring数据库异常,20.//我们知道,Spring做了一个有意义的工作是把这些数据库异常统一到自己的异常体系里了。21.DataSourceUtils.releaseConnection(con,getDataSource());22.con=null;23.throwgetExceptionTranslator().translate("ConnectionCallback",getSql(action),ex);24.}25.finally{26.//最后不管怎样都会把数据库连接释放27.DataSourceUtils.releaseConnection(con,getDataSource());28.}29.}对于JdbcTemplate中给出的其他方法,比如query,update,execute等的实现,我们看看query():Java代码1.publicObjectquery(PreparedStatementCreatorpsc,finalPreparedStatementSetterpss,finalResultSetExtractorrse)2.throwsDataAccessException{3.……….4.//这里调用了我们上面看到的execute()基本方法,然而这里的回调实现是Spring为我们完成的查询过程5.returnexecute(psc,newPreparedStatementCallback(){6.publicObjectdoInPreparedStatement(PreparedStatementps)throwsSQLException{7.//准备查询结果集8.ResultSetrs=null;9.try{10.//这里配置SQL参数11.if(pss!=null){12.pss.setValues(ps);13.}14.//这里执行的SQL查询15.rs=ps.executeQuery();16.ResultSetrsToUse=rs;17.if(nativeJdbcExtractor!=null){18.rsToUse=nativeJdbcExtractor.getNativeResultSet(rs);19.}20.//返回需要的记录集合21.returnrse.extractData(rsToUse);22.}23.finally{24.//最后关闭查询的纪录集,对数据库连接的释放在execute()中释放,就像我们在上面分析的看到那样。25.JdbcUtils.closeResultSet(rs);26.if(pssinstanceofParameterDisposer){27.((ParameterDisposer)pss).cleanupParameters();28.}29.}30.}31.});32.}辅助类DataSourceUtils来用来对数据库连接进行管理的主要工具,比如打开和关闭数据库连...

1、当您付费下载文档后,您只拥有了使用权限,并不意味着购买了版权,文档只能用于自身使用,不得用于其他商业用途(如 [转卖]进行直接盈利或[编辑后售卖]进行间接盈利)。
2、本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供参考,付费前请自行鉴别。
3、如文档内容存在侵犯商业秘密、侵犯著作权等,请点击“举报”。

常见问题具体如下:

1、问:已经付过费的文档可以多次下载吗?

      答:可以。登陆您已经付过费的账号,付过费的文档可以免费进行多次下载。

2、问:已经付过费的文档不知下载到什么地方去了?

     答:电脑端-浏览器下载列表里可以找到;手机端-文件管理或下载里可以找到。

            如以上两种方式都没有找到,请提供您的交易单号或截图及接收文档的邮箱等有效信息,发送到客服邮箱,客服经核实后,会将您已经付过费的文档即时发到您邮箱。

注:微信交易号是以“420000”开头的28位数字;

       支付宝交易号是以“2024XXXX”交易日期开头的28位数字。

客服邮箱:

biganzikefu@outlook.com

所有的文档都被视为“模板”,用于写作参考,下载前须认真查看,确认无误后再购买;

文档大部份都是可以预览的,笔杆子文库无法对文档的真实性、完整性、准确性以及专业性等问题提供审核和保证,请慎重购买;

文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为依据;

如果您还有什么不清楚的或需要我们协助,可以联系客服邮箱:

biganzikefu@outlook.com

常见问题具体如下:

1、问:已经付过费的文档可以多次下载吗?

      答:可以。登陆您已经付过费的账号,付过费的文档可以免费进行多次下载。

2、问:已经付过费的文档不知下载到什么地方去了?

     答:电脑端-浏览器下载列表里可以找到;手机端-文件管理或下载里可以找到。

            如以上两种方式都没有找到,请提供您的交易单号或截图及接收文档的邮箱等有效信息,发送到客服邮箱,客服经核实后,会将您已经付过费的文档即时发到您邮箱。

注:微信交易号是以“420000”开头的28位数字;

       支付宝交易号是以“2024XXXX”交易日期开头的28位数字。

笔杆子文秘
机构认证
内容提供者

为您提供优质文档,供您参考!

确认删除?