美文网首页
mybatis核心组件

mybatis核心组件

作者: 传葱 | 来源:发表于2019-03-27 22:25 被阅读0次

jdbc规范:

  • Connection 代表和数据库之间的连接
  • Statement 执行sql
  • ResultSet 返回数据结果

Connection需要不同的数据库提供商驱动来生成

数据库驱动

Driver: Class.forName(“com.sql.jdbc.Driver”) 生成Connection
DriverManager来管理不同的Driver 在rt.jar java.sql里面提供

@CallerSensitive
    public static Connection getConnection(String url,
        String user, String password) throws SQLException {
        java.util.Properties info = new java.util.Properties();

        if (user != null) {
            info.put("user", user);
        }
        if (password != null) {
            info.put("password", password);
        }

        return (getConnection(url, info, Reflection.getCallerClass()));
    }

数据源

  • DataSource 数据源包括连接池和和连接池管理两部分。和Spring的BeanFactory相似,BeanFactory包括对象的创建和对象生命周期的管理两部分
  • 系统初始化的时候创建连接对象,连接池在内存中,使用的时候在连接池中动态获取连接对象。
//  Worker method called by the public getConnection() methods.
    private static Connection getConnection(
        String url, java.util.Properties info, Class<?> caller) throws SQLException {
        /*
         * When callerCl is null, we should check the application's
         * (which is invoking this class indirectly)
         * classloader, so that the JDBC driver class outside rt.jar
         * can be loaded from here.
         */
        ClassLoader callerCL = caller != null ? caller.getClassLoader() : null;
        synchronized(DriverManager.class) {
            // synchronize loading of the correct classloader.
            if (callerCL == null) {
                callerCL = Thread.currentThread().getContextClassLoader();
            }
        }

        if(url == null) {
            throw new SQLException("The url cannot be null", "08001");
        }

        println("DriverManager.getConnection(\"" + url + "\")");

        // Walk through the loaded registeredDrivers attempting to make a connection.
        // Remember the first exception that gets raised so we can reraise it.
        SQLException reason = null;

        for(DriverInfo aDriver : registeredDrivers) {
            // If the caller does not have permission to load the driver then
            // skip it.
            if(isDriverAllowed(aDriver.driver, callerCL)) {
                try {
                    println("    trying " + aDriver.driver.getClass().getName());
                    Connection con = aDriver.driver.connect(url, info);
                    if (con != null) {
                        // Success!
                        println("getConnection returning " + aDriver.driver.getClass().getName());
                        return (con);
                    }
                } catch (SQLException ex) {
                    if (reason == null) {
                        reason = ex;
                    }
                }

            } else {
                println("    skipping: " + aDriver.getClass().getName());
            }

        }

        // if we got here nobody could connect.
        if (reason != null)    {
            println("getConnection failed: " + reason);
            throw reason;
        }

        println("getConnection: no suitable driver found for "+ url);
        throw new SQLException("No suitable driver found for "+ url, "08001");
    }

ORM 模型 mybatis组件

  • SqlSessionFactoryBuilder:根据配置信息
  • SqlSessionFactory:生成SqlSession
  • SqlSession:发送SQL去执行, 获取mapper
  • SQL mapper : 负责发送SQL 去执行, 并且返回结果
public class SqlSessionFactoryBuilder {

  public SqlSessionFactory build(Reader reader) {
    return build(reader, null, null);
  }

  public SqlSessionFactory build(Reader reader, String environment) {
    return build(reader, environment, null);
  }

  public SqlSessionFactory build(Reader reader, Properties properties) {
    return build(reader, null, properties);
  }

  public SqlSessionFactory build(Reader reader, String environment, Properties properties) {
    try {
      XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);
      return build(parser.parse());
    } catch (Exception e) {
      throw ExceptionFactory.wrapException("Error building SqlSession.", e);
    } finally {
      ErrorContext.instance().reset();
      try {
        reader.close();
      } catch (IOException e) {
        // Intentionally ignore. Prefer previous error.
      }
    }
  }

  public SqlSessionFactory build(InputStream inputStream) {
    return build(inputStream, null, null);
  }

  public SqlSessionFactory build(InputStream inputStream, String environment) {
    return build(inputStream, environment, null);
  }

  public SqlSessionFactory build(InputStream inputStream, Properties properties) {
    return build(inputStream, null, properties);
  }

  public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
    try {
      XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
      return build(parser.parse());
    } catch (Exception e) {
      throw ExceptionFactory.wrapException("Error building SqlSession.", e);
    } finally {
      ErrorContext.instance().reset();
      try {
        inputStream.close();
      } catch (IOException e) {
        // Intentionally ignore. Prefer previous error.
      }
    }
  }
    
  public SqlSessionFactory build(Configuration config) {
    return new DefaultSqlSessionFactory(config);
  }

}
  • 可以看到SqlSessionFactoryBuilder就是为了从Reader inputStream中读取配置文件, 加上Properties 构建SqlSessionFactory

/**
 * Creates an {@link SqlSession} out of a connection or a DataSource
 * 
 * @author Clinton Begin
 */
public interface SqlSessionFactory {

  SqlSession openSession();

  SqlSession openSession(boolean autoCommit);
  SqlSession openSession(Connection connection);
  SqlSession openSession(TransactionIsolationLevel level);

  SqlSession openSession(ExecutorType execType);
  SqlSession openSession(ExecutorType execType, boolean autoCommit);
  SqlSession openSession(ExecutorType execType, TransactionIsolationLevel level);
  SqlSession openSession(ExecutorType execType, Connection connection);

  Configuration getConfiguration();

}
  • 这个接口定义了生成sqlSession的方法
image.png
  • SqlSession 这个接口执行sql命令, 获得mapper, 管理事务
/**
   * Flushes batch statements.
   * @return BatchResult list of updated records
   * @since 3.0.6
   */
  List<BatchResult> flushStatements();

  /**
   * Closes the session
   */
  @Override
  void close();

  /**
   * Clears local session cache
   */
  void clearCache();

  /**
   * Retrieves current configuration
   * @return Configuration
   */
  Configuration getConfiguration();

  /**
   * Retrieves a mapper.
   * @param <T> the mapper type
   * @param type Mapper interface class
   * @return a mapper bound to this SqlSession
   */
  <T> T getMapper(Class<T> type);

  /**
   * Retrieves inner database connection
   * @return Connection
   */
  Connection getConnection();

相关文章

  • mybatis核心组件

    jdbc规范: Connection 代表和数据库之间的连接 Statement 执行sql ResultSe...

  • MyBatis基础

    MyBatis核心组件 SqlSessionFactoryBuilder 构造器,根据代码或者配置生成SqlSes...

  • MyBatis运行原理分析

    在了解MyBatis的运行流程前,先快速了解下MyBatis的四大核心组件,MyBatis的整个执行流程都是围绕这...

  • 一、Spring整合MyBatis

    一、本课目标 掌握Spring整合Mybatis的基本方法 二、整合思路 由IOC接管MyBatis核心组件的创建...

  • MyBatis的核心组件

    SqlSessionFactory工厂接口 使用MyBatis首先是实用配置或者代码去生产SqlSessionFa...

  • Mybatis --核心组件介绍

    不忘初心,方得始终.我一直未离开. 先看下面一张图: Mybatis 核心组件介绍: sqlsession 组件,...

  • MyBatis基础

    MyBatis核心组件 SqlSessionFactoryBuilder:“工厂”构造器,根据配置信息或代码生成工...

  • 从一个简单例子聊MyBatis(二)

    从一个简单例子聊MyBatis(二) 上一篇文章分析了MyBatis的几个核心组件,这篇文章会介绍剩下的组件:Bo...

  • Mybatis基本构成

    Mybatis的核心组件 SqlSessionFactoryBuilder(构造器):会根据配置信息或者代码来生成...

  • MyBatis入门

    参考资料书《Java EE 互联网轻量级框架整合开发》 MyBatis特点 NyBatis核心组件 SqlSess...

网友评论

      本文标题:mybatis核心组件

      本文链接:https://www.haomeiwen.com/subject/ebjzvqtx.html