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配置,从而可以在运行时动态更换数据库连接驱动。

  • 相关阅读:
    D. Constructing the Array
    B. Navigation System
    B. Dreamoon Likes Sequences
    A. Linova and Kingdom
    G. Special Permutation
    B. Xenia and Colorful Gems
    Firetrucks Are Red
    java getInstance()的使用
    java 静态代理和动态代理
    java 类加载机制和反射机制
  • 原文地址:https://www.cnblogs.com/Xieyang-blog/p/8489400.html
Copyright © 2011-2022 走看看