目錄
一、JDBC
1. JDBC相關類與接口
1.1?DriverManager
1.2 Connection
1.3 Statement
4.ResultSet
2. JDBC工作原理
二、連接mysql數據庫
1. 導入jar包
2. 使用DriverManager加載驅動類
3. Connection接口
4.?Statement接口
5. ResultSet接口?
?編輯
6. 關閉并釋放資源?
三、測試
1. 連接測試
2. 添加測試
3. 修改測試
4.?查詢測試
四、不同數據庫廠商實現-MySQL和Oracle?
MySQL實現
Oracle實現
一、JDBC
- Java Database Connectivity:Java訪問數據庫的解決方案
- JDBC定義了一套標準接口,即訪問數據庫的通用API, 不同的數據庫廠商根據各自數據庫的特點去實現這些接口。
- JDBC希望用相同的方式訪問不同的數據庫,讓具體的數據庫操作與數據庫廠商實現無關,從而在不同數據庫之間輕易的進行切換?
1. JDBC相關類與接口
- Driver 接口:加載驅動程序。
- DriverManager 類:裝人所需的 JDBC 驅動程序,編程時調用它的方法來創建連接。
- Connection 接口:編程時使用該類對象創建 Statement 對象。
- Statement 接口:編程時使用該類對象得到 ResultSet 對象。
- ResultSet 類:負責保存 Statement 執行后所產生的查詢結果。
1.1?DriverManager
- DriverManager:驅動管理對象
- 注冊驅動(告訴程序該使用哪一個數據庫驅動)
- 在com.mysql.jdbc.Driver類中存在靜態代碼塊(通過查看源碼發現)
//這是com.mysql.jdbc.Driver的靜態代碼塊,只要使用這個類,就會執行這段代碼 //而Class.forName("com.mysql.jdbc.Driver")就正好使用到了這個類 static {try {java.sql.DriverManager.registerDriver(new Driver());} catch (SQLException E) {throw new RuntimeException("Can't register driver!");} }
注意:我們不需要通過DriverManager調用靜態方法registerDriver(),因為只要Driver類被使用,則會執行其靜態代碼塊完成注冊驅動
- 所以后邊我們其實可以省略注冊驅動的步驟(可以注釋掉上個案例的注冊驅動的步驟,也可以查詢到數據)
- mysql5之后可以省略注冊驅動的步驟。在jar包中,存在一個java.sql.Driver配置文件,文件中指定了com.mysql.jdbc.Driver
獲取數據庫連接(獲取到數據庫的連接并返回連接對象)
- static Connection getConnection(String url, String user, String password);
- 返回值:Connection數據庫連接對象
- 參數
- url:指定連接的路徑。語法:jdbc:mysql://ip地址(域名):端口號/數據庫名稱
- user:用戶名
- password:密碼
1.2 Connection
- Connection:數據庫連接對象
- 獲取執行者對象
- 獲取普通執行者對象:Statement createStatement();
- 獲取預編譯執行者對象:PreparedStatement prepareStatement(String sql);
- 管理事務
- 開啟事務:setAutoCommit(boolean autoCommit); 參數為false,則開啟事務。
- 提交事務:commit();
- 回滾事務:rollback();
- 釋放資源
- 立即將數據庫連接對象釋放:void close();
1.3 Statement
- Statement:執行sql語句的對象
- 執行DML語句:int executeUpdate(String sql);
- 返回值int:返回影響的行數。
- 參數sql:可以執行insert、update、delete語句。
- 執行DQL語句:ResultSet executeQuery(String sql);
- 返回值ResultSet:封裝查詢的結果。
- 參數sql:可以執行select語句。
- 釋放資源
- 立即將執行者對象釋放:void close();
4.ResultSet
- ResultSet:結果集對象
- 判斷結果集中是否還有數據:boolean next();
- 有數據返回true,并將索引向下移動一行
- 沒有數據返回false
- 獲取結果集中的數據:XXX getXxx(“列名”);
- XXX代表數據類型(要獲取某列數據,這一列的數據類型)
- 例如:String getString(“name”); int getInt(“age”);
- 釋放資源
- 立即將結果集對象釋放:void close();
2. JDBC工作原理
二、連接mysql數據庫
1. 導入jar包
- 創建一個 lib 目錄
- ?將mysql-connector-java-8.0.15驅動復制進去
- ?右鍵添加路徑?Eclipse: Build Path
2. 使用DriverManager加載驅動類
- 加載驅動類
- 通過Class.forName( )方法(反射) 完成驅動類的注冊
找到驅動類 右鍵復制全路徑
3. Connection接口
根據URL連接參數找到與之匹配的Driver對象, 調用其方法獲取連接
注:Connection只是接口!真正的實現是數據庫廠商提供的驅動包完成的。
jdbc:mysql://localhost:3306/myhomework03?serverTimezone=GMT
4.?Statement接口
Statement用于執行SQL語句
注:不同的SQL語句,要調用不同的方法來執行。
Statementstmt = conn.createstatement();int count= stmt.executeUpdate(sql); ResultSet rs=stmt.executeQuery(sql);
Statement用于執行DML
int count = stmt.executeUpdate(sq1);
Statement用于執行DQL
ResultSet rs =stmt.executeQuery(sql);
5. ResultSet接口?
Statement用于執行DQL
ResultSet rs =stmt.executeQuery(sql);
執行查詢SQL語句后返回的結果集,由 ResultSet接口接收。
常用處理方式:遍歷/判斷是否有結果
String sql="select *from emp"; ResultSet rsstmt.executeQuery(sql);
查詢結果存放在ResultSet對象的一系列行中
- ResultSet對象的最初位置在行首
- ResultSet.next()方法用來在行間移動
- ResultSet.getXXX()方法用來取得字段的內容
遍歷ResultSet
while(rs.next()){ int empno = rs.getInt("empno"); String ename = rs.getstring("ename")System.out.println(empno+","+ename); }
6. 關閉并釋放資源?
數據庫操作執行完畢以后要釋放相關資源
- Connection?
- Statement
- ResultSet
rs.close(); stmt.close(); Conn.close();
三、測試
1. 連接測試
public class TestConn {public static void main(String[] args) throws ClassNotFoundException, SQLException {// 1. 加載驅動 com.mysql.cj.jdbc.Driver.classClass.forName("com.mysql.cj.jdbc.Driver");// 2. 獲取連接對象 urlString url = "jdbc:mysql://localhost:3306/myhomework03?serverTimezone=GMT";String user = "root";String pwd = "123456";Connection conn = DriverManager.getConnection(url, user, pwd);// 測試System.out.println(conn);// 3. 釋放資源conn.close();}
測試成功
2. 添加測試
public class TestAdd {public static void main(String[] args) throws SQLException, ClassNotFoundException {// 1. 加載驅動Class.forName("com.mysql.cj.jdbc.Driver");// 2. 獲取連接Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/myhomework03?serverTimezone=GMT","root", "123456");// 3. 創建一條sql語句String sql = "insert into student(sname,birthday,ssex,classid) values('凹凸曼','1999-4-4','男',1)";// 3.1 創建執行sql語句的對象Statement statement = conn.createStatement();// 3.2 執行sql語句int ret = statement.executeUpdate(sql);// 邏輯if (ret > 0) {System.out.println("添加成功");} else {System.out.println("添加失敗");}// 4. 釋放資源 JDBC資源都是先獲取的后釋放statement.close();conn.close();}
?測試成功
3. 修改測試
public class TestUpdate {public static void main(String[] args) throws ClassNotFoundException, SQLException {Scanner input = new Scanner(System.in);// 1. 加載驅動Class.forName("com.mysql.cj.jdbc.Driver");// 2. 獲取連接Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/myhomework03?serverTimezone=GMT","root", "123456");// 3. sql語句System.out.println("要修改哪個學生,請寫出編號:");int sid = input.nextInt();System.out.println("修改學生姓名:");String sname = input.next();System.out.println("修改學生生日(yyyy-MM-dd):");String bir = input.next();System.out.println("修改學生性別:");String sex = input.next();System.out.println("修改學生班級編號:");int classid = input.nextInt();String sql = "update student set sname='" + sname + "',birthday='" + bir + "'," + "ssex='" + sex + "',classid="+ classid + " where sid =" + sid;Statement statement = conn.createStatement();int ret = statement.executeUpdate(sql);if (ret > 0) {System.out.println("修改成功");} else {System.out.println("修改失敗");}// 釋放資源statement.close();conn.close();}
?測試成功
4.?查詢測試
public static void main(String[] args) throws ClassNotFoundException, SQLException {// 1. 加載驅動Class.forName("com.mysql.cj.jdbc.Driver");// 2. 獲取連接Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/myhomework03?serverTimezone=GMT", "root","123456");// 3. sqlString sql = "select birthday,sid,classid,sname,ssex from student";Statement statement = conn.createStatement();ResultSet rs = statement.executeQuery(sql);// 解析結果集while (rs.next()) { // int sid = rs.getInt(1); // jdbc相關索引都是從1開始 // String sname = rs.getString(2); // Date bir = rs.getDate(3); // String sex = rs.getString(4); // int classid = rs.getInt(5);// 推薦int sid = rs.getInt("sid");Date bir = rs.getDate("birthday");String sname = rs.getString("sname");String sex = rs.getString("ssex");int classid = rs.getInt("classid");System.out.println(sid + sname + bir + sex + classid);}// 4.釋放資源rs.close();statement.close();conn.close();}
四、不同數據庫廠商實現-MySQL和Oracle?
MySQL實現
- 下載對應的數據庫驅動jar包 mysql-connector-java-5.0.4-bin.jar
- 將驅動jar包加載到項目中 Eclipse:BuildPath
- 加載驅動類 Class.forName(“com.mysql.jdbc.Driver”)
Oracle實現
- 下載對應的數據庫驅動jar包 ojdbc6.jar/ojdbc14.jar
- 將驅動jar包加載到項目中 Eclipse:BuildPath
- 加載驅動類 Class.forName(“oracle.jdbc.OracleDriver”)