JDBC项目实践与源码解析(六)

JDBC项目实践与源码解析——创建会话

本专栏为系列文章,如果想要系统学习JDBC,作者建议从第一篇文章,顺序读完全部文章。
文中项目源码地址:https://github.com/bethanwang/jdbc-study

使用上文返回的Connection对象,创建Statement对象。

//3 创建会话
sta = conn.createStatement();

此处其实是调用的是java.sql.Connection类的子类com.mysql.cj.jdbc.ConnectionImpl中的代码,通过下图可以看到它们之间的继承关系。

在这里插入图片描述

源码解析:

com.mysql.cj.jdbc.ConnectionImpl类:

package com.mysql.cj.jdbc;

public class ConnectionImpl implements JdbcConnection, SessionEventListener, Serializable {
  
  /** The database we're currently using. */
  private String database = null;
  
  private static final int DEFAULT_RESULT_SET_TYPE = ResultSet.TYPE_FORWARD_ONLY;
  
  private static final int DEFAULT_RESULT_SET_CONCURRENCY = ResultSet.CONCUR_READ_ONLY;
  
  private JdbcConnection topProxy = null;
  
  @Override
  public java.sql.Statement createStatement() throws SQLException {
    return createStatement(DEFAULT_RESULT_SET_TYPE, DEFAULT_RESULT_SET_CONCURRENCY);
  }

  @Override
  public java.sql.Statement createStatement(int resultSetType, 
                                          int resultSetConcurrency) throws SQLException {
    StatementImpl stmt = new StatementImpl(getMultiHostSafeProxy(), this.database);
    stmt.setResultSetType(resultSetType);
    stmt.setResultSetConcurrency(resultSetConcurrency);
    return stmt;
  }
  
  @Override
  public JdbcConnection getMultiHostSafeProxy() {
    return this.getProxy();
  }
  
  private JdbcConnection getProxy() {
    return (this.topProxy != null) ? this.topProxy : (JdbcConnection) this;
  }
}

java.sql.ResultSet类:

package java.sql;

public interface ResultSet extends Wrapper, AutoCloseable {
  
  /**
   * The constant indicating the type for a <code>ResultSet</code> object
   * whose cursor may move only forward.
   * @since 1.2
   */
  int TYPE_FORWARD_ONLY = 1003;
  
  /**
   * The constant indicating the concurrency mode for a
   * <code>ResultSet</code> object that may NOT be updated.
   * @since 1.2
   */
  int CONCUR_READ_ONLY = 1007;
  
}

结合源码StatementImpl stmt = new StatementImpl(getMultiHostSafeProxy(), this.database)可以看出,在com.mysql.cj.jdbc.ConnectionImpl类中,创建了一个StatementImpl实例并返回;在创建StatementImpl实例时,同时设置了查询数据库返回的数据集合ResultSet对象的两个特性:TYPE_FORWARD_ONLYCONCUR_READ_ONLY

  • TYPE_FORWARD_ONLY表示返回的集合ResultSet只能顺序正向遍历。

  • CONCUR_READ_ONLY表示返回的集合ResultSet只可以读取其中的数据,不允许修改集合中的数据。

上一篇:JDBC深入讲解——打开数据库连接
下一篇:JDBC深入讲解——执行sql

受作者水平限制,文中难免有不足之处,若读者阅读过程中发现问题,还望及时指正,感谢支持!
​ 作者邮箱:547317812@qq.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Captain-船长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值