我發現要學習一個新的知識,首先要搞懂它是什麼?能做什麼?怎麼去做?學習了數據庫的DDL、DML了的基本操作,備操作的數據庫要和java代碼產生連接,我們就必須學會JDBC編程。
目錄
java中JDBC的定義
JDBC,即Java Database Connectivity,java數據庫連接。是一種用於執行SQL語句的Java API,它是Java中的數據庫連接規範。這個API由 java.sql.*,javax.sql.* 包中的一些類和接口組成,它爲Java開發人員操作數據庫提供 了一個標準的API,可以爲多種關係數據庫提供統一訪問。即JDBC是一個連接java程序的數據庫的一個標準,在代碼中的表現是一組 interface。
JDBC使用步驟
創建數據庫連接Connection
1.加載JDBC驅動:
Class.forName("com.mysql.jdbc.Driver");
這樣調用初始化com.mysql.jdbc.Driver類,即將該類加載到JVM方法區,並執行該類的靜態方法塊、靜態屬性。
2.創建數據庫連接:
String url = "jdbc:mysql://127.0.0.1:3306/people?
useSSL=false&characterEncoding=utf8";
String user = "root"; // 連接 mysql 的用戶名
String password = ""; // 連接 mysql 的密碼
Connection connection = DriverManager.getConnection(
url, user, password
);
jdbc:mysql:// :在jdbc中使用mysql的固定協議
127.0.0.1:本機的IP地址(localhost or 本地的域名)
3306:mysql服務器的標準端口
people:默認的數據庫
useSSl:是否使用安全的套接字
characterEncoding=utf8:採用utf-8編碼方式進行編碼
因此可以得出其固定格式是:
jdbc:mysql://服務器地址:端口/數據庫名?參數名=參數值
創建操作命令Statement
Statement statement = connection.createStatement();
使用操作命令來執行SQL
增:
String sql = "INSERT INTO users (id, name) VALUES (1, '東東')";
statement.executeUpdate(sql); // 通過 statement 對象來執行 SQL 語句
刪:
String sql = "DELETE FROM users WHERE id = 1";
statement.executeUpdate(sql); // 通過 statement 對象來執行 SQL 語句
改:
String sql = "UPDATE users SET name = '西西' WHERE id = 1";
statement.executeUpdate(sql); // 通過 statement 對象來執行 SQL 語句
查:
{
Statement statement = connection.createStatement();
String sql = "SELECT id, name FROM users";
ResultSet resultSet = statement.executeQuery(sql);
List<String> nameList = new ArrayList<>();
while (resultSet.next()) {
int id = resultSet.getInt(1); // 下標是從 1 開始的,不是從 0 開始的
int id = resultSet.getInt("id"); // 通過字段名稱獲取
// 結果集馬上需要銷燬,所以通過 List 保存結果
nameList.add(name);
System.out.println(id + ", " + name);
}
resultSet.close();
statement.close();
}
-需要拿到結果集對象,從結果集對象中遍歷獲取數據,銷燬結果集對象[反向銷燬]
-不同的類型調用不同的方法
int r = resultSet.getInt();
long r = resultSet.getLong();
String r = resultSet.getString();
-獲取屬性的兩種方法
int id = resultSet.getInt(1);
String name = resultSet.getString("name");
注意下標是從1開始的。
處理結果集ResultSet
while (resultSet.next()) {
int id = resultSet.getInt(1); // 下標是從 1 開始的,不是從 0 開始的
int id = resultSet.getInt("id"); // 通過字段名稱獲取
// 結果集馬上需要銷燬,所以通過 List 保存結果
nameList.add(name);
System.out.println(id + ", " + name);
}
next()的作用:1.返回false或true 2.判斷是否還有數據
釋放資源
resultSet.close();
statement.close();
完整代碼
public class Demo {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
String url = "jdbc:mysql://127.0.0.1:3306/people?useSSL=false&characterEncoding=utf8";
String user = "root"; // 連接 mysql 的用戶名
String password = ""; // 連接 mysql 的密碼
Connection connection = DriverManager.getConnection(
url, user, password
);
/*
Statement statement = connection.createStatement();
String sql = "INSERT INTO users (id, name) VALUES (1, '東東') ,(2,'西西'),(3,'南南'),(4,'北北')";
statement.executeUpdate(sql); // 通過 statement 對象來執行 SQL 語句
statement.close();
*/
/*
String sql = "UPDATE users SET name = '西西' WHERE id = 1";
statement.executeUpdate(sql); // 通過 statement 對象來執行 SQL 語句
*/
/*
String sql = "DELETE FROM users WHERE id = 1";
statement.executeUpdate(sql); // 通過 statement 對象來執行 SQL 語句
*/
{
Statement statement = connection.createStatement();
String sql = "SELECT id, name FROM users";
ResultSet resultSet = statement.executeQuery(sql);
List<String> nameList = new ArrayList<>();
while (resultSet.next()) {
/*
需要不同的類型,調用不同的方法
int r = resultSet.getInt();
long r = resultSet.getLong();
String r = resultSet.getString();
*/
/*
int id = resultSet.getInt(1); // 下標是從 1 開始的,不是從 0 開始的
int id = resultSet.getInt("id"); // 通過字段名稱獲取
*/
int id = resultSet.getInt(1);
String name = resultSet.getString("name");
// 結果集馬上需要銷燬,所以通過 List 保存結果
nameList.add(name);
System.out.println(id + ", " + name);
}
resultSet.close();
statement.close();
}
}
}
一般來說Driver註冊只需要一次,Connection也只需要一次(特殊情況需要多個連接)。獲取多個Statement,每個statement最好只執行一條sql。
JDBC常用接口和類
數據庫連接Connection
Connection接口實現類由數據庫提供,獲取Connection對象通常有兩種方式:
一種是通過DriverManager(驅動管理類)的靜態方法獲取:
//加載JDBC驅動程序
Class.forName("com.mysql.jdbc.Driver");
//創建數據庫連接
Connectionconnection=DriverManager.getConnection(url);
一種是通過DataSource(數據源)對象獲取:
DataSourceds=newMysqlDataSource();
((MysqlDataSource)ds).setUrl("jdbc:mysql://localhost:3306/test");
((MysqlDataSource)ds).setUser("root");
((MysqlDataSource)ds).setPassword("root");
Connectionconnection=ds.getConnection();
Statement對象
Statement對象主要是將SQL語句發送到數據庫中。JDBC API中主要提供了三種Statement對象。
Statement:用於執行不帶參數的簡單sql語句
PreparedStatement:用於執行帶或者不帶參數的sql語句,sql語句會預編譯在數據庫系統,執行速度快於Statement對象
CallableStatement :用於執行數據庫存儲過程的調用
主要的方法:
executeQuery() 方法執行後返回單個結果集的,通常用於select語句
ResultSet對象
ResultSet對象它被稱爲結果集,它代表符合SQL語句條件的所有行,並且它通過一套getXXX方法提供了對這些行中數據的訪問。
ResultSet裏的數據一行一行排列,每行有多個字段,並且有一個記錄指針,指針所指的數據行叫做當前數據行,我們只能來操作當前的數據行。我們如果想要取得某一條記錄,就要使用ResultSet的next()方法 ,如果我們想要得到ResultSet裏的所有記錄,就應該使用while循環。