文章目錄
零、本講學習目標
1、瞭解什麼是JDBC
2、熟悉JDBC的常用API
3、掌握JDBC的使用步驟
一、JDBC概述
1、JDBC定義
JDBC(Java DataBase Connectivity,Java數據庫連接)是一種用於執行SQL語句的Java API,可以爲多種關係數據庫提供統一訪問,它由一組用Java語言編寫的類和接口組成。JDBC提供了一種基準,據此可以構建更高級的工具和接口,使數據庫開發人員能夠編寫數據庫應用程序,同時,JDBC也是個商標名。
2、JDBC說明
- 不同的數據庫(如MySQL、Oracle等)在其內部處理數據的方式是不同的,因此每一個數據庫廠商都提供了自己數據庫的訪問接口。
- 直接使用數據庫廠商提供的訪問接口操作數據庫,程序的可移植性變得很差。
- JDBC要求各個數據庫廠商按照統一的規範來提供數據庫驅動,由JDBC和具體的數據庫驅動聯繫,這樣應用程序就不必直接與底層的數據庫交互,從而使得代碼的通用性更強。
3、應用程序採用JDBC訪問數據庫的方式
- 說明:JDBC在應用程序與數據庫之間起到了一個橋樑作用,當應用程序使用JDBC訪問特定的數據庫時,只需要通過不同的數據庫驅動與其對應的數據庫進行連接,連接後即可對該數據庫進行相應的操作。
二、JDBC常用API
(一)Driver接口
1、Driver接口定義
Driver接口是所有JDBC驅動程序必須實現的接口,該接口專門提供給數據庫廠商使用。在編寫JDBC程序時,必須要把所使用的數據庫驅動程序或類庫加載到項目的classpath中(這裏指數據庫的驅動JAR包)。
2、Driver接口常用方法
(二)DriverManager類
1、DriverManager類定義
DriverManager類用於加載JDBC驅動並且創建與數據庫的連接。
2、DriverManager類常用方法
方法聲明 | 功能描述 |
---|---|
static synchronized void registerDriver(Driver driver) | 該方法用於向DriverManager中註冊給定的JDBC驅動程序 |
static Connection getConnection(String url, String user, String pwd) | 該方法用於建立和數據庫的連接,並返回表示連接的Connection對象 |
- 注意:在實際開發中,通常不使用registerDriver(Driver driver) 註冊驅動。因爲JDBC驅動類Driver中有一段靜態代碼塊,是向DriverManager註冊一個Driver實例,當再次執行registerDriver(new Driver()),相當於實例化了兩個Driver對象,因此在加載數據庫驅動時通常使用Class類的靜態方法forName()來實現。
(三)Connection接口
1、Connection接口定義
Connection接口代表Java程序和數據庫的連接對象,只有獲得該連接對象後,才能訪問數據庫,並操作數據表。
2、Connection接口常用方法
方法聲明 | 功能描述 |
---|---|
Statement createStatement() | 該方法用於返回一個向數據庫發送語句的Statement對象 |
PreparedStatement prepareStatement(String sql) | 該方法用於返回一個PreparedStatement對象,該對象用於向數據庫發送參數化的SQL語句 |
CallableStatement prepareCall(String sql) | 該方法用於返回一個CallableStatement對象,該對象用於調用數據庫中的存儲過程 |
(四)Statement接口
1、Statement接口定義
- Statement是Java執行數據庫操作的一個重要接口,它用於執行靜態的SQL語句,並返回一個結果對象。Statement接口對象可以通過Connection實例的createStatement()方法獲得,然後返回數據庫的處理結果。
2、Statement接口常用方法
方法聲明 | 功能描述 |
---|---|
boolean execute(String sql) | 用於執行各種SQL語句,返回一個boolean類型的值,如果爲true,表示所執行的SQL語句有查詢結果,可通過Statement的getResultSet()方法獲得查詢結果 |
int executeUpdate(String sql) | 用於執行SQL中的insert、update和delete語句。該方法返回一個int類型的值,表示數據庫中受該SQL語句影響的記錄條數 |
ResultSet executeQuery(String sql) | 用於執行SQL中的select語句,該方法返回一個表示查詢結果的ResultSet對象 |
(五)PreparedStatement接口
1、PreparedStatement接口作用
Statement接口封裝了JDBC執行SQL語句的方法,雖然可以完成Java程序執行SQL語句的操作,但是在實際開發過程中往往需要將程序中的變量作爲SQL語句的查詢條件,而使用Statement接口操作這些SQL語句會過於繁瑣,並且存在安全方面的問題。針對這一問題,JDBC API 中提供了擴展的PreparedStatement接口。
2、PreparedStatement接口定義
PreparedStatement是Statement的子接口,用於執行預編譯的SQL語句。PreparedStatement接口擴展了帶有參數SQL語句的執行操作,應用接口中的SQL語句可以使用佔位符“?”來代替其參數,然後通過setXxx()方法爲SQL語句的參數賦值。
3、PreparedStatement接口常用方法
方法聲明 | 功能描述 |
---|---|
int executeUpdate() | 在此PreparedStatement對象中執行 SQL 語句,該語句必須是一個DML語句或者是無返回內容的SQL 語句,如 DDL 語句 |
ResultSet executeQuery() | 在此PreparedStatement對象中執行 SQL 查詢,該方法返回的是ResultSet對象 |
void setInt(int parameterIndex, int x) | 將指定參數設置爲給定的int值 |
void setFloat(int parameterIndex, float x) | 將指定參數設置爲給定的float值 |
void setString(int parameterIndex, String x) | 將指定參數設置爲給定的String值 |
void setDate(int parameterIndex, Date x) | 將指定參數設置爲給定的Date值 |
void addBatch() | 將一組參數添加到此PreparedStatement對象的批處理命令中 |
void setCharacterStream(int parameterIndex, java.io.Reader reader, int length) | 將指定的輸入流寫入數據庫的文本字段 |
void setBinaryStream(int parameterIndex, java.io.InputStream x, int length) | 將二進制的輸入流數據寫入到二進制字段中 |
4、PreparedStatement接口用法
爲SQL語句參數賦值時,可以通過輸入參數與SQL類型相匹配的setXxx()方法。例如字段的數據類型爲int或Integer,那麼應該使用setInt()方法,也可以通過setObject()方法設置多種類型的輸入參數。
(六)ResultSet接口
1、ResultSet接口定義
ResultSet接口用於保存JDBC執行查詢時返回的結果集,該結果集封裝在一個邏輯表格中。在ResultSet接口內部有一個指向表格數據行的遊標(或指針),ResultSet對象初始化時,遊標在表格的第一行之前,調用next()方法可將遊標移動到下一行。如果下一行沒有數據,則返回false。在程序中經常使用next()方法作爲while循環的條件來迭代ResultSet結果集。
2、ResultSet接口常用方法
方法聲明 | 功能描述 |
---|---|
String getString(int columnIndex) | 用於獲取指定字段的String類型的值,參數columnIndex代表字段的索引 |
String getString(String columnName) | 用於獲取指定字段的String類型的值,參數columnName代表字段的名稱 |
int getInt(int columnIndex) | 用於獲取指定字段的int類型的值,參數columnIndex代表字段的索引 |
int getInt(String columnName) | 用於獲取指定字段的int類型的值,參數columnName代表字段的名稱 |
Date getDate(int columnIndex) | 用於獲取指定字段的Date類型的值,參數columnIndex代表字段的索引 |
Date getDate(String columnName) | 用於獲取指定字段的Date類型的值,參數columnName代表字段的名稱 |
boolean next() | 將遊標從當前位置向下移一行 |
boolean absolute(int row) | 將遊標移動到此 ResultSet 對象的指定行 |
void afterLast() | 將遊標移動到此 ResultSet 對象的末尾,即最後一行之後 |
void beforeFirst() | 將遊標移動到此 ResultSet 對象的開頭,即第一行之前 |
boolean previous() | 將遊標移動到此 ResultSet 對象的上一行 |
boolean last() | 將遊標移動到此 ResultSet 對象的最後一行 |
3、ResultSet接口說明
- ResultSet接口中定義了大量的getXxx()方法,而採用哪種getXxx()方法取決於字段的數據類型。
- 程序既可以通過字段的名稱來獲取指定數據,也可以通過字段的索引來獲取指定的數據,字段的索引是從1開始編號的。
- 假設數據表的第1列字段名爲id,字段類型爲int,那麼既可以使用getInt(“id”)獲取該列的值,也可以使用getInt(1)獲取該列的值。
三、JDBC編程步驟
(一)加載數據庫驅動
1、加載數據庫驅動語法
Class.forName(“DriverName”);
- DriverName就是數據庫驅動類所對應的字符串。
2、加載數據庫驅動示例
(1)加載MySQL數據庫驅動
Class.forName(“com.mysql.jdbc.Driver”);
(2)加載Oracle數據庫驅動
Class.forName(“oracle.jdbc.driver.OracleDriver”);
(二)通過DriverManager獲取數據庫連接
1、獲取數據庫連接語法
Connection conn = DriverManager.getConnection(String url, String user, String pwd);
- url:連接數據庫的URL
- user:登錄數據庫的用戶名
- pwd:登錄數據庫的密碼
以MySQL數據庫爲例說明url語法:
jdbc:mysql://hostname:port/databasename
- jdbc:mysql是固定的寫法,mysql指的是MySQL數據庫
- hostname指主機的名稱(使用主機的IP地址也行)
- port指的是連接數據庫的端口號(MySQL端口號默認爲3306)
- databasename指的是MySQL中相應數據庫的名稱
2、獲取數據庫連接示例
final String URL = "jdbc:mysql://localhost:3306/student";
final String USERNAME = "root";
final String PASSWORD = "root";
Connection conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
(三)通過Connection對象獲取Statement對象
1、創建Statement對象的方式
- createStatement():創建基本的Statement對象。
- prepareStatement(String sql):根據傳遞的SQL語句創建PreparedStatement對象。
- prepareCall(String sql):根據傳入的SQL語句創建CallableStatement對象。
2、創建Statement對象的示例
- 創建基本的Statement對象
Statement stmt = conn.createStatement();
- 創建PreparedStatement對象
String strSQL = "select * from t_user where username = ? and password = ?";
PreparedStatement pstmt = conn.prepareStatement(strSQL);
(四)使用Statement執行SQL語句
1、執行SQL方式
- execute(String sql):用於執行任意的SQL語句。
- executeQuery(String sql):用於執行查詢語句,返回ResultSet結果集對象。
- executeUpdate(String sql):主要用於執行DML(數據操作語言)和DDL(數據定義語言)語句。執行DML語句(INSERT、UPDATE或DELETE)時,會返回受SQL語句影響的行數,執行DDL(CREATE、ALTER)語句返回0。
2、執行SQL語句示例
String strSQL = "select * from t_user";
ResultSet rs = stmt.executeQuery(strSQL);
(五)操作結果集ResultSet
1、操作結果集說明
如果執行的SQL語句是查詢語句,執行結果將返回一個ResultSet對象,該對象裏保存了SQL語句查詢的結果。程序可以通過操作該ResultSet對象來取出查詢結果。
2、操作結果集示例
// 執行SQL查詢,返回結果集
ResultSet rs = stmt.executeQuery(strSQL);
// 遍歷結果集,顯示錶記錄
while (rs.next()) {
// 創建用戶實體對象
User user = new User();
// 設置實體屬性
user.setId(rs.getInt("id"));
user.setUsername(rs.getString("username"));
user.setTelephone(rs.getString("telephone"));
user.setRegisterTime(rs.getTimestamp("register_time"));
// 輸出用戶實體對象
System.out.println(user);
}
(六)關閉連接,釋放資源
每次操作數據庫結束後都要關閉數據庫連接,釋放資源,以重複利用資源。
- 通常資源的關閉順序與打開順序相反,順序是ResultSet、Statement(或PreparedStatement)和Connection。
- 爲了保證在異常情況下也能關閉資源,需要在try…catch的finally代碼塊中統一關閉資源。
四、案例演示:利用JDBC操作數據庫與表
(一)啓動MySQL服務
(二)在Navicat Prmium裏創建MySQL連接
1、啓動Navicat Prmium
2、創建MySQL連接
(三)創建數據庫
創建數據庫student,設置字符集爲utf8:
(四)創建數據表
1、在數據庫裏創建數據表
2、在數據表裏添加記錄
3、轉儲數據庫的SQL腳本
SQL腳本student.sql:
/*
Navicat Premium Data Transfer
Source Server : java_mysql
Source Server Type : MySQL
Source Server Version : 50562
Source Host : localhost:3306
Source Schema : student
Target Server Type : MySQL
Target Server Version : 50562
File Encoding : 65001
Date: 02/06/2020 16:19:42
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for t_user
-- ----------------------------
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用戶ID',
`username` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用戶名',
`password` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '用戶密碼',
`telephone` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '聯繫電話',
`register_time` timestamp DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '註冊時間',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
-- ----------------------------
-- Records of t_user
-- ----------------------------
INSERT INTO `t_user` VALUES (1, 'admin', '12345', '15895956780', '2019-05-22 08:42:15');
INSERT INTO `t_user` VALUES (2, '李剛', '11111', '13956567834', '2019-06-06 10:20:05');
INSERT INTO `t_user` VALUES (3, '段譽', '22222', '15890345678', '2019-05-29 08:29:07');
INSERT INTO `t_user` VALUES (4, '王語嫣', '33333', '13967678904', '2019-05-13 16:52:26');
INSERT INTO `t_user` VALUES (5, '喬峯', '44444', '15890897865', '2019-05-17 08:29:11');
INSERT INTO `t_user` VALUES (6, '虛竹', '55555', '15894567890', '2019-06-06 09:27:41');
SET FOREIGN_KEY_CHECKS = 1;
(五)創建數據庫連接管理類
- 在net.hw.lesson31包裏創建ConnectionManager
package net.hw.lesson31;
import javax.swing.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/**
* 功能:數據庫連接管理類
* 作者:華衛
* 日期:2020年06月02日
*/
public class ConnectionManager {
/**
* 數據庫驅動程序
*/
private static final String DRIVER = "com.mysql.jdbc.Driver";
/**
* 數據庫統一資源定位符
*/
private static final String URL = "jdbc:mysql://localhost:3306/student";
/**
* 數據庫用戶名
*/
private static final String USERNAME = "root";
/**
* 數據庫密碼
*/
private static final String PASSWORD = "root";
/**
* 私有化構造方法,拒絕實例化
*/
private ConnectionManager() {
}
/**
* 獲取數據庫連接方法
*
* @return 數據庫連接
*/
public static Connection getConnection() {
// 定義數據庫連接
Connection conn = null;
try {
// 安裝數據庫驅動程序
Class.forName(DRIVER);
// 獲取數據庫連接
conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
} catch (ClassNotFoundException e) {
System.err.println("錯誤提示:數據庫驅動程序未找到!");
} catch (SQLException e) {
System.err.println("溫馨提示:數據庫連接失敗!");
}
// 返回數據庫連接
return conn;
}
/**
* 關閉數據連接方法
*
* @param conn
*/
public static void closeConnection(Connection conn) {
// 判斷數據庫連接是否爲空
if (conn != null) {
try {
// 判斷數據庫連接是否關閉
if (!conn.isClosed()) {
// 關閉數據庫連接
conn.close();
}
} catch (SQLException e) {
System.err.println("溫馨提示:數據庫連接關閉失敗!");
}
}
}
/**
* 測試數據庫連接是否成功
*
* @param args
*/
public static void main(String[] args) {
// 獲取數據庫連接
Connection conn = getConnection();
// 判斷是否連接成功
if (conn != null) {
JOptionPane.showMessageDialog(null, "恭喜,數據庫連接成功!");
} else {
JOptionPane.showMessageDialog(null, "遺憾,數據庫連接失敗!");
}
// 關閉數據庫連接
closeConnection(conn);
}
}
- 運行程序,查看結果
- 在項目根目錄創建一個lib子目錄,將數據庫驅動程序jar包拷貝進來
mysql-connector-java-5.1.48.jar
下載鏈接:https://pan.baidu.com/s/1_oUTUju2CfzNZ-JQHlyFew 提取碼:wu27
- 把
mysql-connector-java-5.1.48.jar
作爲庫(Library)添加到項目裏
- 再運行程序,查看結果
(六)創建用戶實體類
- 創建用戶實體類User,用於封裝用戶表一條記錄數據
- 用戶表的一個字段對應用戶實體類的一個屬性,注意類型匹配問題
- 注意時間戳類不要導錯了(
import java.sql.Timestamp;
)
package net.hw.lesson31;
import java.sql.Timestamp;
/**
* 功能:用戶實體類
* 作者:華衛
* 日期:2020年06月02日
*/
public class User {
private int id;
private String username;
private String password;
private String telephone;
private Timestamp registerTime;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getTelephone() {
return telephone;
}
public void setTelephone(String telephone) {
this.telephone = telephone;
}
public Timestamp getRegisterTime() {
return registerTime;
}
public void setRegisterTime(Timestamp registerTime) {
this.registerTime = registerTime;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", telephone='" + telephone + '\'' +
", registerTime=" + registerTime +
'}';
}
}
(七)創建顯示全部用戶記錄類
- 創建DisplayAllUsers(使用普通語句對象)
package net.hw.lesson31;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* 功能:顯示用戶表記錄
* 全部或部分記錄
* 作者:華衛
* 日期:2020年06月02日
*/
public class DisplayAllUsers {
public static void main(String[] args) {
// 1. 獲取數據庫連接
Connection conn = ConnectionManager.getConnection();
try {
// 2. 定義SQL語句字符串
String strSQL = "select * from t_user";
// 3. 創建語句對象
Statement stmt = conn.createStatement();
// 4. 執行SQL查詢,返回結果集
ResultSet rs = stmt.executeQuery(strSQL);
// 5. 遍歷結果集,顯示錶記錄
while (rs.next()) {
// 創建用戶實體對象
User user = new User();
// 設置實體屬性
user.setId(rs.getInt("id"));
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
user.setTelephone(rs.getString("telephone"));
user.setRegisterTime(rs.getTimestamp("register_time"));
// 輸出用戶實體對象
System.out.println(user);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 關閉數據庫連接
ConnectionManager.closeConnection(conn);
}
}
}
- 運行程序,查看結果
課堂練習:按編號查找用戶記錄
- 創建FindUserById
- 運行程序,查看結果
(八)創建用戶登錄類
- 創建Login(使用預備語句對象)
package net.hw.lesson31;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
/**
* 功能:用戶登錄程序
* 連接數據庫,判斷是否是合法用戶
* 然後給予用戶相應的提示
* 作者:華衛
* 日期:2020年06月02日
*/
public class Login {
public static void main(String[] args) {
// 聲明部分
String username;
String password;
Scanner sc = new Scanner(System.in);
// 輸入部分
System.out.print("輸入用戶名:");
username = sc.next();
System.out.print("輸入密碼:");
password = sc.next();
// 處理部分
// 1. 獲取數據庫連接
Connection conn = ConnectionManager.getConnection();
try {
// 2. 定義SQL字符串
String strSQL = "select * from t_user where username = ? and password = ?";
// 3. 創建預備語句對象
PreparedStatement pstmt = conn.prepareStatement(strSQL);
// 4. 設置佔位符的值
pstmt.setString(1, username);
pstmt.setString(2, password);
// 5. 執行SQL語句,返回結果集
ResultSet rs = pstmt.executeQuery();
// 6. 判斷結果集是否爲空
if (rs.next()) {
System.out.println("恭喜,登錄成功!");
} else {
System.err.println("遺憾,登錄失敗!");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 關閉數據庫連接
ConnectionManager.closeConnection(conn);
}
}
}
- 運行程序,查看結果
- 再運行程序,查看結果
(九)創建添加用戶記錄類
- 創建AddUser
package net.hw.lesson12;
import net.hw.lesson31.ConnectionManager;
import net.hw.lesson31.User;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.Date;
import java.util.Scanner;
/**
* 功能:添加用戶記錄
* 作者:華衛
* 日期:2020年06月06日
*/
public class AddUser {
public static void main(String[] args) {
// 聲明部分
String username, password, telephone;
Scanner sc = new Scanner(System.in);
// 輸入部分
System.out.print("用戶名:");
username = sc.next();
System.out.print("密碼:");
password = sc.next();
System.out.print("電話:");
telephone = sc.next();
// 處理部分
// 1. 創建用戶實體對象
User user = new User();
// 2. 設置實體屬性
user.setUsername(username);
user.setPassword(password);
user.setTelephone(telephone);
user.setRegisterTime(new Timestamp(new Date().getTime()));
// 3. 獲取數據庫連接
Connection conn = ConnectionManager.getConnection();
// 4. 定義SQL字符串
String strSQL = "insert into t_user (username, password, telephone, register_time) values (?, ?, ?, ?)";
try {
// 5. 創建預備語句對象
PreparedStatement pstmt = conn.prepareStatement(strSQL);
// 6. 設置佔位符的值
pstmt.setString(1, user.getUsername());
pstmt.setString(2, user.getPassword());
pstmt.setString(3, user.getTelephone());
pstmt.setTimestamp(4, user.getRegisterTime());
// 7. 執行SQL,返回添加的記錄數
int count = pstmt.executeUpdate();
// 8. 判斷是否添加成功
if (count > 0) {
// 提示用戶添加成功
System.out.println("恭喜,用戶記錄添加成功!");
} else {
// 提示用戶添加失敗
System.out.println("遺憾,用戶記錄添加失敗!");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 關閉數據庫連接
ConnectionManager.closeConnection(conn);
}
}
}
- 運行程序,查看結果
- 運行DisplayAllUsers程序,查看結果
- 打開NaviCat,查看用戶表
(十)創建更新用戶記錄類
- 創建UpdateUser
package net.hw.lesson31;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;
/**
* 功能:更新用戶記錄
* 作者:華衛
* 日期:2020年06月02日
*/
public class UpdateUser {
public static void main(String[] args) {
// 聲明部分
int id;
String username, password;
Scanner sc = new Scanner(System.in);
// 輸入部分
System.out.print("待編輯記錄的id:");
id = sc.nextInt();
System.out.print("新用戶名:");
username = sc.next();
System.out.print("新密碼:");
password = sc.next();
// 處理部分
// 1. 獲取數據庫連接
Connection conn = ConnectionManager.getConnection();
// 2. 定義SQL字符串
String strSQL = "update t_user set username = ?, password = ? where id = ?";
try {
// 3. 創建預備語句
PreparedStatement pstmt = conn.prepareStatement(strSQL);
// 4. 設置佔位符的值
pstmt.setString(1, username);
pstmt.setString(2, password);
pstmt.setInt(3, id);
// 5. 執行SQL,返回更新成功的記錄數
int count = pstmt.executeUpdate();
// 6. 判斷是否更新成功
if (count > 0) {
// 提示用戶更新成功
System.out.println("恭喜,用戶記錄更新成功!");
} else {
// 提示用戶更新失敗
System.out.println("遺憾,用戶記錄更新失敗!");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 關閉數據庫連接
ConnectionManager.closeConnection(conn);
}
}
}
- 查看用戶表
- 運行程序,修改第7條記錄的用戶名與密碼
- 運行FindUserById程序,查看結果
- 在NaviCat裏查看用戶表
(十一)創建刪除用戶記錄類
- 創建DeleteUserById
package net.hw.lesson31;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;
/**
* 功能:按編號刪除用戶記錄
* 作者:華衛
* 日期:2020年06月02日
*/
public class DeleteUserById {
public static void main(String[] args) {
// 聲明部分
int id;
Scanner sc = new Scanner(System.in);
// 輸入部分
System.out.print("待刪記錄的id:");
id = sc.nextInt();
// 處理部分
// 1. 獲取數據庫連接
Connection conn = ConnectionManager.getConnection();
// 2. 定義SQL字符串
String strSQL = "delete from t_user where id = ?";
try {
// 3. 創建預備語句
PreparedStatement pstmt = conn.prepareStatement(strSQL);
// 4. 設置佔位符的值
pstmt.setInt(1, id);
// 5. 執行SQL,返回刪除的記錄數
int count = pstmt.executeUpdate();
// 6. 判斷是否刪除成功
if (count > 0) {
// 提示用戶刪除成功
System.out.println("恭喜,用戶記錄刪除成功!");
} else {
// 提示用戶刪除失敗
System.out.println("遺憾,用戶記錄刪除失敗!");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 關閉數據庫連接
ConnectionManager.closeConnection(conn);
}
}
}
- 運行程序,查看結果
因爲編號爲10的記錄根本不存在,所以刪除必然失敗。 - 再運行程序,查看結果
- 運行DisplayAllUsers程序,查看結果
可以看到,編號爲2的用戶記錄確實被刪除掉了。 - 打開NaviCat,查看用戶表