zoukankan      html  css  js  c++  java
  • 【Java学习】Jdbc注册驱动的三种方式

    关于驱动包

    jdbc中注册驱动,首先导入对应的包,例如mysql-connector-java-5.0.8-bin.jar。驱动包是java和具体数据库之间的连接桥梁,由数据库厂商开发。每一种数据库对应一款驱动jar,甚至每一个版本的数据库都有自己对应版本的驱动jar。 

    关于java.sqlDriverManger类

    Java的驱动管理类。管理一组 JDBC 驱动程序。

    javax.sql.DataSource 接口是 JDBC 2.0 API 中的新增内容,它提供了连接到数据源的另一种方法。使用 DataSource 对象是连接到数据源的首选方法。

    更深的理解请参见java 文档。

    DiverManager.class里有个属性drivers,它实际上是一个vector(向量)。可在列表中加入很多驱动,当DriverManager去取连接的时候,若果drivers里有很多驱动,它会把drivers里面的各个驱动的url和创建连接时传进来的url逐一比较,遇到对应的url,则建立连接。 

    注册驱动的三种方式: 

    (一)DriverManager.registerDriver(new com.mysql.jdbc.Driver()); 
    会造成DriverManager中产生两个一样的驱动,并会对具体的驱动类产生依赖。 
    具体来说就是: 
    1,加载的时候注册一次驱动(原因请看第三中注册方式),实例化的时候又注册一次。所以两次。 
    2,由于实例化了com.mysql.jdbc.Driver.class,导致必须导入该类(就是要把这个类import进去),从而具体驱动产生了依赖。不方便扩展代码。 

    (二)System.setProperty("jdbc.drivers","com.mysql.jdbc.Driver"); 

    通过系统的属性设置注册驱动

    如果要注册多个驱动,则System.setProperty("jdbc.drivers","com.mysql.jdbc.Driver:com.oracle.jdbc.Driver"); 
    虽然不会对具体的驱动类产生依赖;但注册不太方便,所以很少使用。 


    (三)Class.forName("com.mysql.jdbc.Driver");( 关于这句代码的进一步理解请参看另一篇文章《从Class.forName()到类的装载机制》)

    推荐这种方式,不会对具体的驱动类产生依赖(就是不用import package了)。 
    其实这个只是把com.mysql.jdbc.Driver.class这个类装载进去,但是关键就在于,在 
    这个类中,有个静态块,如下: 
    static{ 
       try{ 
    java.sql.DriverManager.registerDriver(new Driver()); 
    }catch(SQLException e){ 
       throw new RuntimeException("can't register driver!"); 


    就是因为这个代码块,让类在加载的时候就把驱动注册进去了!

    *****首先下载mysql jar包,放到jre lib目录下

     1 package com.company;
     2 
     3 import java.sql.*;
     4 
     5 
     6 public class TestMySQL {
     7     // MySQL 8.0 以下版本 - JDBC 驱动名及数据库 URL
     8 //    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
     9 //    static final String DB_URL = "jdbc:mysql://localhost:3306/RUNOOB";
    10 
    11     // MySQL 8.0 以上版本 - JDBC 驱动名及数据库 URL
    12     static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
    13     static final String DB_URL = "jdbc:mysql://localhost:3306/mysql?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC";
    14 
    15 
    16     // 数据库的用户名与密码,需要根据自己的设置
    17     static final String USER = "root";
    18     static final String PASS = "root";
    19 
    20     public static void main(String[] args) {
    21         Connection conn = null;
    22         Statement stmt = null;
    23         try {
    24             // 注册 JDBC 驱动
    25             Class.forName(JDBC_DRIVER);
    26 
    27             // 打开链接
    28             System.out.println("连接数据库...");
    29             conn = DriverManager.getConnection(DB_URL, USER, PASS);
    30 
    31             // 执行查询
    32             System.out.println("实例化Statement对象...");
    33             stmt = conn.createStatement();
    34             String sql;
    35             sql = "select max_questions, user, host  from mysql.user";
    36             ResultSet rs = stmt.executeQuery(sql);
    37 
    38             // 展开结果集数据库
    39             while (rs.next()) {
    40                 // 通过字段检索
    41                 int max_questions = rs.getInt("max_questions");
    42                 String user = rs.getString("user");
    43                 String host = rs.getString("host");
    44 
    45                 // 输出数据
    46                 System.out.print("max_questions: " + max_questions);
    47                 System.out.print(", user: " + user);
    48                 System.out.print(", host: " + host);
    49                 System.out.print("
    ");
    50             }
    51             // 完成后关闭
    52             rs.close();
    53             stmt.close();
    54             conn.close();
    55         } catch (SQLException se) {
    56             // 处理 JDBC 错误
    57             se.printStackTrace();
    58         } catch (Exception e) {
    59             // 处理 Class.forName 错误
    60             e.printStackTrace();
    61         } finally {
    62             // 关闭资源
    63             try {
    64                 if (stmt != null) stmt.close();
    65             } catch (SQLException se2) {
    66             }// 什么都不做
    67             try {
    68                 if (conn != null) conn.close();
    69             } catch (SQLException se) {
    70                 se.printStackTrace();
    71             }
    72         }
    73         System.out.println("Goodbye!");
    74     }
    75 }

    转载:https://www.cnblogs.com/chenning/p/5030790.html

    作者:gtea 博客地址:https://www.cnblogs.com/gtea
  • 相关阅读:
    本周总结
    团队组队
    ListView之checkbox错位问题解决
    ListView
    ScrollView(滚动条)
    elementui中自定义Select选择器样式自定义
    element-ui中Select 选择器列表内容居中
    element-ui中Select 选择器去除点击时的淡蓝色边框
    vue和uni-app不同的类型绑定不同的类名
    根据年月日获取星期几
  • 原文地址:https://www.cnblogs.com/gtea/p/13623754.html
Copyright © 2011-2022 走看看