2.JDBC
一、簡介
1.1概念
JDBC(Java Database Connectivity)是Java程式如何操作資料庫的規範。
在Java編寫的程式中,程式員通過使用JDBC API,可以用标準SQL語句通路幾乎任何一種資料庫;特定資料庫廠商通過實作JDBC API生産的JDBC驅動程式完成某個具體資料庫的.
實際操作。
JDBC分為面向程式開發人員的JDBC API和面向底層JDBC驅動的API。
面向底層JDBC驅動的API是資料庫廠商實作.驅動程式的規範。
在Java應用程式中使用JDBC API來通路資料庫時要在classpath中加載某個具體
資料庫的JDBC驅動,這樣不管是通路什麼資料庫,隻要有對應的資料庫JDBC驅動,在
Java程式中使用統一的類和接口就能完成對資料庫的操作了。
1.2JDBC3.0API
JDBC3.0版本主要是由java.sql和javax.sql包組成
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5yYzQjM0gTYxMzYhVmN5YDZygDMxITN0gDM4U2MidDOm9CX5AzLclDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL4M3Lc9CX6MHc0RHaiojIsJye.png)
java.sql包中的接口和類
主要完成基本資料庫操作:
- 建立資料庫連接配接對象
- 建立執行sql語句Statement對象或者preparedstatement
- 建立結果集對象ResultSet
還有一些進階的資料庫操作的處理:
- 批處理更新
- 事務隔離
- 可滾動結果集
javax.sql包中的接口和類
主要完成進階資料庫操作,如為連接配接管理、分布式事務等引入了容器管理的連接配接池
這裡隻有DriverManager是class,其他的都是Interface
DriverManager類
管理 注冊的驅動程式,獲得與應用程式到資料庫的連結對象
常用方法:
public static Connection getConnection(String url,String user, String password)
Connection接口
statement接口
PreparedStatement接口
CallableStatement接口
ResultSet接口
1.3JDBC驅動程式類型
類型1:JDBC-ODBC橋驅動程式
在類型1驅動程式中,JDBC橋接器用于通路安裝在每台客戶機上的ODBC驅動程式。 使用ODBC需要在系統上配置表示目标資料庫的資料源名稱(DSN)。
當Java第一次出現時,這是一個驅動程式,因為大多數資料庫僅支援ODBC通路,但現在這種類型的驅動程式僅推薦用于實驗性使用或沒有其他替代方案時使用。
類型2:JDBC本地API
在類型2驅動程式中,JDBC API調用将轉換為本地C/C++ API調用,這是資料庫唯一的。 這些驅動程式通常由資料庫供應商提供,并以與JDBC-ODBC橋接相同的方式使用。 必須在每個客戶機上安裝供應商特定的驅動程式。
如果要更改資料庫,則必須更改原生API,因為它特定于資料庫,并且現在大部分已經過時,但是使用類型2驅動程式實作了一些擴充功能的開發,它消除了ODBC的開銷。
類型3:中間件驅動程式,同時通路多個資料庫
在類型3驅動程式中,使用三層方法通路資料庫。 JDBC用戶端使用标準網絡套接字與中間件應用程式伺服器進行通信。 套接字資訊随後由中間件應用伺服器轉換成DBMS所需的調用格式,并轉發到資料庫伺服器。
這種驅動程式是非常靈活的,因為它不需要在用戶端上安裝代碼,一個驅動程式實際上可以提供多個資料庫的通路。
類型4:100%純Java
在類型4驅動程式中,基于純Java的驅動程式通過套接字連接配接與供應商的資料庫直接通信。 這是資料庫可用的最高性能驅動程式,通常由供應商自己提供。
這種驅動是非常靈活的,不需要在用戶端或伺服器上安裝特殊的軟體。 此外,這些驅動程式可以動态下載下傳。
二、使用JDBC
2.1項目準備
建構表:
CREATE TABLE USER(
id INT NOT NULL AUTO_INCREMENT,
NAME VARCHAR(50) DEFAULT NULL,
PASSWORD VARCHAR(50) DEFAULT NULL,
sex VARCHAR(10) DEFAULT NULL,
birthday DATETIME DEFAULT NULL,
PRIMARY KEY(id)
)ENGINE = INNODB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8;
建立項目,添加JDBC驅動程式
右擊項目,點選build path,選擇Configure build path
點選添加外部jar包
2.2使用JDBC
import java.sql.Connection;
import java sql.DriverManager;
import java sql.ResultSet;
import java sql.Statement;
import java sql.SQLException;
public class JdbcTest{
public static void main(String args[]){
//1.加載驅動程式
Class.forName("com.mysql.jdbc.Driver");
//2.建立連接配接對象
String url = "jdbc::mysql:localhost:3308/testjdbc";
String dbUser = "root";
String dbPassword = "root";
Connection conn = DriverManager.getConnection(url,dbUser,dbPassword);
//3.建立Statement對象執行sql語句
String sql ="select * from user;";
Statement st =
//4.周遊結果集對象
//5.依次關閉資源對象
}
}
1.加載驅動程式
使用
Class.forName()
方法顯示加載資料庫MYSQL5的JDBC的驅動程式
Class.forName("com.mysql.jdbc.Driver")
如果是MYSQL8的話
Class.forName("com.mysql.cj.jdbc.Driver")
Class.forName()
這個方法的加載參數forName所指定的類檔案,如果找不到className指定的類檔案,該方法會抛出ClassNotFoundException
public static Class<?> forName(String className)throws ClassNotFoundException {
Class<?> caller = Reflection.getCallerClass();
return forName0(className, true, ClassLoader.getClassLoader(caller), caller);
}
2.建立連接配接對象
加載之後的驅動程式中,getConnection方法可以得到從應用程式到資料庫的連接配接對象,即Connection類型的對象
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost")
url的一般形式: jdbc:<subprotocol>://
jdbc表示java程式連接配接資料庫的協定是jdbc
子協定主要用于識别資料庫驅動程式,不同資料庫驅動程式的子協定不同
資料源的名字包括資料庫的ip位址+端口号+資料庫名稱
DriverManager的getConnection方法:
getConnection(String url,String name,String password)
3.建立Statement對象執行sql 語句
Connection方法裡面寫了建立statement對象的方法
- 先定義sql語句
String sql = "select * from user";
- 然後調用Connection對象的createStatement方法來獲得Statement對象的方法獲得Statement類型的對象
Statement st = conn.createStatement();
- 使用Statement對象的executeQuery方法來查詢,傳回查詢結果集的對象
ResultSet rs = st.executeQuery(sql);
4.周遊結果集對象
while(rs.next){
int id = rs.getInt("id");
String name = rs.getString("name");
String password = rs.getString("password");
String sex = rs.getString("sex");
Date birthday = rs.getDate("birthday");
System.out.println("id = "+id+";name = "+name+";password = "+password +";sex = "+sex+";birthday = "+birthday);
}
rs.next方法的傳回值是Boolean,每次調用會下移一行。