# JDBC
JDBC:(Java Database Connectivity) Java數據庫連接技術。
## jar 包
jar 包就是一組類的集合,為什么要用于域名定義包的原因就在于此,一個項目中可以會引用很多的包,如果包中不能唯一標識一個類,在第三方使用的時候就有可能出現不能引用正確類的問題。
**在 Eclipse 中裝備 jar 文件**
* 在項目目錄下新建一個文件夾 lib ,將 jar 文件拷貝到 lib 目錄;
* 在 build path 菜單中 「libraries」→ 「add jars」關聯進項目;
`JDBC`jar包下載地址
## 使用 JDBC
>[warning] mysql 的 JDBC 驅動 jar 包引入項目中。
**開發步驟:**
1. 選擇數據庫:加載數據庫驅動
2. 連接數據庫
3. 創建數據庫查詢
4. 獲取查詢結果
5. 關閉查詢和連接
在使用 JDBC 的時候,需要關注的幾個問題
* 查詢分為操作類(增加、刪除、修改)和查詢類。
* 要避免重復的創建連接,增加數據庫的連接數。
* 注意異常的處理邏輯,保證沒有未關閉的無效連接存在。
**完整的 JDBC 操作代碼**
~~~
package com.ntdodoke.allBegin;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class Demo {
public static void main(String[] args) {
getDataFromDataBase();
}
public static void getDataFromDataBase() {
Connection conn = null;//Connection是與特定數據庫連接回話的接口
PreparedStatement ps = null;
try {
//1.注冊驅動(靜態方法)(包名+類名),告知JVM使用的是哪一個數據庫的驅動
Class.forName("com.mysql.cj.jdbc.Driver");
//設置連接地址,時間格式和編碼格式(因為版本升級,所以需要加上時間格式)
String url = "jdbc:mysql://localhost:3306/j121study?serverTimezone=UTC&characterEncoding=UTF-8";
String user = "root";
String password = "123456";
//2.連接數據庫
conn=DriverManager.getConnection(url,user,password);
/**
* DriverManager類用來管理數據庫中的所有驅動程序。
* 是JDBC的管理層,作用于用戶和驅動程序之間,跟蹤可用的驅動程序,并在數據庫的驅動程序之間建立連接。
* 此外,DriverManager類中的方法都是靜態方法,所以在程序中無須對它進行實例化,直接通過類名就可以調用。
* DriverManager類的常用方法有getConnection(String url,String user,String password)方法
*/
//3.獲取語句執行平臺,并創建數據庫查詢
//Statement s = conn.createStatement();Statement接口創建之后,可以執行SQL語句,完成對數據庫的增刪改查。然而查詢略顯復雜。
//與 Statement一樣,PreparedStatement也是用來執行sql語句的,與創建Statement不同的是,需要根據sql語句創建PreparedStatement。
//除此之外,還能夠通過設置參數,指定相應的值,而不是Statement那樣使用字符串拼接。
ps = conn.prepareStatement("select * from school where school_name=?");
//該語句為參數保留一個問號作為占位符
ps.setString(1, "渡課教育躍龍路主校區");
//4.執行查詢語句,并獲取查詢結果
ResultSet rs = ps.executeQuery();
while(rs.next()) {
System.out.println(rs.getInt("id"));
System.out.println(rs.getString("address"));
}
conn.close();
ps.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
if(null != conn) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(null != ps) {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
~~~
**考慮了連接創建效率的 JDBC 代碼,以及查詢的字段處理**
~~~
package com;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class Demo2 {
public static void main(String[] args) {
createConn();
for (int i = 1; i <= 100; i++) {
String istr = String.format("%03d", i);
exeUpdate("Jack" + istr, String.valueOf(i), "Java96");
}
exeQuery("Jack");
closeConn();
}
private static Connection conn;
/**
* 創建連接
*/
public static void createConn() {
try {
conn = null;
String url = "jdbc:mysql://localhost:3306/demo2";
String user = "root";
String password = "123456";
// 1. 選擇數據庫:加載數據庫驅動
Class.forName("com.mysql.jdbc.Driver");
// 2. 連接數據庫
conn = DriverManager.getConnection(url, user, password);
} catch (ClassNotFoundException e) {
System.out.println("數據庫驅動沒有找到");
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void exeQuery(String name) {
PreparedStatement ps = null;
try {
// 創建數據庫查詢
ps = conn.prepareStatement("SELECT id,name,code,clazz FROM demo1 WHERE name LIKE ?");
ps.setString(1, name + "%");
// 獲取查詢結果
ResultSet rs = ps.executeQuery();
// 遍歷結果
while (rs.next()) {
int id = rs.getInt("id");
String name1 = rs.getString("name");
String code = rs.getString("code");
String clazz = rs.getString("clazz");
System.out.println("id="+id+",name="+name1+",code="+code+",clazz="+clazz+"");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 5. 關閉查詢
try {
if (null != ps) {
ps.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void exeUpdate(String name, String code, String clazz) {
PreparedStatement ps = null;
try {
// 創建數據庫查詢
ps = conn.prepareStatement("INSERT INTO demo1(name,code,clazz) VALUES(?,?,?)");
ps.setString(1, name);
ps.setString(2, code);
ps.setString(3, clazz);
// 獲取查詢結果
int i = ps.executeUpdate();
System.out.println("一共執行了" + i + "條");
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 5. 關閉查詢
try {
if (null != ps) {
ps.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* 關閉連接
*/
public static void closeConn() {
// 5. 關閉連接
try {
if (null != conn) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
~~~