spring jdbcTemplate 提供了很多查询和更新功能,但是如果我们需要高层次的抽象spring还有个RDBMS其中包括了SqlQuery,MappingSqlQuery,SqlUpdate等
我们首先来看下一个简单的查询简单例子
public class BokkQuery extends MappingSqlQuery<VersionInfo>
{
public BokkQuery(DataSource dataSource)
{
super(dataSource, "select * from t_soft_version t where t.id=?");
//设置参数
super.declareParameter(new SqlParameter("id", Types.INTEGER));
compile();
}
@Override
protected VersionInfo mapRow(ResultSet rs, int i) throws SQLException
{
VersionInfo versionInfo = new VersionInfo();
versionInfo.setId(rs.getInt("id"));
versionInfo.setVersion_name(rs.getString("version_name"));
return versionInfo;
}
}
public static void main(String[] args)
{
DataSource dataSource = (DataSource) cxf.getBean("dataSource");
BokkTest test = new BokkTest();
test.listbook(dataSource);
}
public void listbook(DataSource dataSource)
{
BokkQuery bokkQuery = new BokkQuery(dataSource);
List<VersionInfo> list = bokkQuery.execute(new Object[]{11111});
for (VersionInfo versionInfo : list)
{
System.out.println("versionname:" + versionInfo.getVersion_name());
}
}
首先我们看下RdbmsOperation下其类的结构图:
下面我们从declareParameter入手分下一下该功能是如何实现的,其具体的实现在MappingQuery的基类RdbmsOperation的源码可以看到
RdbmsOperation源码如下:
public abstract class RdbmsOperation
implements InitializingBean
{
public void declareParameter(SqlParameter param)
throws InvalidDataAccessApiUsageException
{
//声明参数只能在compile之前,否则声明是无效的,并会抛出异常
if(isCompiled())
{
throw new InvalidDataAccessApiUsageException("Cannot add parameters once the query is compiled");
} else
{
//把参数添加到一个LinkedList集合的属性中,供compile方法使用
declaredParameters.add(param);
return;
}
}
//我们看到了compile
public final void compile()
throws InvalidDataAccessApiUsageException
{
if(!isCompiled())
{
if(getSql() == null)
throw new InvalidDataAccessApiUsageException("Property 'sql' is required");
try
{
//调用了afterPropertesSet方法
jdbcTemplate.afterPropertiesSet();
}
catch(IllegalArgumentException ex)
{
throw new InvalidDataAccessApiUsageException(ex.getMessage());
}
//调用compileInternal完成具体的compile过程,并设置compiled标志位
compileInternal();
compiled = true;
if(logger.isDebugEnabled())
logger.debug((new StringBuilder("RdbmsOperation with SQL [")).append(getSql()).append("] compiled").toString());
}
}
public void afterPropertiesSet()
{
compile();
}
}
compileInternal方法在sqlOperation里完成,在compileInternal中生成一个PreparedStatementCreatorFactory作为Statement的工厂,这个工厂负责生成参数的Statement,其源码如下:
protected final void compileInternal()
{
preparedStatementFactory = new PreparedStatementCreatorFactory(getSql(), getDeclaredParameters());
preparedStatementFactory.setResultSetType(getResultSetType());
preparedStatementFactory.setUpdatableResults(isUpdatableResults());
preparedStatementFactory.setReturnGeneratedKeys(isReturnGeneratedKeys());
if(getGeneratedKeysColumnNames() != null)
preparedStatementFactory.setGeneratedKeysColumnNames(getGeneratedKeysColumnNames());
preparedStatementFactory.setNativeJdbcExtractor(getJdbcTemplate().getNativeJdbcExtractor());
onCompileInternal();
}
在完成compile之后,对MappingSqlQuery的准备工作就基本完成,在执行查询时,实际执行的是SqlQuery的executeByNameParam方法,这个方法需要完成的工作包括配置sql语句,配置数据记录对象转换RowMapper,然后使用JdbcTemplate来完成数据的查询,并启动数据记录到java数据对象的转换,其源码如下:
public List executeByNamedParam(Map paramMap, Map context)
throws DataAccessException
{
validateNamedParameters(paramMap);
//需要执行sql语句
org.springframework.jdbc.core.namedparam.ParsedSql parsedSql = getParsedSql();
MapSqlParameterSource paramSource = new MapSqlParameterSource(paramMap);
String sqlToUse = NamedParameterUtils.substituteNamedParameters(parsedSql, paramSource);
//配置好SQL语句需要的Paramters即rowMapper,这个Rowmapper完成数据记录对象的转换
Object params[] = NamedParameterUtils.buildValueArray(parsedSql, paramSource, getDeclaredParameters());
RowMapper rowMapper = new RowMapper(params, context);
//转换成Rowmapper调用的是jdbcTemplate中的模板方法
return getJdbcTemplate().query(newPreparedStatementCreator(sqlToUse, params), rowMapper);
}
分享到:
相关推荐
Spring JDBC是Spring框架的一个重要模块,它简化了Java数据库连接(JDBC)的使用,提供了更高级别的抽象,使得数据库操作更加简洁、易管理和模块化。这个"spring_JDBC整合包"显然包含了进行Spring JDBC开发所需的...
javaEE 实验三 Spring JDBC与事务管理, 一、实验目的 1、掌握Spring JDBC的配置; 2、掌握JdbcTemplae类中增删改查方法的使用; 3、了解Spring事务管理的3个核心接口; 4、了解Spring事务管理的两种方式; 5、掌握...
2. **spring-tx-3.2.3.RELEASE.jar**: Spring的事务管理模块,提供了编程式和声明式事务管理支持。在Spring JDBC中,事务管理是关键功能,它确保了数据库操作的原子性、一致性、隔离性和持久性(ACID特性)。通过这...
2. spring-beans-5.1.10.RELEASE.jar:包含了Bean工厂和Bean定义的解析,是Spring IoC容器的基础。 3. spring-jdbc-5.1.10.RELEASE.jar:Spring JDBC模块,包含JdbcTemplate和其他数据库相关工具。 4. spring-tx-...
2. **SqlSessionFactoryBean**和**DataSource**:在Spring配置文件中,我们需要设置DataSource来管理数据库连接,SqlSessionFactoryBean用于创建SqlSession,它是MyBatis的基础,但在Spring JDBC中我们通常直接使用...
通过这个SpringJDBC.rar的案例,初学者可以学习到如何配置DataSource,如何创建JdbcTemplate实例,以及如何编写和执行SQL语句。同时,实践中还可以了解到如何将Spring JDBC整合到Spring Boot项目中,以及如何处理...
这个`springjdbc.zip`压缩包很可能包含了示例代码和配置文件,用于演示如何使用Spring JDBC来执行基本的数据库操作,如增、删、改、查。 1. **Spring JDBC模块**:Spring JDBC模块主要由`org.springframework.jdbc`...
本文将深入探讨Spring对JDBC(Java Database Connectivity)的支持,以及如何在实际项目中使用这些功能。 首先,Spring JDBC的核心是`org.springframework.jdbc`包,它提供了一套高级抽象,用于简化数据库操作。在...
《Spring JDBC:构建高效数据访问层》 Spring JDBC是Spring框架的一个重要组成部分,它提供了一种简化传统JDBC编程的抽象层,使得开发者能够更轻松、更安全地处理数据库交互。"spring-jdbc jar包"包含了Spring框架...
2. 配置Spring:创建Spring的配置文件,如`applicationContext.xml`,配置Bean、数据源和事务管理器等。 3. 配置Spring MVC:创建Spring MVC的配置文件,如`servlet-context.xml`,配置DispatcherServlet、视图解析...
2. **spring-context-5.1.3.RELEASE.jar**:扩展了`spring-core`,提供了环境感知能力,如bean的生命周期管理,事件发布,国际化,资源访问,以及与第三方框架的集成,如数据访问和事务管理。 3. **spring-beans-...
SpringMVC和SpringJDBC是Java开发中两个重要的框架,它们分别是Spring框架在Web层和数据访问层的应用。本文将详细介绍这两个组件的核心概念、工作原理以及如何整合使用,旨在帮助开发者更好地理解和应用。 **...
2. **异常处理**:Spring JDBC将数据库抛出的原生异常转换为更有意义的`DataAccessException`子类,使得异常处理更加简单。例如,`EmptyResultDataAccessException`用于表示预期查询结果不存在,而`...
Spring JDBC是Spring框架中的一个核心模块,主要用于简化Java数据库编程。在本文中,我们将深入探讨Spring JDBC的应用实例,了解如何利用它来实现高效且灵活的数据访问。首先,我们需要理解Spring JDBC是如何通过...
Spring JDBC是Spring框架的一个核心模块,它为Java数据库连接(JDBC)提供了一种抽象层,使得开发者可以更轻松地处理数据库操作。Spring JDBC的主要目标是简化数据访问,减少直接使用JDBC时的繁琐工作,如手动管理...
2. spring-jdbc.jar:这个库提供了Spring对JDBC的支持,包括DataSource的管理、事务处理、JdbcTemplate等工具类。 3. spring-tx.jar:事务管理模块,支持声明式和编程式事务管理,对于数据库操作的事务控制至关重要...
这个“SpringJDBC.rar”压缩包文件可能包含了关于如何在Spring框架中集成和使用JDBC的相关示例和教程。下面将详细解释Spring JDBC的核心概念、功能以及使用方法。 首先,Spring JDBC的核心目标是简化传统的JDBC编程...
2. **Spring JDBC**:Spring JDBC抽象了JDBC,提供了一个模板类JdbcTemplate,用于执行SQL查询和更新。理解如何配置DataSource,以及如何使用JdbcTemplate进行增删改查操作是关键。 3. **用户登录**:登录功能通常...
《Java开发中的SpringMVC + Spring + SpringJDBC整合详解》 在Java开发领域,Spring框架因其强大的功能和灵活性而备受推崇。SpringMVC、Spring和SpringJDBC是Spring框架中的核心组件,它们的整合使用可以构建出高效...
在IT行业中,Spring框架是Java开发中的核心工具之一,它为构建企业级应用程序提供了全面的解决方案。本话题主要关注Spring的两个重要模块:事务管理和Spring JDBC。这些知识点对于任何使用Spring进行后端开发的...