Java讲课笔记31:JDBC入门

文章目录

零、本讲学习目标

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()方法设置多种类型的输入参数。

扫描二维码关注公众号,回复: 11632216 查看本文章

(六)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

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,查看用户表
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/howard2005/article/details/106437697