JDBC(二)【獲取資料庫連線】
2.1 要素一:Driver介面實現類
2.1.1 Driver介面介紹
-
java.sql.Driver 介面是所有 JDBC 驅動程式需要實現的介面。這個介面是提供給資料庫廠商使用的,不同資料庫廠商提供不同的實現。
-
在程式中不需要直接去訪問實現了 Driver 介面的類,而是由驅動程式管理器類(java.sql.DriverManager)去呼叫這些Driver實現。
- Oracle的驅動:oracle.jdbc.driver.OracleDriver
- mySql的驅動: com.mysql.jdbc.Driver
- 將上述jar包拷貝到Java工程的一個目錄中,習慣上新建一個lib資料夾。
在驅動jar上右鍵-->Build Path-->Add to Build Path
注意:如果是Dynamic Web Project(動態的web專案)話,則是把驅動jar放到WebContent(有的開發工具叫WebRoot)目錄中的WEB-INF目錄中的lib目錄下即可
2.1.2 載入與註冊JDBC驅動
-
載入驅動:載入 JDBC 驅動需呼叫 Class 類的靜態方法 forName(),向其傳遞要載入的 JDBC 驅動的類名
- Class.forName(“com.mysql.jdbc.Driver”);
-
註冊驅動:DriverManager 類是驅動程式管理器類,負責管理驅動程式
-
使用DriverManager.registerDriver(com.mysql.jdbc.Driver)來註冊驅動
-
通常不用顯式呼叫 DriverManager 類的 registerDriver() 方法來註冊驅動程式類的例項,因為 Driver 介面的驅動程式類都包含了靜態程式碼塊,在這個靜態程式碼塊中,會呼叫 DriverManager.registerDriver() 方法來註冊自身的一個例項。下圖是MySQL的Driver實現類的原始碼:
-
2.2 要素二:URL
-
JDBC URL 用於標識一個被註冊的驅動程式,驅動程式管理器通過這個 URL 選擇正確的驅動程式,從而建立到資料庫的連線。
-
JDBC URL的標準由三部分組成,各部分間用冒號分隔。
- jdbc:子協議:子名稱
- 協議:JDBC URL中的協議總是jdbc
- 子協議:子協議用於標識一個數據庫驅動程式
- 子名稱:一種標識資料庫的方法。子名稱可以依不同的子協議而變化,用子名稱的目的是為了定位資料庫提供足夠的資訊。包含主機名(對應服務端的ip地址),埠號,資料庫名
-
舉例:
-
幾種常用資料庫的 JDBC URL
-
MySQL的連線URL編寫方式:
- jdbc:mysql://主機名稱:mysql服務埠號/資料庫名稱?引數=值&引數=值
- jdbc:mysql://localhost:3306/atguigu
- jdbc:mysql://localhost:3306/atguigu?useUnicode=true&characterEncoding=utf8(如果JDBC程式與伺服器端的字符集不一致,會導致亂碼,那麼可以通過引數指定伺服器端的字符集)
- jdbc:mysql://localhost:3306/atguigu?user=root&password=123456
-
Oracle 9i的連線URL編寫方式:
- jdbc:oracle:thin:@主機名稱:oracle服務埠號:資料庫名稱
- jdbc:oracle:thin:@localhost:1521:atguigu
-
SQLServer的連線URL編寫方式:
-
jdbc:sqlserver://主機名稱:sqlserver服務埠號:DatabaseName=資料庫名稱
-
jdbc:sqlserver://localhost:1433:DatabaseName=atguigu
-
-
2.3 要素三:使用者名稱和密碼
- user,password可以用“屬性名=屬性值”方式告訴資料庫
- 可以呼叫 DriverManager 類的 getConnection() 方法建立到資料庫的連線
2.4 資料庫連線方式舉例
2.4.1 連線方式一
@Test
public void testConnection1() {
try {
//1.提供java.sql.Driver介面實現類的物件
Driver driver = null;
driver = new com.mysql.jdbc.Driver();
//2.提供url,指明具體操作的資料
String url = "jdbc:mysql://localhost:3306/test";
//3.提供Properties的物件,指明使用者名稱和密碼
Properties info = new Properties();
info.setProperty("user", "root");
info.setProperty("password", "abc123");
//4.呼叫driver的connect(),獲取連線
Connection conn = driver.connect(url, info);
System.out.println(conn);
} catch (SQLException e) {
e.printStackTrace();
}
}
說明:上述程式碼中顯式出現了第三方資料庫的API
2.4.2 連線方式二
@Test
public void testConnection2() {
try {
//1.例項化Driver
String className = "com.mysql.jdbc.Driver";
Class clazz = Class.forName(className);
Driver driver = (Driver) clazz.newInstance();
//2.提供url,指明具體操作的資料
String url = "jdbc:mysql://localhost:3306/test";
//3.提供Properties的物件,指明使用者名稱和密碼
Properties info = new Properties();
info.setProperty("user", "root");
info.setProperty("password", "abc123");
//4.呼叫driver的connect(),獲取連線
Connection conn = driver.connect(url, info);
System.out.println(conn);
} catch (Exception e) {
e.printStackTrace();
}
}
說明:相較於方式一,這裡使用反射例項化Driver,不在程式碼中體現第三方資料庫的API。體現了面向介面程式設計思想。
2.4.3 連線方式三
@Test
public void testConnection3() {
try {
//1.資料庫連線的4個基本要素:
String url = "jdbc:mysql://localhost:3306/test";
String user = "root";
String password = "abc123";
String driverName = "com.mysql.jdbc.Driver";
//2.例項化Driver
Class clazz = Class.forName(driverName);
Driver driver = (Driver) clazz.newInstance();
//3.註冊驅動
DriverManager.registerDriver(driver);
//4.獲取連線
Connection conn = DriverManager.getConnection(url, user, password);
System.out.println(conn);
} catch (Exception e) {
e.printStackTrace();
}
}
說明:使用DriverManager實現資料庫的連線。體會獲取連線必要的4個基本要素。
2.4.4 連線方式四
@Test
public void testConnection4() {
try {
//1.資料庫連線的4個基本要素:
String url = "jdbc:mysql://localhost:3306/test";
String user = "root";
String password = "abc123";
String driverName = "com.mysql.jdbc.Driver";
//2.載入驅動 (①例項化Driver ②註冊驅動)
Class.forName(driverName);
//Driver driver = (Driver) clazz.newInstance();
//3.註冊驅動
//DriverManager.registerDriver(driver);
/*
可以註釋掉上述程式碼的原因,是因為在mysql的Driver類中宣告有:
static {
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException var1) {
throw new RuntimeException("Can't register driver!");
}
}
*/
//3.獲取連線
Connection conn = DriverManager.getConnection(url, user, password);
System.out.println(conn);
} catch (Exception e) {
e.printStackTrace();
}
}
說明:不必顯式的註冊驅動了。因為在DriverManager的原始碼中已經存在靜態程式碼塊,實現了驅動的註冊。
2.4.5 連線方式五(最終版)
@Test
public void testConnection5() throws Exception {
//1.載入配置檔案
InputStream is = ConnectionTest.class.getClassLoader().getResourceAsStream("jdbc.properties");
Properties pros = new Properties();
pros.load(is);
//2.讀取配置資訊
String user = pros.getProperty("user");
String password = pros.getProperty("password");
String url = pros.getProperty("url");
String driverClass = pros.getProperty("driverClass");
//3.載入驅動
Class.forName(driverClass);
//4.獲取連線
Connection conn = DriverManager.getConnection(url,user,password);
System.out.println(conn);
}
其中,配置檔案宣告在工程的src目錄下:【jdbc.properties】
user=root
password=abc123
url=jdbc:mysql://localhost:3306/test
driverClass=com.mysql.jdbc.Driver
說明:使用配置檔案的方式儲存配置資訊,在程式碼中載入配置檔案
使用配置檔案的好處:
①實現了程式碼和資料的分離,如果需要修改配置資訊,直接在配置檔案中修改,不需要深入程式碼
②如果修改了配置資訊,省去重新編譯的過程。