前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java - JdbcTemplate底层调用逻辑

Java - JdbcTemplate底层调用逻辑

作者头像
夹胡碰
发布2021-01-13 14:34:11
5010
发布2021-01-13 14:34:11
举报
文章被收录于专栏:程序猿~程序猿~

版本: spring-boot 2.0.5.RELEASE

代码语言:javascript
复制
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.5.RELEASE</version>
</parent>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.17</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

对应的spring-jdbc版本5.0.9.RELEASE

代码语言:javascript
复制
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-jdbc</artifactId>
  <version>5.0.9.RELEASE</version>
  <scope>compile</scope>
</dependency>

application.yml

代码语言:javascript
复制
spring:
  datasource:
    username: root
    password: root
    url: jdbc:mysql://localhost:3306/datamiddle?characterEncoding=utf8&useSSL=true&rewriteBatchedStatements=true
    driver-class-name: com.mysql.jdbc.Driver

1. JdbcTemplate使用

代码语言:javascript
复制
@Autowired
private JdbcTemplate jdbcTemplate;

@Transactional
public String test(){
    return jdbcTemplate.queryForList("select * from user where id = 1").toString();
}

2. JdbcTemplate原理

Spring Boot 启动,通过配置文件application.yml,加载DataSource(HikariDataSource),之后加载JdbcTemplate

注意:

  1. Spring Boot 2.X使用的是HikariDataSource作为数据库连接池,1.5使用的是tomcat jdbc pool
  2. DataSource可直接作为jdbc操作数据库,而JdbcTemplate是进一步的封装,省去了查询封装,关闭连接等操作。
代码语言:javascript
复制
public class JdbcTemplate extends JdbcAccessor implements JdbcOperations {

    public JdbcTemplate() {
    }
    // 注入HikariDataSource
    public JdbcTemplate(DataSource dataSource) {
        this.setDataSource(dataSource);
        this.afterPropertiesSet();
    }
    ...
}

3. JdbcTemplate查询操作原理解析

jdbcTemplate.queryForList方法为例,通过重点代码查看内部执行原理

代码语言:javascript
复制
public <T> T query(final String sql, final ResultSetExtractor<T> rse) throws DataAccessException {
    Assert.notNull(sql, "SQL must not be null");
    Assert.notNull(rse, "ResultSetExtractor must not be null");
    if (this.logger.isDebugEnabled()) {
        this.logger.debug("Executing SQL query [" + sql + "]");
    }

    class QueryStatementCallback implements StatementCallback<T>, SqlProvider {
        QueryStatementCallback() {
        }

        @Nullable
        public T doInStatement(Statement stmt) throws SQLException {
            ResultSet rs = null;

            Object var3;
            try {
                rs = stmt.executeQuery(sql);
                var3 = rse.extractData(rs);
            } finally {
                JdbcUtils.closeResultSet(rs);
            }

            return var3;
        }

        public String getSql() {
            return sql;
        }
    }

    return this.execute((StatementCallback)(new QueryStatementCallback()));
}
  • 使用DataSource原生执行sql查询
代码语言:javascript
复制
public <T> T execute(StatementCallback<T> action) throws DataAccessException {
    Assert.notNull(action, "Callback object must not be null");
    Connection con = DataSourceUtils.getConnection(this.obtainDataSource()); // 通过DataSource获取Connection
    Statement stmt = null;

    Object var11;
    try {
        stmt = con.createStatement(); // 获取Statement
        this.applyStatementSettings(stmt);
        T result = action.doInStatement(stmt); // 执行QueryStatementCallback的executeQuery
        this.handleWarnings(stmt);
        var11 = result;
    } catch (SQLException var9) {
        String sql = getSql(action);
        JdbcUtils.closeStatement(stmt);
        stmt = null;
        DataSourceUtils.releaseConnection(con, this.getDataSource());
        con = null;
        throw this.translateException("StatementCallback", sql, var9);
    } finally {
        JdbcUtils.closeStatement(stmt); // 关闭连接
        DataSourceUtils.releaseConnection(con, this.getDataSource()); // 关闭连接
    }

    return var11; // 返回查询结果
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. JdbcTemplate使用
  • 2. JdbcTemplate原理
  • 3. JdbcTemplate查询操作原理解析
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档