zoukankan      html  css  js  c++  java
  • 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 可以为分布式事务和数据库连接池提供更好的支持。
  • 相关阅读:
    2018.4.5课堂笔记
    黑白染色——封锁阳光大学
    末日游戏——杨辉三角+搜索
    dilworth定理+属性排序(木棍加工)
    伯努利错装信封问题
    zhx'code1
    字符串-----KMP竟然是18禁
    Presto Event Listener开发
    Presto安装完成之后需要做的
    Apache Calcite 论文学习笔记
  • 原文地址:https://www.cnblogs.com/xiao2/p/7201853.html
Copyright © 2011-2022 走看看