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);
}
分享到:
相关推荐
javaEE 实验三 Spring JDBC与事务管理, 一、实验目的 1、掌握Spring JDBC的配置; 2、掌握JdbcTemplae类中增删改查方法的使用; 3、了解Spring事务管理的3个核心接口; 4、了解Spring事务管理的两种方式; 5、掌握...
Spring mvc + Spring + Spring jdbc 整合 demo
Spring JDBC常用Jar包
spring jdbc示例代码,包括增删改查等一系列操作。了解spring jdbc与jdbc、orm框架的区别
spring jdbc相关包版本5.1.3
包含Springjdbc的相关jar包,Spring 框架对JDBC的简单封装,提供了JdbcTemplate对象简化了JDBC的开发。
SpringMVC+SpringJDBC 能正常使用
spring对jdbc的支持的测试jar包下载 spring采用的是4.0版本
Spring mvc、 Spring、 Spring jdbc 整合实例源码
开发工具 spring-jdbc-4.3.6.RELEASE开发工具 spring-jdbc-4.3.6.RELEASE开发工具 spring-jdbc-4.3.6.RELEASE开发工具 spring-jdbc-4.3.6.RELEASE开发工具 spring-jdbc-4.3.6.RELEASE开发工具 spring-jdbc-4.3.6....
spring-jdbc-5.1.3.RELEASE-javadoc.jar 2018-11-27 10:05 1461865 spring-jdbc-5.1.3.RELEASE-javadoc.jar.asc 2018-11-27 10:05 475 spring-jdbc-5.1.3.RELEASE-javadoc.jar.md5 2018-11-27 10:05 32 spring-...
Spring+Spring MVC+Spring JDBC+MySql实现简单登录注册
Spring mvc + Spring + Spring jdbc 整合实例源码
java开发之SpringMVC + Spring + SpringJDBC整合.zip
两个项目,一个项目是基于spring jdbc实现的分布式事务,一个是基于spring hibernate的分布式事务,hibernate项目里的applicationContext2.xml是基于mysql和mssql, applicationContext3.xml基于两个mssql, ...
自己闲着没事整合spring springmvc 数据库连接使用spring-jdbc,下载即可用
Phoenix Hbase springjdbc整合 demo Phoenix最早是saleforce的一个开源项目,后来成为Apache基金的顶级项目。 Phoenix是构建在HBase上的一个SQL层,能让我们用标准的JDBC APIs而不是HBase客户端APIs来创建表,插入...
Spring mvc、 Spring、 Spring jdbc 整合 demo
关于spring JDbc 的一个实例希望有所帮助 谢谢大家
赠送jar包:spring-jdbc-5.3.15.jar; 赠送原API文档:spring-jdbc-5.3.15-javadoc.jar; 赠送源代码:spring-jdbc-5.3.15-sources.jar; 赠送Maven依赖信息文件:spring-jdbc-5.3.15.pom; 包含翻译后的API文档:...