Mysql入門【JDBC】
回顧
表連線的分類
表連線 | 分類 | 語法 |
---|---|---|
內連線 | 隱式 | SELECT 欄位 FROM 左表, 右表 WHERE 條件; |
顯式 | SELECT 欄位 FROM 左表, INNER JOIN 右表 ON 條件; | |
外連線 | 左外 | SELECT 欄位 FROM 左表 LEFT OUTER JOIN 右表 ON 條件; |
右外 | SELECT 欄位 FROM 左表 RIGHT OUTER JOIN 右表 ON 條件; |
子查詢的三種情況
子查詢的結果 | 使用運算子 |
---|---|
單行單列 | 作為條件 |
多行單列 | 作為條件 in |
多行多列 | 作為虛擬表 |
手動提交事務
功能 | MySQL語句 |
---|---|
開啟事務 | start transaction; |
提交事務 | commit; |
回滾事務 | rollback; |
事務的四大特性
事務特性 |
---|
原子性 |
一致性 |
隔離性 |
永續性 |
學習目標
- 能夠理解JDBC的概念
- 能夠使用Connection介面
- 能夠使用Statement介面
- 能夠使用ResultSet介面
- 能夠使用JDBC實現對單表資料增、刪、改、查
- 能夠使用JDBC操作事務
- 能夠編寫JDBC工具類
- 能夠完成JDBC實現登入案例
1. JDBC的概念
目標
- 能夠掌握JDBC的概念
- 能夠理解JDBC的作用
講解
客戶端操作MySQL資料庫的方式
- 使用第三方客戶端來訪問MySQL:SQLyog、Navicat、SQLWave、MyDB Studio、EMS SQL Manager for MySQL
- 使用MySQL自帶的命令列方式
- 通過Java來訪問MySQL資料庫,今天要學習的內容
什麼是JDBC:Java Data Base Connectivity:(Java資料庫連線) JDBC是Java訪問資料庫的標準規範
JDBC的作用:Java通過JDBC就可以運算元據庫
JDBC的由來
-
直接寫程式碼運算元據庫
直接寫程式碼運算元據庫存在的問題:
- 不知道MySQL資料庫的操作方式,解析方式
- 程式碼繁瑣,寫起來麻煩
- MySQL和Oracle等其他資料庫的操作方式和解析方式不同,每個資料庫都要寫一套程式碼
- MySQL和Oracle等其他資料庫相互切換麻煩
-
JDBC規範定義介面,具體的實現由各大資料庫廠商來實現
JDBC是Java訪問資料庫的標準規範。真正怎麼運算元據庫還需要具體的實現類,也就是資料庫驅動。每個資料庫廠商根據自家資料庫的通訊格式編寫好自己資料庫的驅動。所以我們只需要會呼叫JDBC介面中的方法即可。資料庫驅動由資料庫廠商提供。
JDBC的好處
- 我們只需要會呼叫JDBC介面中的方法即可,使用簡單
- 使用同一套Java程式碼,進行少量的修改就可以訪問其他JDBC支援的資料庫
小結
- 說出JDBC的概念?
Java資料庫連線(Java運算元據庫的標準規範) - 說出JDBC的作用?
Java通過JDBC就可以運算元據庫
2. JDBC核心API的介紹
目標
能夠理解JDBC四個核心物件
講解
JDBC會用到的包
- java.sql:JDBC訪問資料庫的基礎包,在JavaSE中的包。如:java.sql.Connection
- javax.sql: JDBC訪問資料庫的擴充套件包
- 資料庫的驅動,各大資料庫廠商來實現。如:MySQL的驅動:com.mysql.jdbc.Driver
JDBC四個核心物件
這幾個類都是在java.sql包中
- DriverManager: 用於註冊驅動
- Connection: 表示與資料庫建立的連線
- Statement: 執行SQL語句的物件
- ResultSet: 結果集或一張虛擬表
JDBC訪問資料庫的步驟
-
由DriverManager註冊驅動程式
-
建立連線物件Connection
-
由客戶端傳送SQL語句給伺服器執行,SQL語句封裝成Statement物件
-
查詢到的結果集封裝成ResultSet物件
-
在客戶端可以從ResultSet中取出資料
-
釋放資源,關閉連線物件
小結
JDBC四個核心物件?
-
DriverManager: 用於註冊驅動
-
Connection: 表示與資料庫建立的連線
-
Statement: 執行SQL語句的物件
-
ResultSet: 結果集或一張虛擬表
3. JDBC註冊驅動
Connection
表示Java程式與資料庫之間的連線,只有拿到Connection才能運算元據庫。
JDBC獲取連線步驟
1.匯入mysql驅動Jar包
2.註冊驅動
3.獲取連線
目標
能夠匯入mysql驅動Jar包
能夠通過JDBC註冊資料庫驅動
講解
匯入驅動Jar包
右鍵jar包--------->Add As Library
註冊驅動
我們Java程式需要通過資料庫驅動才能連線到資料庫,因此需要註冊驅動。
MySQL的驅動的入口類是:com.mysql.jdbc.Driver
API介紹
java.sql.DriverManager
類用於註冊驅動。提供如下方法註冊驅動
static void registerDriver(Driver driver)
向 DriverManager 註冊給定驅動程式。
註冊驅動的兩種方式
1. 靜態方法註冊
DriverManager.registerDriver(驅動物件); 傳入對應引數即可
【案例程式碼】
public class Demo01 {
public static void main(String[] args) throws Exception {
// 註冊驅動
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
}
}
通過查詢com.mysql.jdbc.Driver原始碼,我們發現Driver類“主動”將自己進行註冊
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
static {
try {
// 自己自動註冊
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
public Driver() throws SQLException {
}
}
注意:使用
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
,存在兩方面不足
- 硬編碼,後期不易於程式擴充套件和維護
- 驅動被註冊兩次
2.直接載入類檔案
使用Class.forName("com.mysql.jdbc.Driver");
載入驅動,這樣驅動只會註冊一次
public class Demo01 {
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver"); // 後期可以將"com.mysql.jdbc.Driver"字串寫在檔案中.
}
}
演示:Class.forName("包名.類名");
會走這個類的靜態程式碼塊
通常開發我們使用Class.forName() 載入驅動。Class.forName("com.mysql.jdbc.Driver");
會走Driver類的靜態程式碼塊。在靜態程式碼塊中註冊一次驅動。
總結:註冊MySQL驅動使用
Class.forName("com.mysql.jdbc.Driver");
小結
-
匯入mysql驅動Jar包
-
通過JDBC註冊資料庫驅動?
Class.forName("com.mysql.jdbc.Driver");//好處,靈活,只會載入一次
4. 獲取連線
學習目標
能夠通過JDBC獲取資料庫連線
講解
API介紹
java.sql.DriverManager
類中有如下方法獲取資料庫連線
static Connection getConnection(String url, String user, String password)
連線到給定資料庫 URL ,並返回連線。
引數說明
String url
:連線資料庫的URL,用於說明連線資料庫的位置String user
:資料庫的賬號String password
:資料庫的密碼
連線資料庫的URL地址格式:協議名:子協議://伺服器名或IP地址:埠號/資料庫名?引數=引數值
MySQL寫法:jdbc:mysql://localhost:3306/test
如果是本地伺服器,埠號是預設的3306,則可以簡寫:jdbc:mysql:///test
注意事項
如果資料出現亂碼需要加上引數: ?characterEncoding=utf8,表示讓資料庫以UTF-8編碼來處理資料。
如: jdbc:mysql://localhost:3306/test?characterEncoding=utf8
使用步驟
1.DriverManager.getConnection(url, user, password); 傳入對應引數即可
案例程式碼
public class Demo01 {
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
// 連線到MySQL
// url: 連線資料庫的URL
// user: 資料庫的賬號
// password: 資料庫的密碼
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day24", "root", "root");
System.out.println(conn);
}
}
案例效果
1.連線成功
2.連線失敗
小結
-
JDBC獲取資料庫連線使用哪個API?
DriverManager.getConnection(資料庫url, 賬號, 密碼)
-
通過JDBC連線mysql的URL寫法?
jdbc:mysql://localhost:3306/資料庫
5. JDBC實現對單表資料增、刪、改
目標
通過JDBC實現對單表資料增、刪、改
講解
準備資料
-- 建立分類表
CREATE TABLE category (
cid INT PRIMARY KEY AUTO_INCREMENT,
cname VARCHAR(100)
);
-- 初始化資料
INSERT INTO category (cname) VALUES('家電');
INSERT INTO category (cname) VALUES('服飾');
INSERT INTO category (cname) VALUES('化妝品');
JDBC實現對單表資料增、刪、改
我們要對資料庫進行增、刪、改、查,需要使用Statement
物件來執行SQL語句。
API介紹
獲取Statement物件
在java.sql.Connection
介面中有如下方法獲取到Statement
物件
Statement createStatement()
建立一個 Statement 物件來將 SQL 語句傳送到資料庫
Statement的API介紹
-
boolean execute(String sql) 此方法可以執行任意sql語句。返回boolean值,表示是否返回ResultSet結果集。僅當執行select語句,且有返回結果時返回true, 其它語句都返回false;
-
int executeUpdate(String sql) 根據執行的DML(INSERT、UPDATE、DELETE)語句,返回受影響的行數
-
ResultSet executeQuery(String sql) 根據查詢語句返回結果集,只能執行SELECT語句
注意:在MySQL中,只要不是查詢就是修改。
executeUpdate:用於執行增刪改
executeQuery:用於執行查詢
使用步驟
- 註冊驅動
- 獲取連線
- 獲取Statement物件
- 使用Statement物件執行SQL語句
- 釋放資源
案例程式碼
public class Demo03 {
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql:///day24", "root", "root");
System.out.println(conn);
// 從連線中拿到一個Statement物件
Statement stmt = conn.createStatement();
// 1.插入記錄
String sql = "INSERT INTO category (cname) VALUES ('手機');";
int i = stmt.executeUpdate(sql);
System.out.println("影響的行數:" + i);
// 2.修改記錄
sql = "UPDATE category SET cname='汽車' WHERE cid=4;";
i = stmt.executeUpdate(sql);
System.out.println("影響的行數:" + i);
// 3.刪除記錄
sql = "DELETE FROM category WHERE cid=1;";
i = stmt.executeUpdate(sql);
System.out.println("影響的行數:" + i);
// 釋放資源
stmt.close();
conn.close();
}
}
案例效果
6. JDBC實現對單表資料查詢
目標
能夠掌握JDBC實現對單表資料查詢
講解
ResultSet
用於儲存執行查詢SQL語句的結果。
我們不能一次性取出所有的資料,需要一行一行的取出。
ResultSet的原理
- ResultSet內部有一個指標,剛開始記錄開始位置
- 呼叫next方法, ResultSet內部指標會移動到下一行資料
- 我們可以通過ResultSet得到一行資料 getXxx得到某列資料
ResultSet獲取資料的API
其實ResultSet獲取資料的API是有規律的get後面加資料型別。我們統稱getXXX()
使用JDBC查詢資料庫中的資料的步驟
- 註冊驅動
- 獲取連線
- 獲取到Statement
- 使用Statement執行SQL
- ResultSet處理結果
- 關閉資源
案例程式碼
public class Demo04 {
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql:///day24", "root", "root");
Statement stmt = conn.createStatement();
String sql = "SELECT * FROM category;";
ResultSet rs = stmt.executeQuery(sql);
// 內部有一個指標,只能取指標指向的那條記錄
while (rs.next()) { // 指標移動一行,有資料才返回true
// 取出資料
int cid = rs.getInt("cid");
String cname = rs.getString("cname");
System.out.println(cid + " == " + cname);
}
// 關閉資源
rs.close();
stmt.close();
conn.close();
}
}
注意:
- 如果游標在第一行之前,使用rs.getXXX()獲取列值,報錯:Before start of result set
- 如果游標在最後一行之後,使用rs.getXXX()獲取列值,報錯:After end of result set
案例效果
小結
其實我們使用JDBC運算元據庫的步驟都是固定的。不同的地方是在編寫SQL語句
-
註冊驅動
Class.forName("com.mysql.jdbc.Driver")
-
獲取連線
Connection conn =DriverManager.getConnection(String url,String user,String password)
-
獲取到Statement
Statement state = conn.createStatement();
-
使用Statement執行SQL
public boolean execute(String sql):執行任何的sql語句 public int executeUpdate(String sql) :執行 Insert delete update public ResultSet executeQuery(String sql): 執行 select
-
ResultSet處理結果
ResultSet rs = state.executeQuery("select * from category"); while(rs.next()){ 值 = rs.getXxx(列名); 值 = rs.getXxx(列索引); // 索引從1開始 }
-
關閉資源
rs.close(); state.close(); conn.close();
ResultSet如何獲取資料?
- 呼叫next方法, ResultSet內部指標會移動到下一行資料
- 我們可以通過ResultSet得到一行資料 getXxx得到某列資料
7. JDBC事務
目標
能夠掌握JDBC操作事務
講解
之前我們是使用MySQL的命令來操作事務。接下來我們使用JDBC來操作銀行轉賬的事務。
準備資料
CREATE TABLE account (
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(10),
balance DOUBLE
);
-- 新增資料
INSERT INTO account (NAME, balance) VALUES ('張三', 1000), ('李四', 1000);
API介紹
Connection
介面中與事務有關的方法
-
void setAutoCommit(boolean autoCommit) throws SQLException; false:開啟事務, ture:關閉事務 java-->setAutoCommit(false) <==> sql->start transaction;
-
void commit() throws SQLException; 提交事務 <==> commit;
-
void rollback() throws SQLException; 回滾事務 <==> roallback;
使用步驟
- 註冊驅動
- 獲取連線
- 開啟事務
- 獲取到Statement
- 使用Statement執行SQL
- 提交或回滾事務
- 關閉資源
案例程式碼
public class Demo05 {
public static void main(String[] args) {
Connection conn = null;
try {
// 拿到連線
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql:///day24", "root", "root");
// 開啟事務
conn.setAutoCommit(false);
Statement pstmt = conn.createStatement();
// 張三減500
String sql = "UPDATE account SET balance = balance - 500 WHERE id=1;";
pstmt.executeUpdate(sql);
// 模擬異常
// int i = 10 / 0;
// 李四加500
sql = "UPDATE account SET balance = balance + 500 WHERE id=2;";
pstmt.executeUpdate(sql);
pstmt.close();
// 成功,提交事務
System.out.println("成功,提交事務");
conn.commit();
} catch (Exception e) {
// 失敗,回滾事務
try {
System.out.println("出了異常,回滾事務");
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
} finally {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
案例效果
小結
JDBC中與事務相關的API?Connection
介面中setAutoCommit,commit,rollback
JDBC操作事務的步驟?
- 註冊驅動
- 獲取連線
- 獲取到Statement
- 開啟事務
- 使用Statement執行SQL
- 提交或回滾事務
- 關閉資源
8. 編寫JDBC工具類
目標
能夠編寫JDBC獲取連線與關閉連線工具類
講解
需求: 建立一張員工表,包含id,name,age,address欄位.定義新增員工,修改員工,刪除員工方法運算元據庫。
通過上面案例需求我們會發現每次去執行SQL語句都需要註冊驅動,獲取連線,得到Statement,以及釋放資源。發現很多重複的勞動,我們可以將重複的程式碼定義到某個類的方法中。直接呼叫方法,可以簡化程式碼。
那麼我們接下來定義一個JDBCUtils
類。把註冊驅動,獲取連線,得到Statement,以及釋放資源的程式碼放到這個類的方法中。以後直接呼叫方法即可。
編寫步驟
- 將固定字串定義為常量
- 在靜態程式碼塊中註冊驅動(只註冊一次)
- 提供一個獲取連線的方法
static Connection getConneciton();
- 定義關閉資源的方法
close(AutoCloseable... resource)
案例程式碼
JDBCUtils.java
import java.io.IOException;
import java.sql.*;
public class JDBCUtils {
// 1.將固定字串定義為常量
private static final String DRIVER_CLASS = "com.mysql.jdbc.Driver";
private static final String URL = "jdbc:mysql:///day04";
private static final String USER = "root";
private static final String PASSWORD = "root";
// 2.在靜態程式碼塊中註冊驅動(只註冊一次)
// 當這個類載入到記憶體的時候就走這個靜態程式碼塊,再去觸發Driver類中的靜態程式碼塊,主動註冊
static {
try {
Class.forName(DRIVER_CLASS);
} catch (ClassNotFoundException e) {
}
}
// 3.提供一個獲取連線的方法static Connection getConneciton();
// 我們面向JDBC程式設計
public static Connection getConnection() throws SQLException, IOException {
//有兩種方式:如下
//第一種方式:
// 可以將使用者名稱【user=root】和密碼【password=root】放到配置檔案jdbc.properties,
//配置檔案可以放到src目錄中,用以下載入方式
/* InputStream is = JDBCUtils.class.getResourceAsStream("/jdbc.properties");
Properties pp = new Properties();
pp.load(is);
Connection conn = DriverManager.getConnection(URL, pp);
*/
// 第二種方式:
// 直接使用靜態常量定義的使用者名稱和密碼
Connection conn = DriverManager.getConnection(URL, USER,PASSWORD);
return conn;
}
//4.定義關閉資源方法
//Connection,Statement,ResultSet 都實現了AutoCloseable介面
public static void close(AutoCloseable... resource) {
for (AutoCloseable r : resource) {
try {
if (r != null) {
r.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
Demo06.java
public class Demo06 {
public static void main(String[] args) throws Exception {
createTable();
// addEmployee();
// updateEmployee();
// deleteEmployee();
}
// 刪除員工
public static void deleteEmployee() throws Exception {
Connection conn = JDBCUtils.getConnection();
Statement stmt = conn.createStatement();
// 刪除id為3的員工
String sql = "DELETE FROM employee WHERE id=3;";
int i = stmt.executeUpdate(sql);
System.out.println("影響的行數: " + i);
// stmt.close();
// conn.close();
// JDBCUtils.close(conn, stmt, null);
JDBCUtils.close(conn, stmt);
}
// 修改員工
public static void updateEmployee() throws Exception {
Connection conn = JDBCUtils.getConnection();
Statement stmt = conn.createStatement();
// 將id為3的員工姓名改成田七,地址改成天津
String sql = "UPDATE employee SET address='天津', name='田七' WHERE id=3;";
int i = stmt.executeUpdate(sql);
System.out.println("影響的行數: " + i);
// stmt.close();
// conn.close();
// JDBCUtils.close(conn, stmt, null);
JDBCUtils.close(conn, stmt);
}
// 定義新增員工
public static void addEmployee() throws Exception {
Connection conn = JDBCUtils.getConnection();
Statement stmt = conn.createStatement();
// 新增4個員工
String sql = "INSERT INTO employee VALUES (NULL, '張三4', 20, '北京'),"
+ " (NULL, '李四4', 21, '南京'),"
+ " (NULL, '王五4', 18, '東京'),"
+ " (NULL, '趙六4', 17, '西安');";
int i = stmt.executeUpdate(sql);
System.out.println("影響的行數: " + i);
// stmt.close();
// conn.close();
// JDBCUtils.close(conn, stmt, null);
JDBCUtils.close(conn, stmt);
}
// 建立表
public static void createTable() throws Exception {
Connection conn = JDBCUtils.getConnection();
Statement stmt = conn.createStatement();
String sql = "CREATE TABLE IF NOT EXISTS employee ("
+ " id INT PRIMARY KEY AUTO_INCREMENT,"
+ " name VARCHAR(20) UNIQUE NOT NULL,"
+ " age INT,"
+ " address VARCHAR(50)"
+ ");";
int i = stmt.executeUpdate(sql);
System.out.println("ok");
// stmt.close();
// conn.close();
// JDBCUtils.close(conn, stmt, null);
JDBCUtils.close(conn, stmt);
}
}
案例效果
9. JDBC實現登入案例
目標
模擬使用者輸入賬號和密碼登入網站
-
輸入正確的賬號,密碼,顯示登入成功
-
輸入錯誤的賬號,密碼,顯示登入失敗
講解
案例分析
- 使用資料庫儲存使用者的賬號和密碼
- 讓使用者輸入賬號和密碼
- 使用SQL根據使用者的賬號和密碼去資料庫查詢資料
- 如果查詢到資料,說明登入成功
- 如果查詢不到資料,說明登入失敗
實現步驟
-
建立一個使用者表儲存使用者的賬號和密碼,並新增一些資料,SQL語句如下:
CREATE TABLE USER ( id INT AUTO_INCREMENT PRIMARY KEY, NAME VARCHAR(50), PASSWORD VARCHAR(50) ); INSERT INTO USER (NAME, PASSWORD) VALUES('admin', '123'), ('test', '123'), ('gm', '123');
-
編寫程式碼讓使用者輸入賬號和密碼
public class Demo07 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("請輸入賬號: "); String name = sc.nextLine(); System.out.println("請輸入密碼: "); String password = sc.nextLine(); }
-
使用SQL根據使用者的賬號和密碼去資料庫查詢資料
public class Demo07 { public static void main(String[] args) throws Exception { // 讓使用者輸入賬號和密碼 Scanner sc = new Scanner(System.in); System.out.println("請輸入賬號: "); String name = sc.nextLine(); System.out.println("請輸入密碼: "); String password = sc.nextLine(); // 使用SQL根據使用者的賬號和密碼去資料庫查詢資料 Connection conn = JDBCUtils.getConnection(); Statement stmt = conn.createStatement(); String sql = "SELECT * FROM user WHERE name='" + name + "' AND password='" + password + "';"; } }
-
如果查詢到資料,說明登入成功,如果查詢不到資料,說明登入失敗
public class Demo07 { public static void main(String[] args) throws Exception { // 讓使用者輸入賬號和密碼 Scanner sc = new Scanner(System.in); System.out.println("請輸入賬號: "); String name = sc.nextLine(); System.out.println("請輸入密碼: "); String password = sc.nextLine(); // 使用SQL根據使用者的賬號和密碼去資料庫查詢資料 Connection conn = JDBCUtils.getConnection(); Statement stmt = conn.createStatement(); String sql = "SELECT * FROM user WHERE name='" + name + "' AND password='" + password + "';"; // 如果查詢到資料,說明登入成功,如果查詢不到資料,說明登入失敗 ResultSet rs = stmt.executeQuery(sql); if (rs.next()) { //能進來查詢到了資料. String name2 = rs.getString("name"); System.out.println("歡迎您," + name2); } else { //查詢不到資料,說明登入失敗 System.out.println("賬號或密碼錯誤..."); } JDBCUtils.close(conn, stmt, rs); } }
小結
登入案例步驟
- 使用資料庫儲存使用者的賬號和密碼
- 讓使用者輸入賬號和密碼
- 使用SQL根據使用者的賬號和密碼去資料庫查詢資料
- 如果查詢到資料,說明登入成功
- 如果查詢不到資料,說明登入失敗
相關文章
- JDBC+MySQL入門實戰(實現CURD的例子)JDBCMySql
- Spring Boot入門(五):使用JDBC訪問MySql資料庫Spring BootJDBCMySql資料庫
- Jdbc從入門到入土JDBC
- JDBC入門(一):Statement物件JDBC物件
- JDBC入門與簡單使用JDBC
- 入門入門入門 MySQL命名行MySql
- Sharding-JDBC 快速入門第一課JDBC
- Sharding-JDBC 使用入門和基本配置JDBC
- MySQL入門MySql
- MySQL入門--MySQL安全MySql
- MySQL入門--mysql命令MySql
- MySQL入門系列:MySQL概述MySql
- Mysql入門【Mysql約束】MySql
- SQL快速入門 ( MySQL快速入門, MySQL參考, MySQL快速回顧 )MySql
- MySQL 入門指南MySql
- 如何入門 MySQLMySql
- MySQL 快速入門MySql
- mySql入門-(二)MySql
- MySQL入門——排序MySql排序
- Mysql - 使用入門MySql
- MYSQL 入門全套MySql
- JDBC基礎入門教程,輕鬆掌握jdbc基礎+核心技術,超全面!JDBC
- JDBC連線mysqlJDBCMySql
- MySQL 基礎入門MySql
- MySQL入門--EVENT(事件)MySql事件
- Mysql 簡單入門MySql
- MySQL的JDBC下載MySqlJDBC
- Java JDBC連線MYsqlJavaJDBCMySql
- MySQL入門系列:檢視MySql
- Mysql系列一:SQL入門MySql
- 入門MySQL——架構篇MySql架構
- MySQL 入門(5):複製MySql
- [MySQL光速入門]027 索引MySql索引
- MySQL入門--儲存引擎MySql儲存引擎
- MySQL入門--表維護MySql
- node+express+mysql入門ExpressMySql
- mysql新手入門隨筆MySql
- MySQL入門系列:MySQL資料型別MySql資料型別