zoukankan      html  css  js  c++  java
  • java加载jdbc驱动三种方式的比较

    一、引言

    平时连接数据库的时候首先要加载jdbc驱动,这一步骤其实有三种方式,他们的区别?优劣?

    二、快速了解三种加载方式

    1. Class.forName(“com.mysql.jdbc.Driver”);

    2. DriverManager.registerDriver(new com.mysql.jdbc.Driver())

    3. System.setProperty(“jdbc.drivers”,”com.mysql.jdbc.Driver”);

    三、代码实例

    1、Class.forName(“com.mysql.jdbc.Driver”)常用

     1 try{
     2        Class.forName("com.mysql.jdbc.Driver");//加载数据库驱动
     3        String url="jdbc:mysql://localhost:3306/databasename";//数据库连接子协议
     4        Connection conn=DriverManager.getConnection(url,"username","password");
     5        Statement stmt=conn.createStatement();
     6        ResultSet rs=stmt.executeQuery("select * from tablename");
     7        while(rs.next()){//不断指向下一条记录
     8             System.out.println("DeptNo:"+rs.getInt(1));
     9             System.out.println("	DeptName:"+rs.getString(2));
    10             System.out.println("	LOC:"+rs.getString(3));
    11 }         
    12     rs.close();
    13     stmt.close();
    14     conn.close();
    15 }catch(ClassNotFoundException e){
    16    System.out.println("找不到指定的驱动程序类!");
    17 }catch(SQLException e){
    18     e.printStackTrace();
    19 }

    提问:Class.forName(...)不是只是加载类吗,并没有看见注册的操作,为什么这样就注册了?

    经由博友@梁桦的提醒,去看了下源码才发现,原来Driver类的静态代码块完成了注册操作(forName加载类的时候,会执行一次静态代码块)

    源码如下:

      static
      {
        try
        {
          DriverManager.registerDriver(new Driver());
        } catch (SQLException E) {
          throw new RuntimeException("Can't register driver!");
        }
      }

    2、DriverManager,看起来比较直观的一种方式,注册相应的db的jdbc驱动,在编译时需要导入对应的lib

    DriverManager.register(new com.mysql.jdbc.Driver());

    但是注意了,正如方法1里所说,Driver类的静态代码块会注册一次,那么此时new Driver的时候就会注册一次,然后外层又会注册一次,所以注册了两次驱动,实在没必要,不过直接 new com.mysql.jdbc.Driver() 却是能达到效果:

    try{
           new com.mysql.jdbc.Driver();//创建driver对象,加载数据库驱动
           String url="jdbc:mysql://localhost:3306/databasename";//数据库连接子协议
           Connection conn=DriverManager.getConnection(url,"username","password");
           Statement stmt=conn.createStatement();
           ResultSet rs=stmt.executeQuery("select * from tablename");
           while(rs.next()){//不断指向下一条记录
                System.out.println("DeptNo:"+rs.getInt(1));
                System.out.println("	DeptName:"+rs.getString(2));
                System.out.println("	LOC:"+rs.getString(3));
    }         
        rs.close();
        stmt.close();
        conn.close();
    }catch(SQLException e){
        e.printStackTrace();
    }

    3、通过系统的属性设置System.setProperty(“jdbc.driver”,”com.mysql.jdbc.Driver”);

     1 try{
     2        System.setProperty("jdbc.driver","com.mysql.jdbc.Driver");//系统属性指定数据库驱动
     3        String url="jdbc:mysql://localhost:3306/databasename";//数据库连接子协议
     4        Connection conn=DriverManager.getConnection(url,"username","password");
     5        Statement stmt=conn.createStatement();
     6        ResultSet rs=stmt.executeQuery("select * from tablename");
     7        while(rs.next()){//不断指向下一条记录
     8             System.out.println("DeptNo:"+rs.getInt(1));
     9             System.out.println("	DeptName:"+rs.getString(2));
    10             System.out.println("	LOC:"+rs.getString(3));
    11 }         
    12     rs.close();
    13     stmt.close();
    14     conn.close();
    15 }catch(SQLException e){
    16     e.printStackTrace();
    17 }

    四、总结

      第二种与第三种注册的方法看起来更加的直接与好理解。

      但是,第一种与第三种方法可以脱离jdbc的驱动进行编译,第二种方法是不可以的,它一定要有jdbc的驱动类才可以通过编译,这样做十分依赖Jar包,一旦jar包找不到,编译时期就会报错,并且为程序换数据库会带来麻烦,并且如上所说加载了两次驱动,虽然这并不影响我们程序,但是这样做实在是没有必要,还会影响程序的运行。

      第三种虽然也可以脱离,但是方法参数设置相对来说较为复杂,特点是它可以设置多个驱动,所以在加载单个驱动时,一般采用第一种方法(Class.forName(...))

      第一种方法是通过Class把驱动类Driver先装载到java的虚拟机中,加载过程中利用静态代码块注册驱动,好处在于能够在编译时不依赖于特定的JDBC Driver库,也就是减少了项目代码的依赖性,而且也很容易改造成从配置文件读取JDBC配置,从而可以在运行时动态更换数据库连接驱动。

  • 相关阅读:
    c++父类指针子类指针转化分析
    setbuf手册
    c++细节
    cf727e
    总结
    UVa 10192 Vacation (最长公共子序列)
    HUNNU 11313 最长公共子序列(LCS)
    HDU 2069 Coin Change (经典DP)
    UVa 674 Coin Change (经典DP)
    UVa 10131 Is Bigger Smarter? (LDS+数据结构排序)
  • 原文地址:https://www.cnblogs.com/Xieyang-blog/p/8489400.html
Copyright © 2011-2022 走看看