JDBC学习笔记之建立连接

1. 引言

在一个JDBC应用程序中,如果想建立和数据源的连接,那么可以使用以下两个类:

  1. DriverManager:通过数据源的URL,我们可以建立与指定的数据源的连接。如果使用 JDBC 4.0 之后的版本,那么在首次尝试建立连接的时候会自动加载驱动程序,否则必须手动加载驱动。
  2. 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();
        }
    }
}

结果:

DriverManagerDemo执行结果

说明:

  1. 使用DriverManager至少需要提供驱动实现类,数据库的url,数据库的登录名以及密码。
  2. 虽然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;
    }
}

结果:

DataSourceDemo的执行结果

说明:

  1. microsoft在sqljdbc4中提供了com.microsoft.sqlserver.jdbc.SQLServerDataSource和com.microsoft.sqlserver.jdbc.SQLServerConnectionPoolDataSource两个javax.sql.DataSource接口的实现,本文使用前者。
  2. 不同于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;
    }
}

结果:

C3P0Demo的执行结果

说明:

  1. C3P0提供了com.mchange.v2.c3p0.ComboPooledDataSource类作为javax.sql.DataSource接口的实现。
  2. ComboPooledDataSource所需要的参数与DriverManager想类似。

总结

目前 oracle 官方更加推荐使用 DataSource 接口,理由如下:

  1. DataSource 具有更好的可移植性和维护性:不同于 DriverManage r需要硬编码,通过 JNDI ,DataSource 接口的实现可以通过配置来完成。
  2. DataSource 可以为分布式事务和数据库连接池提供更好的支持。
posted @ 2017-07-18 17:52  大明二代  阅读(340)  评论(0编辑  收藏  举报