介紹
- JDBC(Java Database Connectivity)是一組公共接口, 是一個獨立於特定數據庫管理系統,通用的SQL數據庫操作的一組API, 定義了用來訪問數據庫的標準Java類庫, (java.sql,javax.sql)使用這些類庫可以以一種標準的方法,方便地操作數據庫資源
- JDBC的目標是使Java程序員使用JDBC可以連接任何提供了JDBC驅動程序的數據庫系統,這樣就使得程序員無需對特定的數據庫系統的特點有過多的瞭解,從而大大簡化和加快了開發過程
- JDBC接口包含兩套API面向應用的API: Java API, 抽象接口, 供應用程序開發人員使用(連接數據庫, 執行SQL語句, 獲得結果)面向數據庫的API: Java Driver API, 供開發商開發數據庫驅動程序用
JDBC是SUN公司提供一套用於數據庫操作的接口, Java程序員只需要面向這套接口編程即可
不同的數據庫廠商, 需要針對這套接口, 提供不同實現
不同的實現的集合, 即為不同數據庫的驅動, 面向接口編程
Driver接口實現類
- java.sql.Driver 接口是所有 JDBC 驅動程序需要實現的接口, 這個接口是提供給數據庫廠商使用的, 不同數據庫廠商提供不同的實現
- 在程序中不需要直接去訪問實現了 Driver 接口的類, 而是由驅動程序管理器類 (java.sql.DriverManager) 去調用這些Driver實現Oracle的驅動:oracle.jdbc.driver.OracleDrivermySql的驅動: com.mysql.jdbc.Driver
- 加載驅動:加載 JDBC 驅動需調用 Class 類的靜態方法 forName(),向其傳遞要加載的 JDBC 驅動的類名Class.forName(“com.mysql.jdbc.Driver”)
- 註冊驅動:DriverManager 類是驅動程序管理器類,負責管理驅動程序使用DriverManager.registerDriver(com.mysql.jdbc.Driver)來註冊驅動通常不用顯式調用 DriverManager 類的 registerDriver() 方法來註冊驅動程序類的實例,因為 Driver 接口的驅動程序類都包含了靜態代碼塊,在這個靜態代碼塊中,會調用 DriverManager.registerDriver() 方法來註冊自身的一個實例.
URL
- JDBC URL 用於標識一個被註冊的驅動程序,驅動程序管理器通過這個 URL 選擇正確的驅動程序,從而建立到數據庫的連接。
- JDBC URL的標準由三部分組成,各部分間用冒號分隔。 jdbc:子協議:子名稱協議:JDBC URL中的協議總是JDBC子協議:子協議用於標識一個數據庫驅動程序子名稱:一種標識數據庫的方法。子名稱可以依不同的子協議而變化,用子名稱的目的是為了定位數據庫提供足夠的信息。包含主機名(對應服務端的ip地址),端口號,數據庫名
幾種常用數據庫的 JDBC URL
- MySQL的連接URL編寫方式:jdbc:mysql://localhost:3306/test?user=root&password=123&useUnicode=true&characterEncoding=utf8(如果JDBC程序與服務器端的字符集不一致,會導致亂碼,那麼可以通過參數指定服務器端的字符集)
- Oracle 9i的連接URL編寫方式:jdbc:oracle:thin:@主機名稱:oracle服務端口號:數據庫名稱jdbc:oracle:thin:@localhost:1521:test
- SQLServer的連接URL編寫方式:jdbc:sqlserver://主機名稱:sqlserver服務端口號:DatabaseName=數據庫名稱jdbc:sqlserver://localhost:1433:DatabaseName=test
代碼
連接方式一
<code> @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", "123");
//4.調用driver的connect(),獲取連接
Connection conn = driver.connect(url, info);
System.out.println(conn);
} catch (SQLException e) {
e.printStackTrace();
}
}/<code>
說明:上述代碼中顯式出現了第三方數據庫的API
連接方式二
<code> @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", "123");
//4.調用driver的connect(),獲取連接
Connection conn = driver.connect(url, info);
System.out.println(conn);
} catch (Exception e) {
e.printStackTrace();
}
}/<code>
說明:相較於方式一,這裡使用反射實例化Driver,不在代碼中體現第三方數據庫的API。體現了面向接口編程思想。
連接方式三
<code> @Test
public void testConnection3() {
try {
//1.數據庫連接的4個基本要素:
String url = "jdbc:mysql://localhost:3306/test";
String user = "root";
String password = "123";
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();
}
}/<code>
說明:使用DriverManager實現數據庫的連接。體會獲取連接必要的4個基本要素。
連接方式四
<code> @Test
public void testConnection4() {
try {
//1.數據庫連接的4個基本要素:
String url = "jdbc:mysql://localhost:3306/test";
String user = "root";
String password = "123";
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();
}
}/<code>
說明:不必顯式的註冊驅動了。因為在DriverManager的源碼中已經存在靜態代碼塊,實現了驅動的註冊。
連接方式五(推薦)
<code> @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);
}/<code>
其中,配置文件聲明在工程的src目錄下:【jdbc.properties】
<code>user=root
password=123
url=jdbc:mysql://localhost:3306/test
driverClass=com.mysql.jdbc.Driver/<code>
企業級的使用方式五
總結
基本思想
面向接口編程的思想
ORM思想(object relational mapping)
一個數據表對應一個java類
表中的一條記錄對應java類的一個對象
表中的一個字段對應java類的一個屬性
sql是需要結合列名和表的屬性名來寫。注意起別名。
基本技術
JDBC結果集的元數據:ResultSetMetaData
獲取列數:getColumnCount()
獲取列的別名:getColumnLabel()
通過反射,創建指定類的對象,獲取指定的屬性並賦值
閱讀更多 拉斐 的文章