Mybatis源码解读(一) 数据库连接及连接池

本文是Mybatis源码解读的第一部分,主要探讨Mybatis如何实现数据库连接及连接池。Mybatis是一个持久性框架,通过消除JDBC代码、手动参数设置和结果检索,提供自定义SQL、存储过程和高级映射。文章详细介绍了JDBC操作数据库的流程,重点讲解了Mybatis中的数据源(UnpooledDataSource和PooledDataSource)以及如何通过DataSourceFactory获取数据源。
摘要由CSDN通过智能技术生成

Mybatis学习笔记

Mybaits是什么

官网说明

MyBatis is a first class persistence framework with support for custom SQL, stored procedures and advanced mappings. MyBatis eliminates almost all of the JDBC code and manual setting of parameters and retrieval of results. MyBatis can use simple XML or Annotations for configuration and map primitives, Map interfaces and Java POJOs (Plain Old Java Objects) to database records.

首先它是一个持久性框架,支持自定义SQL、存储过程和高级映射;

特点就是消除了几乎所有的JDBC代码、手动设置参数和检索结果;

可以使用xml或者注解的方式进行配置;

JDBC操作数据库流程

既然mybatis消除了jdbc代码,就证明它底层其实也是根据jdbc来操作数据库的,只不过这些代码不用开发者来维护了

  1. 加载数据库驱动
  2. 建立数据库连接
  3. 创建数据库操作对象
  4. 定义操作数据库的sql
  5. 执行数据库操作
  6. 获取结果集
  7. 关闭对象回收数据库资源

既然mybatis使用了jdbc来操作数据库,那我们就分析一下mybatis是如何一步一步将他们封装的

1.加载数据库驱动

首先是数据源javax.sql.DataSource,Mybatis里也有实现

UnpooledDataSource 和 PooledDataSource

UnpooledDataSource不使用数据库连接池

PooledDataSource使用数据库连接池

在获取他们的时候Mybatis还使用DataSourceFactory工厂方法模式来获取

0700e11809bef4d78c17383abf86b894fbc.jpg

DataSourceFactory

顶级工厂定义了两个方法

package org.apache.ibatis.datasource;

import java.util.Properties;
import javax.sql.DataSource;

public interface DataSourceFactory {
   
  	// 设置数据源的配置
  	// Properties 就是我们平常设置的 username password url等数据
    void setProperties(Properties var1);

  	// 获取数据源
    DataSource getDataSource();
}
UnpooledDataSourceFactory
package org.apache.ibatis.datasource.unpooled;

import java.util.Properties;

import javax.sql.DataSource;

import org.apache.ibatis.datasource.DataSourceException;
import org.apache.ibatis.datasource.DataSourceFactory;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.SystemMetaObject;

/**
 * @author Clinton Begin
 */
public class UnpooledDataSourceFactory implements DataSourceFactory {
   

  private static final String DRIVER_PROPERTY_PREFIX = "driver.";
  private static final int DRIVER_PROPERTY_PREFIX_LENGTH = DRIVER_PROPERTY_PREFIX.length();

  protected DataSource dataSource;

  // 在实例化这个工厂的时候就指定了从这个工厂获取的DataSource是UnpooledDataSource
  public UnpooledDataSourceFactory() {
   
    this.dataSource = new UnpooledDataSource();
  }

  // 设置连接数据
  @Override
  public void setProperties(Properties properties) {
   
    Properties driverProperties = new Properties();
    MetaObject metaDataSource = SystemMetaObject.forObject(dataSource);
    for (Object key : properties.keySet()) {
   
      String propertyName = (String) key;
      if (propertyName.startsWith(DRIVER_PROPERTY_PREFIX)) {
   
        String value = properties.getProperty(propertyName);
        driverProperties.setProperty(propertyName.substring(DRIVER_PROPERTY_PREFIX_LENGTH), value);
      } else if (metaDataSource.hasSetter(propertyName)) {
   
        String value = (String) properties.get(propertyName);
        Object convertedValue = convertValue(metaDataSource, propertyName, value);
        metaDataSource.setValue(propertyName, convertedValue);
      } else {
   
        throw new DataSourceException("Unknown DataSource property: " + propertyName);
      }
    }
    if (driverProperties.size() > 0) {
   
      metaDataSource.setValue("driverProperties", driverProperties);
    }
  }

  // 重要,这里获取的DataSource是成员变量DataSource这是个接口,在使用这个类获取的时候就是UnpooledDataSource
  @Override
  public DataSource getDataSource() {
   
    return dataSource;
  }

  private Object convertValue(MetaObject metaDataSource, String propertyName, String value) {
   
    Object convertedValue = value;
    Class<?> targetType = metaDataSource.getSetterType(propertyName);
    if (targetType == Integer.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值