DriverManager 和 DataSource

176 阅读2分钟

在 DataSource 还没有出现之前,我们使用 DriverManager 来获取连接的,通常的步骤的:

@Test
public void test() throws ClassNotFoundException, SQLException {
    String driverClass = "com.mysql.cj.jdbc.Driver";
    // 1.加载驱动类
    Class.forName(driverClass);
    String url = "jdbc:mysql://localhost:3306/test";
    String username = "root";
    String password = "123";
    // 2.获取连接
    Connection connection = DriverManager.getConnection(url, username, password);
    Statement statement = connection.createStatement();
    String querySql = "select * from person";
    // 3.执行 sql
    ResultSet resultSet = statement.executeQuery(querySql);
    // 4.获取结果
    while (resultSet.next()) {
        String id = resultSet.getString(1);
        String name = resultSet.getString(2);
        int age = resultSet.getInt(3);
        System.out.println("id: " + id + " name: " + name + " age: " + age);
    }
}

它有以下几个缺点:

  1. 每次调用 getConnection() 方法获取到的都是一个新的连接
  2. 驱动程序硬编码在了项目中

Class.forName(driverClass); 这行代码会将数据库厂商提供的 Driver 实现类注册到 DriverManager 中,看 com.mysql.cj.jdbc.Driver 的源码如下:

image.png

static 静态代码块会在类加载过程中的初始化阶段执行,在 com.mysql.cj.jdbc.Driver 的静态代码块部分就有将当前 Driver 注册到 DriverManager 的代码。

DataSource 也是 JDK 提供的一个接口,类继承结构如下:

image.png

顶层接口是 CommonDataSource,下面的三个子接口代表三个方向,DataSource 表示获取 Connection 连接的标准实现,ConnectionPoolDataSource 表示从连接池中获取连接,XADataSource 表示支持分布式事务的连接。

mysql 的客户端实现了 DataSource 接口,当我们引入 mysql 的实现时,会看到一些 DataSource 的实现类:

image.png

我们可以用这些实现类来获取连接:

@Test
public void test01() throws Exception {
    String url = "jdbc:mysql://localhost:3306/test";
    String username = "root";
    String password = "123";
    MysqlDataSource mysqlDataSource = new MysqlDataSource();
    mysqlDataSource.setUrl(url);
    mysqlDataSource.setUser(username);
    mysqlDataSource.setPassword(password);
​
    Connection connection = mysqlDataSource.getConnection();
    Statement statement = connection.createStatement();
    String querySql = "select * from person";
    // 3.执行 sql
    ResultSet resultSet = statement.executeQuery(querySql);
    // 4.获取结果
    while (resultSet.next()) {
        String id = resultSet.getString(1);
        String name = resultSet.getString(2);
        int age = resultSet.getInt(3);
        System.out.println("id: " + id + " name: " + name + " age: " + age);
    }
}

DataSource 底层还是通过 DriverManager 来获取连接的,但是使用 DataSource 更加简单,不同手动注册驱动类,而且每次获取连接都是从连接池中获取的。

进一步的你可以使用 Spring 的 JdbcTemplate 来操作数据库,在这之前记得引入 spring-jdbc 的依赖:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.3.10</version> <!-- 请根据你的Spring版本进行修改 -->
</dependency>
@Test
public void test02() throws Exception {
    String url = "jdbc:mysql://localhost:3306/test";
    String username = "root";
    String password = "123";
    MysqlDataSource mysqlDataSource = new MysqlDataSource();
    mysqlDataSource.setUrl(url);
    mysqlDataSource.setUser(username);
    mysqlDataSource.setPassword(password);
​
    String querySql = "select * from person";
    JdbcTemplate jdbcTemplate = new JdbcTemplate(mysqlDataSource);
    List<Map<String, Object>> maps = jdbcTemplate.queryForList(querySql);
    System.out.println(maps);
}

但是在生产中不会使用 Mysql 包提供的 DataSource,而是使用其他的如 Druid、Tomcat JDBC 等第三方连接池工具,它提供了更多的功能。

参考:

www.cnblogs.com/noteless/p/… benweizhu.github.io/blog/2014/0…