解析Spring JdbcTemplate
来源:互联网 发布:网络教育选什么专业好 编辑:程序博客网 时间:2024/06/16 13:11
解析Spring的JdbcTemplate
下面就以这个例子解析:
JdbcTemplate 类里面的
调用了 JdbcTemplate里的
调用了 JdbcTemplate里的 getColumnMapRowMapper()
现在我们知道了query(sql, getColumnMapRowMapper());里面getColumnMapRowMapper()传的是ColumnMapRowMapper继续说到 ColumnMapRowMapper实现了RowMapper接口
这里面使用了ColumnMapRowMapper作为参数构造了一个RowMapperResultSetExtractor对象作为入参
public Object query(final String sql, final ResultSetExtractor rse) throws DataAccessException { Assert.notNull(sql, "SQL must not be null"); Assert.notNull(rse, "ResultSetExtractor must not be null"); if(logger.isDebugEnabled()) logger.debug("Executing SQL query [" + sql + "]"); class _cls1QueryStatementCallback implements StatementCallback, SqlProvider { public Object doInStatement(Statement stmt) throws SQLException { ResultSet rs = null; Object obj; try { rs = stmt.executeQuery(sql); ResultSet rsToUse = rs; if(nativeJdbcExtractor != null) rsToUse = nativeJdbcExtractor.getNativeResultSet(rs); obj = rse.extractData(rsToUse); } finally { JdbcUtils.closeResultSet(rs); } return obj; } public String getSql() { return sql; } _cls1QueryStatementCallback() { super(); } } return execute(new _cls1QueryStatementCallback()); }
其实不用看里面的内部类 里面方法就一个参数就是 上面方法里面的内部类
他调用了
public Object execute(StatementCallback action) throws DataAccessException { Assert.notNull(action, "Callback object must not be null"); Connection con = DataSourceUtils.getConnection(getDataSource()); Statement stmt = null; try { 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); } return obj; } finally { JdbcUtils.closeStatement(stmt); DataSourceUtils.releaseConnection(con, getDataSource()); } }
里面就是 Object result = action.doInStatement(stmtToUse); 注意这里的stmtToUse是通过工厂方法创建出来的preparestatement
现在我们回过去看 doInStatement()
它里面就是通过preparestatement获取ResultSet然后对ResultSet rsToUse进行处理obj = rse.extractData(rsToUse);这里我们应该知道rse是ColumnMapRowMapper作为参数构造了一个RowMapperResultSetExtractor对象(前面有介绍可以去看看)那么我们来看
没错他又调用了ColumnMapRowMapper的方法我们看一下 rowMapper.mapRow(rs, rowNum++)是什么现在开始打开ColumnMapRowMapper类了
JdbcUtils.lookupColumnName(rsmd, i)是干了什么呢我们来看一下
果然最后返回的是一个List<Map<Sting,object>>的东西也就是list装着 每一列 这个列是用map的方式来储存内容的
阅读全文
0 0
- 解析Spring JdbcTemplate
- spring JdbcTemplate
- spring jdbcTemplate
- Spring JdbcTemplate
- Spring JDBCTemplate
- Spring jdbctemplate
- spring JdbcTemplate
- spring jdbcTemplate
- Spring JDBCTemplate
- spring jdbctemplate
- spring jdbctemplate
- Spring JdbcTemplate
- Spring--JdbcTemplate
- spring jdbcTemplate
- Spring jdbcTemplate
- spring-jdbcTemplate
- Spring JdbcTemplate
- spring jdbcTemplate
- 《机器学习实战》学习笔记-[15]-无监督学习-利用Apriori进行关联分析
- 《剑指offer》牛客网java题解-斐波那契数列
- stm32成长记之定时器时间计算
- JVM中Java类的加载机制
- Redis分区
- 解析Spring JdbcTemplate
- Django学习02---开发环境安装以及hello django编写
- h5和css3基础知识总结
- MySQL语句
- 二叉树的遍历(先、中、后、层序)C实现
- 如何虚拟打印PDF文件(Win7)
- HDU 1166-敌兵布阵(线段树单节点更新)
- 二进制、十进制、十六进制同步转换器
- iOS学习笔记-088.彩票03——设置导航条