Mybatis 源码学习(十六) —— datasource

Mybatis源码:datasource包及数据库连接解析

Mybatis 系列文章导航

终于是来到了配置解析包中的最后一个包了,虽然时间跨度比较长,但是坚持下去,还是有很大收获的。

MyBatis 作为 ORM 框架,向上连接着 Java 业务层,向下连接着数据库。而 datasource 包就是用来管理数据库连接的包,是 MyBatis 和数据库交互时涉及的最为主要的包。

java.sql 和 javax.sql 包

Java 提供的与数据库操作相关的包住要有两个,分别是 java.sql 包和 javax.sql 包。

java.sql

java.sql 通常被称为 JDBC 核心 API 包,它为 Java 提供了访问数据源中数据的基本功能。基于该包能实现激昂 SQL 语句传递给数据库、从数据库中以表格的形式读写数据等功能。

java.sql 提供了一个 Driver 接口作为数据库厂商驱动的接口。不同的数据库厂商只需要实现这个接口,并通过 DriverManager 进行注册即可。

在这里插入图片描述

除了这些,java.sql 还为数据库连接、SQL 语句、结果集等提供了众多的类,如表示数据库连接的 Connection 类、表示数据库操作语句的 Statement 类、表示数据库操作结果的 ResultSet 类等。

基于 java.sql 包,Java 程序就能完整的实现数据库操作流程。

javax.sql

既然 java.sql 已经能够能完整的实现数据库操作流程,那么为什么还有 javax.sql 呢?javax.sql 通常被称为 JDBC 扩展 API 包,它扩展了 JDBC 核心 API 包的功能。

例如,在 javax.sql 中提供了 DataSource,通过它可以获取面向数据源的 Connection 对象,与 java.sql 中直接获取 DriverManager 建立连接的方法相对更为灵活,虽然底层也是通过 DriverManager 获取的 Connection 对象。除此之外,javax.sql 还提供了连接池、语句池、分布式事务等方面的诸多特性。

DriverManager

DriverManager 是 JDBC 驱动程序管理器,可以用来管理 JDBC 驱动程序。

核心方法如下:

void registerDriver:向 DriverManager 中注册给定的驱动程序

void deregisterDriver:从 DriverManager 中删除给定的驱动程序

Driver getDriver:查找能匹配给定 URL 路径的驱动程序。

Enumeration getDrivers:获取当前调用者可以访问的所有已加载的 JDBC 驱动程序

Connection getConnection:建立到给定数据库的连接

注:这些方法都是静态的,所以不需要创建对象就能使用。

DataSource

DataSource 是 javax.sql 的一个接口,用来代表数据库厂商的数据源,可以得到数据库的连接。

核心方法:

Connection getConnection():从当前的数据源中建立一个连接

Connection getConnection(String, String):从当前的数据源中建立一个连接,输入的参数为数据源的用户名和密码

javax.sql 中的 DataSource 仅仅只是一个接口,不同的数据库可以为其提供多种实现。常见的实现有以下几种。

  • 基本实现:生成基本的到数据库的连接对象Connection。
  • 连接池实现:生成的 Connection 对象能够自动加到连接池中。
  • 分布式事务实现:生成的 Connection 对象能够参与分布式事务。

正因为 DataSource 接口可以有多种实现,与直接使用 DriverManager 获得连接对象 Connection 的方式相对更为灵活。

Connection

Connection 接口位于 java.sql 中,它代表对某个数据库连接。基于这个连接,可以完成 SQL 语句的执行和结果的获取等工作。

Statement createStatement():创建一个Statement对象,通过它能将 SQL语句发送到数据库。

CallableStatement prepareCall():创建一个CallableStatement对象,通过它能调用存储过程。

PreparedStatement prepareStatement():创建一个 PreparedStatement对象,通过它能将参数化的 SQL语句发送到数据库。

String nativeSQL:将输入的 SQL语句转换成本地可用的 SQL语句。

void commit:提交当前事务。

void rollback:回滚当前事务。

void close:关闭当前的 Connection对象。

boolean isClosed:查询当前 Connection对象是否关闭。

boolean isValid:查询当前 Connection是否有效。

void setAutoCommit:根据输入参数设定当前Connection对象的自动提交模式。

int getTransactionIsolation:获取当前Connection对象的事务隔离级别。

void setTransactionIsolation:设定当前Connection对象的事务隔离级别。

DatabaseMetaData getMetaData:获取当前Connection 对象所连接的数据库的所有元数据信息。

Connection 存在事务管理的方法,如 commit、rollback 等。调用这些事务管理方法可以控制数据库完成相应的事务操作。

Statement

Statement 能用来执行 SQL 语句并返回结果。通常返回的都是 ResultSet。

核心方法:

void addBatch:将给定的 SQL 命令批量添加到 Statement 对象的 SQL 命令执行列表。

void clearBatch:清空 Statement 对象的 SQL 命令列表。

int executeBatch:让数据库批量执行多个命令。如果执行成功,则返回一个数组。数组中的每个元素都代表了某个命令影响数据库记录的数目。

boolean execute:执行一条 SQL 语句。

ResultSet executeQuery:执行一条 SQL 语句,并返回结果集 ResultSet 对象。

int executeUpdate:执行给定 SQL 语句,该语句可能为 INSERT、UPDATE、DELETE或 DDL 语句。

ResultSet getResultSet:获取当前结果集 ResultSet 对象。

ResultSet getGeneratedKeys:获取当前操作自增生成的主键。

boolean isClosed:获取是否已关闭此 Statement 对象。

void close:关闭此 Statement 对象,释放相关资源。

Connection getConnection:获取此 Statement 对象的 Connection 对象。

数据源工厂

datasource 采用的是工厂模式。DataSourceFactory 的是所有工厂的接口,DateSource 作为工厂产品的接口。类图如下:

在这里插入图片描述

既然是工厂模式,那么就需要一个具体的工厂实现类,而选用哪个工厂实现类是从配置文件中获取到的。在 XMLConfigBuilder 会解析这个配置项。

  private DataSourceFactory dataSourceElement(XNode context) throws Exception {
   
   
    if (context != null) {
   
   
      // 这里会得到数据源类型,例如:POOLED、UNPOOLED、JNDI
      String type = context.getStringAttribute("type");
      Properties props = context.getChildrenAsProperties();
      // 根据数据源类型得到具体的数据源工厂实现类
      DataSourceFactory factory = (DataSourceFactory) resolveClass(type).getDeclaredConstructor().newInstance();
      factory.setProperties(props);
      return factory
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值