文章目录
零、本讲学习目标
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,查看用户表