1. 引言
在一个JDBC应用程序中,如果想建立和数据源的连接,那么可以使用以下两个类:
- DriverManager:通过数据源的URL,我们可以建立与指定的数据源的连接。如果使用 JDBC 4.0 之后的版本,那么在首次尝试建立连接的时候会自动加载驱动程序,否则必须手动加载驱动。
- DataSource:这其实是一个接口,需要驱动程序自行提供实现类,比DriverManager要好很多,因为我们可以更加清楚底层数据源的信息。通过设置 DataSource 的属性可以让其表示指定的数据源,但是不同厂商的驱动程序对该接口的实现存在一定差异,因此具体的设置方法各有所不同。
2. 示例
声明:本文使用SQL Server 2008的数据库
2.1 使用DriverManager类
Java Code
public class DriverManagerDemo {
public static void main(String[] args){
String driverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
String url = "jdbc:sqlserver://localhost:1433;DatabaseName=Aming";
String username = "sa";
String password = "root";
try{
//Class.forName(driverName); 在JDBC4.0之后,该行可以省略
Connection conn = DriverManager.getConnection(url,username,password);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT ID,NAME,PASSWORD FROM USERS");
while(rs.next()){
int id = rs.getInt(1);
String name = rs.getString(2);
String pwd = rs.getString(3);
System.out.println("id :" + id + ";name : " + name + ";password : " + pwd);
}
conn.close();
}catch (Exception e){
e.printStackTrace();
}
}
}
结果:
说明:
- 使用DriverManager至少需要提供驱动实现类,数据库的url,数据库的登录名以及密码。
- 虽然Class.forName(driverName)可以省略,但是推荐还是加上去,以加强兼容性。
2.2 使用DataSource接口
public class DataSourceDemo {
public static void main(String[] args) {
String databaseName = "Aming";
int portNumber = 1433;
String username = "sa";
String password = "root";
DataSource dataSource = null;
try{
dataSource = getDataSource(databaseName,portNumber,username,password);
Connection conn = dataSource.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT ID,NAME,PASSWORD FROM USERS");
while(rs.next()){
int id = rs.getInt(1);
String name = rs.getString(2);
String pwd = rs.getString(3);
System.out.println("id :" + id + ";name : " + name + ";password : " + pwd);
}
conn.close();
}catch (Exception e){
e.printStackTrace();
}
}
public static DataSource getDataSource(String databaseName,int portNumber,String username,String password){
SQLServerDataSource dataSource = new SQLServerDataSource();
dataSource.setDatabaseName(databaseName);
dataSource.setPortNumber(portNumber);
dataSource.setUser(username);
dataSource.setPassword(password);
return dataSource;
}
}
结果:
说明:
- microsoft在sqljdbc4中提供了com.microsoft.sqlserver.jdbc.SQLServerDataSource和com.microsoft.sqlserver.jdbc.SQLServerConnectionPoolDataSource两个javax.sql.DataSource接口的实现,本文使用前者。
- 不同于DriverManager,SQLServerDataSource需要提供数据库名 databaseName,端口号 portNumber,数据库登录名 user,数据库密码 password。
2.3 使用C3P0框架
public class C3P0Demo {
public static void main(String[] args) {
String driverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
String url = "jdbc:sqlserver://localhost:1433;DatabaseName=Aming";
String username = "sa";
String password = "root";
DataSource dataSource = null;
try{
dataSource = getDataSource(driverName,url,username,password);
Connection conn = dataSource.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT ID,NAME,PASSWORD FROM USERS");
while(rs.next()){
int id = rs.getInt(1);
String name = rs.getString(2);
String pwd = rs.getString(3);
System.out.println("id :" + id + ";name : " + name + ";password : " + pwd);
}
conn.close();
}catch (Exception e){
e.printStackTrace();
}
}
public static DataSource getDataSource(String driverName,String url,String username,String password) throws PropertyVetoException {
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setDriverClass(driverName);
dataSource.setJdbcUrl(url);
dataSource.setUser(username);
dataSource.setPassword(password);
return dataSource;
}
}
结果:
说明:
- C3P0提供了com.mchange.v2.c3p0.ComboPooledDataSource类作为javax.sql.DataSource接口的实现。
- ComboPooledDataSource所需要的参数与DriverManager想类似。
总结
目前 oracle 官方更加推荐使用 DataSource 接口,理由如下:
- DataSource 具有更好的可移植性和维护性:不同于 DriverManage r需要硬编码,通过 JNDI ,DataSource 接口的实现可以通过配置来完成。
- DataSource 可以为分布式事务和数据库连接池提供更好的支持。