在 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);
}
}
它有以下几个缺点:
- 每次调用 getConnection() 方法获取到的都是一个新的连接
- 驱动程序硬编码在了项目中
Class.forName(driverClass); 这行代码会将数据库厂商提供的 Driver 实现类注册到 DriverManager 中,看 com.mysql.cj.jdbc.Driver 的源码如下:
static 静态代码块会在类加载过程中的初始化阶段执行,在 com.mysql.cj.jdbc.Driver 的静态代码块部分就有将当前 Driver 注册到 DriverManager 的代码。
DataSource 也是 JDK 提供的一个接口,类继承结构如下:
顶层接口是 CommonDataSource,下面的三个子接口代表三个方向,DataSource 表示获取 Connection 连接的标准实现,ConnectionPoolDataSource 表示从连接池中获取连接,XADataSource 表示支持分布式事务的连接。
mysql 的客户端实现了 DataSource 接口,当我们引入 mysql 的实现时,会看到一些 DataSource 的实现类:
我们可以用这些实现类来获取连接:
@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…