SQL ServerJDBC学习笔记之起连接

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. 应用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;
    }
}

结果:

说明:

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

结果:

说明:

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

总结

即 oracle 官方更加推荐下 DataSource 接口,理由如下:

  1. DataSource 具有双重好之可移植性和维护性:不同让 DriverManage
    r需要硬编码,通过 JNDI ,DataSource 接口的兑现好通过安排来成功。
  2. DataSource 可以吧分布式事务与数据库连接池提供更好的支持。

相关文章