最近事情实在是比较多,没有及时更新帖子,还望大家见谅啊。今天,一起讨论讨论Spring JDBC的实现吧。
关于Spring JDBC
还是从Spring JDBC说起吧,虽然现在应用很多都是直接使用Hibernate或者其他的ORM工具。但JDBC毕竟还是很基本的,其中的JdbcTemplate就是我们经常使用的,比如JDBCTemplate的execute方法,就是一个基本的方法,在这个方法的实现中,可以看到对数据库操作的基本过程。
-
-
publicvoidexecute(finalStringsql)throwsDataAccessException{
-
if(logger.isDebugEnabled()){
-
logger.debug("ExecutingSQLstatement["+sql+"]");
-
}
-
classExecuteStatementCallbackimplementsStatementCallback<Object>,SqlProvider{
-
publicObjectdoInStatement(Statementstmt)throwsSQLException{
-
stmt.execute(sql);
-
returnnull;
-
}
-
publicStringgetSql(){
-
returnsql;
-
}
-
}
-
execute(newExecuteStatementCallback());
-
}
-
-
public<T>Texecute(StatementCallback<T>action)throwsDataAccessException{
-
Assert.notNull(action,"Callbackobjectmustnotbenull");
-
-
Connectioncon=DataSourceUtils.getConnection(getDataSource());
-
Statementstmt=null;
-
try{
-
ConnectionconToUse=con;
-
if(this.nativeJdbcExtractor!=null&&
-
this.nativeJdbcExtractor.isNativeConnectionNecessaryForNativeStatements()){
-
conToUse=this.nativeJdbcExtractor.getNativeConnection(con);
-
}
-
-
stmt=conToUse.createStatement();
-
applyStatementSettings(stmt);
-
StatementstmtToUse=stmt;
-
if(this.nativeJdbcExtractor!=null){
-
stmtToUse=this.nativeJdbcExtractor.getNativeStatement(stmt);
-
}
-
-
Tresult=action.doInStatement(stmtToUse);
-
handleWarnings(stmt);
-
returnresult;
-
}
-
catch(SQLExceptionex){
-
-
-
-
-
JdbcUtils.closeStatement(stmt);
-
stmt=null;
-
DataSourceUtils.releaseConnection(con,getDataSource());
-
con=null;
-
throwgetExceptionTranslator().translate("StatementCallback",getSql(action),ex);
-
}
-
finally{
-
JdbcUtils.closeStatement(stmt);
-
-
DataSourceUtils.releaseConnection(con,getDataSource());
-
}
-
}
在使用数据库的时候,有一个很重要的地方就是对数据库连接的管理,在这里,是由DataSourceUtils来完成的。Spring通过这个辅助类来对数据的Connection进行管理。比如通过它来完成打开和关闭Connection等操作。DataSourceUtils对这些数据库Connection管理的实现, 如以下代码所示。
-
-
publicstaticConnectiongetConnection(DataSourcedataSource)throwsCannotGetJdbcConnectionException{
-
try{
-
returndoGetConnection(dataSource);
-
}
-
catch(SQLExceptionex){
-
thrownewCannotGetJdbcConnectionException("CouldnotgetJDBCConnection",ex);
-
}
-
}
-
publicstaticConnectiondoGetConnection(DataSourcedataSource)throwsSQLException{
-
Assert.notNull(dataSource,"NoDataSourcespecified");
-
-
-
ConnectionHolderconHolder=(ConnectionHolder)TransactionSynchronizationManager.getResource(dataSource);
-
if(conHolder!=null&&(conHolder.hasConnection()||conHolder.isSynchronizedWithTransaction())){
-
conHolder.requested();
-
if(!conHolder.hasConnection()){
-
logger.debug("FetchingresumedJDBCConnectionfromDataSource");
-
conHolder.setConnection(dataSource.getConnection());
-
}
-
returnconHolder.getConnection();
-
}
-
-
-
-
logger.debug("FetchingJDBCConnectionfromDataSource");
-
Connectioncon=dataSource.getConnection();
-
-
if(TransactionSynchronizationManager.isSynchronizationActive()){
-
logger.debug("RegisteringtransactionsynchronizationforJDBCConnection");
-
-
-
ConnectionHolderholderToUse=conHolder;
-
if(holderToUse==null){
-
holderToUse=newConnectionHolder(con);
-
}
-
else{
-
holderToUse.setConnection(con);
-
}
-
holderToUse.requested();
-
TransactionSynchronizationManager.registerSynchronization(
-
newConnectionSynchronization(holderToUse,dataSource));
-
holderToUse.setSynchronizedWithTransaction(true);
-
if(holderToUse!=conHolder){
-
TransactionSynchronizationManager.bindResource(dataSource,holderToUse);
-
}
-
}
-
returncon;
-
}
关于数据库操作类RDBMS
从JdbcTemplate中,我们看到,他提供了许多简单查询和更新的功能。但是,如果需要更高层次的抽象,以及更面向对象的方法来访问数据库,Spring为我们提供了org.springframework.jdbc.object包,里面包含了SqlQuery、SqlMappingQuery、SqlUpdate和StoredProcedure等类,这些类都是Spring JDBC应用程序可以使用的。但要注意,在使用这些类时需要为它们配置好JdbcTemplate作为其基本的操作实现,因为在它们的功能实现中,对数据库操作的那部分实现基本上还是依赖于JdbcTemplate来完成的。
比如,对MappingSqlQuery使用的过程,是非常简洁的;在设计好数据的映射代码之后,查询得到的记录已经按照前面的设计转换为对象List了,一条查询记录对应于一个数据对象,可以把数据库的数据记录直接映射成Java对象在程序中使用,同时又可避免使用第三方ORM工具的配置,对于简单的数据映射场合是非常方便的;在mapRow方法的实现中提供的数据转换规则,和我们使用Hibernate时,Hibernate的hbm文件起到的作用是非常类似的。这个MappingSqlQuery需要的对设置进行compile,这些compile是这样完成的,如以下代码所示:
-
protectedfinalvoidcompileInternal(){
-
-
this.preparedStatementFactory=newPreparedStatementCreatorFactory(getSql(),getDeclaredParameters());
-
this.preparedStatementFactory.setResultSetType(getResultSetType());
-
this.preparedStatementFactory.setUpdatableResults(isUpdatableResults());
-
this.preparedStatementFactory.setReturnGeneratedKeys(isReturnGeneratedKeys());
-
if(getGeneratedKeysColumnNames()!=null){
-
this.preparedStatementFactory.setGeneratedKeysColumnNames(getGeneratedKeysColumnNames());
-
}
-
his.preparedStatementFactory.setNativeJdbcExtractor(getJdbcTemplate().getNativeJdbcExtractor());
-
onCompileInternal();
-
}
在执行查询时,执行的实际上是SqlQuery的executeByNamedParam方法,这个方法需要完成的工作包括配置SQL语句,配置数据记录到数据对象的转换的RowMapper,然后使用JdbcTemplate来完成数据的查询,并启动数据记录到Java数据对象的转换,如以下代码所示:
-
publicList<T>executeByNamedParam(Map<String,?>paramMap,Mapcontext)throwsDataAccessException{
-
validateNamedParameters(paramMap);
-
-
ParsedSqlparsedSql=getParsedSql();
-
MapSqlParameterSourceparamSource=newMapSqlParameterSource(paramMap);
-
StringsqlToUse=NamedParameterUtils.substituteNamedParameters(parsedSql,paramSource);
-
-
Object[]params=NamedParameterUtils.buildValueArray(parsedSql,paramSource,getDeclaredParameters());
-
RowMapper<T>rowMapper=newRowMapper(params,context);
-
-
returngetJdbcTemplate().query(newPreparedStatementCreator(sqlToUse,params),rowMapper);
-
}
在Spring对JDBC的操作中,基本上是对JDBC/Hibernate基础上API的封装。这些封装可以直接使用,也可以在IoC容器中配置好了再使用,当结合IoC容器的基础上进行使用的时候,可以看到许多和事务管理相关的处理部分,都是非常值得学习的,在那里,可以看到对数据源的管理 - Hibernate中session的管理,与线程的结合等等。
分享到:
相关推荐
Spring技术内幕:深入解析Spring架构与设计原理 Spring技术内幕 Spring是一个基于Java的开源框架,旨在简化Java企业应用的开发。Spring的目标是提供一个简洁、灵活、可扩展的框架,以帮助开发者快速构建企业级...
《Spring技术内幕——深入解析Spring架构与设计原理》是一本深度剖析Spring框架核心机制与设计理念的专业书籍。本书旨在帮助读者全面理解Spring的内部工作原理,从而更好地应用和优化Spring框架在实际开发中的使用。...
《Spring技术内幕:深入解析Spring架构与设计原理》是一本深度剖析Spring框架核心机制的专著,旨在帮助读者深入理解Spring的内部运作机制及其设计理念。本书涵盖了Spring的两大核心技术——控制反转(IoC)和面向切...
, 深入解析Spring架构原理与设计思想,探究Spring成功的奥秘。, 揭开Spring源代码的神秘面纱,展示系统阅读开源软件源代码的方法和秘诀。, 如果你也在思考下面的问题,本书也许就是你想要的:, 掌握Spring的架构原理...
《深入体验Java_Web开发内幕—核心基础》是一本针对Java Web开发的深度解析书籍,旨在帮助读者全面理解和掌握Java Web开发的核心技术。这本书涵盖了从基础到高级的多个主题,旨在提供一个完整的Java Web开发学习路径...
根据提供的文件信息,我们可以推断出这是一本关于Java Web技术的书籍——《深入分析Java Web技术内幕》修订版,作者是许令波。本书主要针对Java Web开发人员和技术爱好者,旨在深入剖析Java Web技术的核心原理及应用...
高级java笔试题 一个Java 攻城狮的笔记 涉及Java,数据结构,算法,前端,数据库的相关知识...Spring架构与设计原理(第2版) 数据库 MySQL技术内幕:Innodb 存储引擎第二版,姜承尧 Redis 设计与实现 操作系统: Linux 私