【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("\n"); 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 }