使用过jdbc的我们都知道spring jdbc ,首先我们看下JdbcTemplate 中的execute
在exceute的实现中看到了数据库进行操作的基本过程,比如需要获得数据库Connection,根据应用对数据库操作需要创建数据库的statement,对数据库操作进行回调,处理数据库异常
最后把数据库的连接关闭,等等,这里展示了使用JDBC完成数据库操作的完整过程,只是在spring中,对这些较为普通的JDBC使用,JdbcTemplate进行了一个封装而已。
public void execute(final String sql)
throws DataAccessException
{
class _cls1ExecuteStatementCallback
implements StatementCallback, SqlProvider
{
public Object doInStatement(Statement stmt)
throws SQLException
{
stmt.execute(sql);
return null;
}
public String getSql()
{
return sql;
}
final JdbcTemplate this$0;
private final String val$sql;
_cls1ExecuteStatementCallback()
{
this$0 = JdbcTemplate.this;
sql = s;
super();
}
}
execute(((StatementCallback) (new _cls1ExecuteStatementCallback())));
}
public Object execute(StatementCallback action)
throws DataAccessException
{
Connection con;
Statement stmt;
Assert.notNull(action, "Callback object must not be null");
con = DataSourceUtils.getConnection(getDataSource());
stmt = null;
Object obj;
try
{
Connection conToUse = con;
if(nativeJdbcExtractor != null && nativeJdbcExtractor.isNativeConnectionNecessaryForNativeStatements())
conToUse = nativeJdbcExtractor.getNativeConnection(con);
stmt = conToUse.createStatement();
applyStatementSettings(stmt);
Statement stmtToUse = stmt;
if(nativeJdbcExtractor != null)
stmtToUse = nativeJdbcExtractor.getNativeStatement(stmt);
//通过回调函数等到结果
Object result = action.doInStatement(stmtToUse);
handleWarnings(stmt);
obj = result;
}
catch(SQLException ex)
{
JdbcUtils.closeStatement(stmt);
stmt = null;
DataSourceUtils.releaseConnection(con, getDataSource());
con = null;
throw getExceptionTranslator().translate("StatementCallback", getSql(action), ex);
}
JdbcUtils.closeStatement(stmt);
DataSourceUtils.releaseConnection(con, getDataSource());
return obj;
Exception exception;
exception;
JdbcUtils.closeStatement(stmt);
DataSourceUtils.releaseConnection(con, getDataSource());
throw exception;
}
jdbc的基本原理其中的execute方法,我们在看下jdbcTemplate中的query方法
public Object query(PreparedStatementCreator psc, final PreparedStatementSetter pss, final ResultSetExtractor rse)
throws DataAccessException
{
return execute(psc, new PreparedStatementCallback() {
public Object doInPreparedStatement(PreparedStatement ps)
throws SQLException
{
ResultSet rs = null;
Object obj;
if(pss != null)
pss.setValues(ps);
rs = ps.executeQuery();
ResultSet rsToUse = rs;
if(nativeJdbcExtractor != null)
rsToUse = nativeJdbcExtractor.getNativeResultSet(rs);
//采用了接口,进行回调
obj = rse.extractData(rsToUse);
JdbcUtils.closeResultSet(rs);
if(pss instanceof ParameterDisposer)
((ParameterDisposer)pss).cleanupParameters();
return obj;
Exception exception;
exception;
JdbcUtils.closeResultSet(rs);
if(pss instanceof ParameterDisposer)
((ParameterDisposer)pss).cleanupParameters();
throw exception;
}
final JdbcTemplate this$0;
private final PreparedStatementSetter val$pss;
private final ResultSetExtractor val$rse;
{
this$0 = JdbcTemplate.this;
pss = preparedstatementsetter;
rse = resultsetextractor;
super();
}
}
);
}
在对ResultSet进行回调处理的接口有三个,分别为RowMapper,ResultSetExtrator,RowHandlerCallBack接口
RowMapper接口中包含了一个mapRow方法,需要自己实现同通过转换从而得到自己想要的结果。
// 对resultset中封装一个接口为rowMapping
List<VersionInfo> list = jdbcTemplate.query(sql, new
RowMapper<VersionInfo>()
{
@Override
public VersionInfo mapRow(ResultSet rs, int i) throws SQLException
{
VersionInfo versionInfo = new VersionInfo();
versionInfo.setId(rs.getInt("id"));
versionInfo.setVersionName(rs.getString("version_name"));
versionInfo.setUploadTime(rs.getLong("upload_time"));
versionInfo.setActiveState(rs.getString("active_state"));
versionInfo.setVersionType(rs.getString("version_type"));
versionInfo.setFilePath(rs.getString("file_path"));
versionInfo.setReMark(rs.getString("remark"));
versionInfo.setVersionNumber(rs.getString("version_number"));
return versionInfo;
}
});
ResultSetExtrator接口中包含了extractData方法,该方法需要自己遍历Resultset才能得到想要的结果
List<VersionInfo> list = (List<VersionInfo>) jdbcTemplate.query(sql,
new ResultSetExtractor<List<VersionInfo>>()
{
@Override
public List<VersionInfo> extractData(ResultSet rs) throws
SQLException, DataAccessException
{
VersionInfo versionInfo = null;
List<VersionInfo> list = new ArrayList<VersionInfo>();
while (rs.next())
{
versionInfo = new VersionInfo();
versionInfo.setId(rs.getInt("id"));
versionInfo.setVersion_name(rs.getString("version_name"));
versionInfo.setUpload_time(rs.getLong("upload_time"));
versionInfo.setActive_state(rs.getString("active_state"));
versionInfo.setVersion_type(rs.getString("version_type"));
versionInfo.setFile_path(rs.getString("file_path"));
versionInfo.setRemark(rs.getString("remark"));
versionInfo.setVersion_number(rs.getString("version_number"));
list.add(versionInfo);
}
return list;
}
});
RowCallbackHandler接口中包含了processRow方法,该方法中没有返回值,但是会自动的循环ResultSet结果集
final List<VersionInfo> list = new ArrayList<VersionInfo>();
jdbcTemplate.query(sql, new RowCallbackHandler()
{
// 会自动循环ResultSet
@Override
public void processRow(ResultSet rs) throws SQLException
{
VersionInfo versionInfo = new VersionInfo();
versionInfo.setId(rs.getInt("id"));
versionInfo.setVersion_name(rs.getString("version_name"));
versionInfo.setUpload_time(rs.getLong("upload_time"));
versionInfo.setActive_state(rs.getString("active_state"));
versionInfo.setVersion_type(rs.getString("version_type"));
versionInfo.setFile_path(rs.getString("file_path"));
versionInfo.setRemark(rs.getString("remark"));
versionInfo.setVersion_number(rs.getString("version_number"));
list.add(versionInfo);
}
});
可能大家会觉得奇怪,在查询方法中只传入的是ResultSetExtractor接口,而RowMapper和RowCallbackHandler接口与ResultSetExtractor没有相互的集成关系,那么jdbcTemlate是怎样做转换的
首先看下RowCallbackHandler接口
public void query(String sql, PreparedStatementSetter pss, RowCallbackHandler rch)
throws DataAccessException
{
query(sql, pss, ((ResultSetExtractor) (new RowCallbackHandlerResultSetExtractor(rch))));
}
//传入的是RowCallbackHandler接口有一个RowCallbackHandlerResultSetExtractor类进行了转换该类实现了ResultSetExtractor接口
private static class RowCallbackHandlerResultSetExtractor
implements ResultSetExtractor
{
public Object extractData(ResultSet rs)
throws SQLException
{
for(; rs.next(); rch.processRow(rs));
return null;
}
private final RowCallbackHandler rch;
public RowCallbackHandlerResultSetExtractor(RowCallbackHandler rch)
{
this.rch = rch;
}
}
同理RowMapper
public class RowMapperResultSetExtractor
implements ResultSetExtractor
{
public RowMapperResultSetExtractor(RowMapper rowMapper)
{
this(rowMapper, 0);
}
public RowMapperResultSetExtractor(RowMapper rowMapper, int rowsExpected)
{
Assert.notNull(rowMapper, "RowMapper is required");
this.rowMapper = rowMapper;
this.rowsExpected = rowsExpected;
}
public List extractData(ResultSet rs)
throws SQLException
{
List results = rowsExpected <= 0 ? ((List) (new ArrayList())) : ((List) (new ArrayList(rowsExpected)));
int rowNum = 0;
for(; rs.next(); results.add(rowMapper.mapRow(rs, rowNum++)));
return results;
}
public volatile Object extractData(ResultSet resultset)
throws SQLException, DataAccessException
{
return extractData(resultset);
}
private final RowMapper rowMapper;
private final int rowsExpected;
}
分享到:
相关推荐
Spring JDBC是Spring框架的一部分,它提供了一种更高级的方式来处理传统的Java JDBC(Java Database Connectivity),以简化数据库操作。本示例代码将展示如何在Spring环境中使用JDBC进行数据的增删改查操作,并对比...
在IT行业中,Spring框架是Java开发中的核心工具之一,它为构建企业级应用程序提供了全面的解决方案。本话题主要关注Spring的两个重要模块:事务管理和Spring JDBC。这些知识点对于任何使用Spring进行后端开发的...
总之,SpringMVC、Spring和SpringJDBC的整合为Java Web开发提供了一个强大的解决方案,它们的相互配合可以实现灵活的控制流、高效的数据库访问以及整洁的代码结构。理解并熟练掌握这些技术,对于提升Java开发能力...
Spring JDBC是Spring框架的一个核心模块,它为Java开发者提供了便捷的方式来操作数据库。Spring JDBC通过抽象出数据库连接管理、事务处理以及结果集处理等繁琐工作,使得开发者可以专注于SQL语句和业务逻辑,而不必...
集成Spring Data JDBC可以减少代码量,提高可维护性,并且由于Spring的其他模块(如Spring MVC和Spring Security)与之良好集成,可以构建更复杂的Web应用。例如,Spring MVC提供了模型-视图-控制器架构,使业务逻辑...
Spring JDBC的事务管理也是其关键特性之一。在源码中,我们可以看到TransactionManager接口及其实现,如DataSourceTransactionManager,它是Spring对数据库事务进行控制的核心。当开启事务时,Spring会通过保存点或...
Spring框架提供了多种方式来处理数据库操作,其中Spring JDBC模块是轻量级且功能强大的解决方案之一。本文将详细介绍如何基于Spring JDBC模块创建一个通用的数据访问对象(BaseDAO)类,实现简单的对象关系映射(ORM)...
在Java世界里,Spring框架是应用最广泛的轻量级开源框架之一,它为开发者提供了许多便利,包括数据库操作。在本资源中,我们主要探讨的是Spring JDBC模块,它简化了Java Database Connectivity (JDBC)的使用,使得在...
1. **依赖注入**:Spring的核心特性之一是依赖注入(DI),它允许我们通过配置文件或注解来管理对象之间的依赖关系。在使用JdbcTemplate时,我们可以声明一个JdbcTemplate的bean,并在需要的地方通过@Autowired注解...
在Spring框架中,事务管理是核心功能之一,它确保了数据的一致性和完整性。本篇文章将深入探讨Spring JDBC如何通过注解来实现事务管理。 1. **Spring JDBC简介** Spring JDBC提供了一个JdbcTemplate类,它封装了...
Spring提供了两种使用JDBC API的最佳实践,一种是以JdbcTemplate为核心的基于Template的JDBC的使用方式,另一种则是在JdbcTemplate基础之上的构建的基于操作对象的JDBC的使用方式。
首先,Spring框架的核心之一是依赖注入(Dependency Injection,DI),它允许开发者通过声明式的方式管理对象及其依赖关系,从而降低代码的耦合度。在"spring事物配置"中,Spring提供了声明式事务管理,这使得开发者...
在Spring框架中,Spring JDBC是核心模块之一,它提供了一种简单且强大的方式来处理数据库交互。本篇文章将深入解析Spring JDBC的实现,特别是JdbcTemplate类。JdbcTemplate是Spring为简化数据库操作而设计的一个模板...
SpringJDBC作为Spring框架的一部分,是对Java Database Connectivity (JDBC) API的轻量级封装,旨在简化数据库操作,同时保持了JDBC的灵活性。 SpringJDBC提供了一个模板类`JdbcTemplate`,它消除了大量的样板代码...
Spring框架是 Java 企业级应用开发的标准框架之一,它提供了强大的依赖注入和AOP功能,使得开发者可以更方便地进行企业级应用开发。在实际开发中,我们常常需要将Spring与JDBC集成,以便于使用Spring来管理数据库...
首先,`JdbcTemplate`的核心功能之一是执行SQL查询。你可以使用`query(String sql, RowMapper<T> rowMapper)`方法来执行一个简单的查询,并将结果映射到自定义的对象上。`RowMapper`接口需要你自己实现,用于将结果...
标题中的"spring+springmvc+springjdbc+redis"是一个典型的Java Web开发技术组合,涵盖了Spring框架的核心组件,Spring MVC作为Web层的处理框架,Spring JDBC用于数据库操作,以及Redis作为高速缓存系统。...
Spring提供了两种使用JDBC API的最佳实践,一种是以JdbcTemplate为核心的基于Template的JDBC的使用方式,另一种则是在JdbcTemplate基础之上的构建的基于操作对象的JDBC的使用方式。
Spring是Java开发中最广泛使用的轻量级框架之一,它简化了创建和管理Java应用,特别是企业级应用。在Web服务场景中,Spring提供了强大的支持,包括Spring MVC(Model-View-Controller)用于构建Web应用,以及Spring ...
`JdbcTemplate`是Spring JDBC中最核心的类之一,它提供了一系列的方法来执行各种数据库操作,包括查询、更新、插入和删除等。通过使用`JdbcTemplate`,开发者可以避免直接使用`PreparedStatement`和`ResultSet`,这...