在JDBC中使用DataSource获取连接
javax.sql.DataSource是java.sql.DriverManager的一个代替,而且建议优先使用DataSource,因为DataSource提供了DriverManager所没有的一些特性,例如连接池、分布式事务。
DataSource是一个接口,它的实现由驱动器的厂商提供,例如mysql Connector/J中的com.mysql.cj.jdbc.MysqlDataSource实现了DataSource:
public class MysqlDataSource extends JdbcPropertySetImpl implements DataSource, Referenceable, Serializable, JdbcPropertySet
下面代码示例中用了DataSource来获取连接,而没有使用DriverManager:
package com.thb;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Enumeration;
import javax.sql.DataSource;
import com.mysql.cj.jdbc.MysqlDataSource;
public class JDBCDemo {
public static void main(String[] args) throws ClassNotFoundException {
String url = "jdbc:mysql://localhost:3306/development";
String user = "development_user";
String pass = "test009";
Connection con = null;
PreparedStatement stmt = null;
String sql = "SELECT * FROM test_table";
Enumeration<Driver> drivers = DriverManager.getDrivers();
if (drivers.hasMoreElements()) {
System.out.println("加载的驱动器的类型: "+ drivers.nextElement().getClass().getName());
}
try {
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl(url);
con = dataSource.getConnection(user, pass);
stmt = con.prepareStatement(sql);
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
System.out.println(rs.getInt("id"));
System.out.println(rs.getString("type"));
System.out.println(rs.getDate("pdate"));
System.out.println(rs.getBigDecimal("price"));
System.out.println(rs.getString("description"));
}
rs.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (stmt != null) {
stmt.close();
}
if (con != null) {
con.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
运行输出,得到了正确的结果:
加载的驱动器的类型: com.mysql.cj.jdbc.Driver
1
1
2023-12-04
100.000000
测试数据