JDBC学习笔记之建立连接

1. 引言

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

  1. DriverManager:通过数据源的URL,大家得以建立与指定的数据源的连年。若是应用
    JDBC 4.0
    之后的本子,那么在首次尝试建立连接的时候会自行加载驱动程序,否则必须手动加载驱动。
  2. DataSource:那事实上是一个接口,须要驱动程序自行提供完成类,比DriverManager要好过多,因为我们得以进一步掌握底层数据源的音讯。通过设置
    DataSource
    的性能可以让其代表指定的数据源,不过差距厂商的驱动程序对该接口的贯彻存在一定不一致,因而具体的装置方法各有所分歧。

  3. 示例

声称:本文使用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();
        }
    }
}

结果:

图片 1

说明:

  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;
    }
}

结果:

图片 2

说明:

  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;
    }
}

结果:

图片 3

说明:

  1. C3P0提供了com.mchange.v2.c3p0.ComboPooledDataSource类作为javax.sql.DataSource接口的落到实处。
  2. ComboPooledDataSource所须求的参数与DriverManager想接近。

总结

时下 oracle 官方尤其推荐使用 DataSource 接口,理由如下:

  1. DataSource 具有更好的可移植性和维护性:不相同于 DriverManage
    r须求硬编码,通过 JNDI ,DataSource 接口的兑现能够经过安排来落成。
  2. DataSource 可以为分布式事务和数据库连接池提供更好的援救。

相关文章