`
gaojingsong
  • 浏览: 1202989 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

Mybatis源码阅读之UnpooledDataSource

阅读更多

package org.apache.ibatis.datasource.unpooled;

import java.io.PrintWriter;

import java.sql.Connection;

import java.sql.Driver;

import java.sql.DriverManager;

import java.sql.DriverPropertyInfo;

import java.sql.SQLException;

import java.util.Enumeration;

import java.util.Map;

import java.util.Properties;

import java.util.concurrent.ConcurrentHashMap;

import java.util.logging.Logger;

 

import javax.sql.DataSource;

 

import org.apache.ibatis.io.Resources;

 

/**

 * @author Clinton Begin

 * @author Eduardo Macarron

 */

public class UnpooledDataSource implements DataSource {

  

  private ClassLoader driverClassLoader;

  private Properties driverProperties;

  private static Map<String, Driver> registeredDrivers = new ConcurrentHashMap<String, Driver>();

 

  private String driver;

  private String url;

  private String username;

  private String password;

 

  private Boolean autoCommit;

  private Integer defaultTransactionIsolationLevel;-->事物隔离级别

 

  static {

    Enumeration<Driver> drivers = DriverManager.getDrivers();

    while (drivers.hasMoreElements()) {

      Driver driver = drivers.nextElement();

      registeredDrivers.put(driver.getClass().getName(), driver);

    }

  }

  --构造函数

  public UnpooledDataSource() {

  }

  --构造函数

  public UnpooledDataSource(String driver, String url, String username, String password) {

    this.driver = driver;

    this.url = url;

    this.username = username;

    this.password = password;

  }

  --构造函数

  public UnpooledDataSource(String driver, String url, Properties driverProperties) {

    this.driver = driver;

    this.url = url;

    this.driverProperties = driverProperties;

  }

  --构造函数

  public UnpooledDataSource(ClassLoader driverClassLoader, String driver, String url, String username, String password) {

    this.driverClassLoader = driverClassLoader;

    this.driver = driver;

    this.url = url;

    this.username = username;

    this.password = password;

  }

  --构造函数

  public UnpooledDataSource(ClassLoader driverClassLoader, String driver, String url, Properties driverProperties) {

    this.driverClassLoader = driverClassLoader;

    this.driver = driver;

    this.url = url;

    this.driverProperties = driverProperties;

  }

 

  @Override

  public Connection getConnection() throws SQLException {

    return doGetConnection(username, password);

  }

 

  @Override

  public Connection getConnection(String username, String password) throws SQLException {

    return doGetConnection(username, password);

  }

 

  @Override

  public void setLoginTimeout(int loginTimeout) throws SQLException {

    DriverManager.setLoginTimeout(loginTimeout);

  }

 

  @Override

  public int getLoginTimeout() throws SQLException {

    return DriverManager.getLoginTimeout();

  }

 

  @Override

  public void setLogWriter(PrintWriter logWriter) throws SQLException {

    DriverManager.setLogWriter(logWriter);

  }

 

  @Override

  public PrintWriter getLogWriter() throws SQLException {

    return DriverManager.getLogWriter();

  }

 

  public ClassLoader getDriverClassLoader() {

    return driverClassLoader;

  }

 

  public void setDriverClassLoader(ClassLoader driverClassLoader) {

    this.driverClassLoader = driverClassLoader;

  }

 

  public Properties getDriverProperties() {

    return driverProperties;

  }

 

  public void setDriverProperties(Properties driverProperties) {

    this.driverProperties = driverProperties;

  }

 

  public String getDriver() {

    return driver;

  }

 

  public synchronized void setDriver(String driver) {

    this.driver = driver;

  }

 

  public String getUrl() {

    return url;

  }

 

  public void setUrl(String url) {

    this.url = url;

  }

 

  public String getUsername() {

    return username;

  }

 

  public void setUsername(String username) {

    this.username = username;

  }

 

  public String getPassword() {

    return password;

  }

 

  public void setPassword(String password) {

    this.password = password;

  }

 

  public Boolean isAutoCommit() {

    return autoCommit;

  }

 

  public void setAutoCommit(Boolean autoCommit) {

    this.autoCommit = autoCommit;

  }

 

  public Integer getDefaultTransactionIsolationLevel() {

    return defaultTransactionIsolationLevel;

  }

 

  public void setDefaultTransactionIsolationLevel(Integer defaultTransactionIsolationLevel) {

    this.defaultTransactionIsolationLevel = defaultTransactionIsolationLevel;

  }

 

  private Connection doGetConnection(String username, String password) throws SQLException {

    Properties props = new Properties();

    if (driverProperties != null) {

      props.putAll(driverProperties);

    }

    if (username != null) {

      props.setProperty("user", username);

    }

    if (password != null) {

      props.setProperty("password", password);

    }

    return doGetConnection(props);

  }

 

  private Connection doGetConnection(Properties properties) throws SQLException {

    initializeDriver();

    Connection connection = DriverManager.getConnection(url, properties);

    configureConnection(connection);

    return connection;

  }

 

  private synchronized void initializeDriver() throws SQLException {

    if (!registeredDrivers.containsKey(driver)) {

      Class<?> driverType;

      try {

        if (driverClassLoader != null) {

          driverType = Class.forName(driver, true, driverClassLoader);

        } else {

          driverType = Resources.classForName(driver);

        }

        // DriverManager requires the driver to be loaded via the system ClassLoader.

        // http://www.kfu.com/~nsayer/Java/dyn-jdbc.html

        Driver driverInstance = (Driver)driverType.newInstance();

        DriverManager.registerDriver(new DriverProxy(driverInstance));

        registeredDrivers.put(driver, driverInstance);

      } catch (Exception e) {

        throw new SQLException("Error setting driver on UnpooledDataSource. Cause: " + e);

      }

    }

  }

 

  private void configureConnection(Connection conn) throws SQLException {

    if (autoCommit != null && autoCommit != conn.getAutoCommit()) {

      conn.setAutoCommit(autoCommit);

    }

    if (defaultTransactionIsolationLevel != null) {

      conn.setTransactionIsolation(defaultTransactionIsolationLevel);

    }

  }

 

  private static class DriverProxy implements Driver {

    private Driver driver;

 

    DriverProxy(Driver d) {

      this.driver = d;

    }

 

    @Override

    public boolean acceptsURL(String u) throws SQLException {

      return this.driver.acceptsURL(u);

    }

 

    @Override

    public Connection connect(String u, Properties p) throws SQLException {

      return this.driver.connect(u, p);

    }

 

    @Override

    public int getMajorVersion() {

      return this.driver.getMajorVersion();

    }

 

    @Override

    public int getMinorVersion() {

      return this.driver.getMinorVersion();

    }

 

    @Override

    public DriverPropertyInfo[] getPropertyInfo(String u, Properties p) throws SQLException {

      return this.driver.getPropertyInfo(u, p);

    }

 

    @Override

    public boolean jdbcCompliant() {

      return this.driver.jdbcCompliant();

    }

 

    // @Override only valid jdk7+

    public Logger getParentLogger() {

      return Logger.getLogger(Logger.GLOBAL_LOGGER_NAME);

    }

  }

 

  @Override

  public <T> T unwrap(Class<T> iface) throws SQLException {

    throw new SQLException(getClass().getName() + " is not a wrapper.");

  }

 

  @Override

  public boolean isWrapperFor(Class<?> iface) throws SQLException {

    return false;

  }

 

  // @Override only valid jdk7+

  public Logger getParentLogger() {

    // requires JDK version 1.6

    return Logger.getLogger(Logger.GLOBAL_LOGGER_NAME);

  }

 

}

 

0
4
分享到:
评论

相关推荐

    MyBatis源码分析.pdf

    MyBatis源码分析 MyBatis是一款流行的Java持久层框架,提供了强大的数据库访问能力,本文将对MyBatis的源码进行深入分析,从而帮助读者更好地理解MyBatis的工作机理。 1. MyBatis入门 MyBatis是一款基于Java的...

    Mybatis源码分析.pdf

    MyBatis的设计模式也是其强大之处,例如工厂模式用于创建SqlSession,代理模式用于实现动态SQL,单例模式用于管理Configuration对象,责任链模式用于执行SQL等。理解这些设计模式可以帮助我们更好地理解MyBatis的...

    阿里巴巴P7架构师纯手工打造MyBatis源码——1小时解密底层源码.txt

    ### MyBatis源码解析——由阿里巴巴P7架构师纯手工打造 #### 一、前言 在现代软件开发过程中,持久层框架如MyBatis因其简单易用、灵活高效的特点而受到广泛欢迎。作为一款优秀的Java持久层框架,MyBatis通过SQL...

    mybatis源码分析视频

    本资源“mybatis源码分析视频”是针对MyBatis框架进行深入剖析的教程,通过视频和文档的形式帮助学习者理解其内部工作机制。 1. **MyBatis简介** MyBatis消除了几乎所有的JDBC代码和手动设置参数以及获取结果集。...

    MyBatis源码详解学习.zip

    《MyBatis源码详解学习》是一份专为对MyBatis源码感兴趣的开发者准备的资料,它旨在帮助读者深入理解这个流行持久层框架的工作原理。MyBatis作为一个轻量级的ORM(对象关系映射)框架,因其简单易用、高度可定制化的...

    5套完整springboot+mybatis源码下载只供学习之用.rar

    通过学习这些源码,你可以深入理解SpringBoot如何启动、如何配置自动装配,以及MyBatis如何与数据库交互。同时,Shiro的使用也能帮助你掌握用户权限的控制。对于初学者,这是一个很好的实践平台,对于有经验的开发者...

    mybatis源码笔记.pdf

    阅读mybatis源码所记笔记。 基本: 1.数据源获取 2.mapper的sql语句获取 3.怎么去获得到的resultSet 重点: 1.orm是什么:体现于resultSet的数据库类型和java类型的转换 2.mybatis的一级缓存原理(简单的ifelse判断...

    mybatis核心源码

    mybatis核心源码mybatis核心源码mybatis核心源码mybatis核心源码mybatis核心源码mybatis核心源码mybatis核心源码mybatis核心源码mybatis核心源码mybatis核心源码mybatis核心源码mybatis核心源码mybatis核心源码...

    mybatis源码分析思维导图.rar

    MyBatis的源码分析对于理解其工作原理、优化数据库交互以及进行二次开发至关重要。通过思维导图的方式,我们可以更直观、系统地理解MyBatis的架构和流程。 首先,MyBatis的核心概念包括SqlSessionFactory、...

    mybatis源码jar包

    在深入阅读MyBatis源码时,我们可以了解其实现原理,学习到如何优雅地处理数据库操作,包括SQL的构建、参数绑定、结果映射等。这对于提升我们的Java编程能力和理解数据库操作有很大的帮助。同时,MyBatis源码中涉及...

    mybatis源码.rar

    源码分析是理解框架工作原理的重要途径,通过阅读MyBatis的源码,我们可以深入学习其内部机制,包括SQL动态生成、结果映射、事务管理等方面。 1. SQL动态生成:MyBatis的核心之一是SQL动态语句。在XML配置文件或...

    Mybatis源码学习-代码+笔记

    在深入学习Mybatis源码的过程中,我们可以了解到它的工作原理,更好地优化数据库交互,提高程序性能。 1. **Mybatis概述** Mybatis 源码的学习可以帮助开发者理解其内部机制,包括动态SQL的解析、SQL映射文件与...

    MyBatis源码解析

    MyBatis源码解析

    Spring整合Mybatis源码解析

    Spring整合Mybatis源码解析

    mybatis:mybatis源码阅读

    mybatis源码阅读 配置 配置都在配置类 映射代理 映射器代理 3.3.1版本后ExecutorType为简单,重复使用批量插入可以正确返回生成主键 密钥生成器 useGeneratedKeys为true使用Jdbc3KeyGenerator selectKey节点使用...

    MyBatis 源码解析:通过源码深入理解 SQL 的执行过程 - GitChat

    MyBatis 源码解析:通过源码深入理解 SQL 的执行过程 抓下来打包成了HTML文件, 方便离线观看

    mybatis源码+配置步骤+包文件

    MyBatis的源码主要由SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession和Mapper接口等核心组件构成。SqlSessionFactoryBuilder用于创建SqlSessionFactory,它是MyBatis的核心工厂类。SqlSessionFactory则...

    mybatis源码和官方的中文文档

    MyBatis是一个流行的Java持久...通过深入阅读MyBatis的中文文档和研究源代码,开发者不仅可以掌握MyBatis的基本用法,还能了解到其设计理念和内部实现,从而更好地利用这个强大的框架来构建高效、可维护的数据库应用。

    MyBatis源码demo

    《MyBatis源码分析与实战应用》 在IT行业中,MyBatis作为一个轻量级的持久层框架,因其灵活性和高效性而被广泛应用。它将SQL语句与Java代码相结合,提供了比传统JDBC更方便的数据操作方式。本文将深入探讨MyBatis的...

Global site tag (gtag.js) - Google Analytics