解析Spring JdbcTemplate

解析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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值