橙子
发布于 2025-12-03 / 9 阅读
0
0

3

3、JDBC的基本操作

内容:使用JDBC连接数据库,并进行增删改查基本操作。本题涉及的表有两张:

托运公司表(com):包含托运公司编号,托运公司名称,电话,地址四个字段。

订单表(t_order):包含订单号,托运公司编号,商品数量,运输方式四个字段。

 

托运公司表:

id

name

adress

1

顺丰速递

上海

2

申通速递

武汉

3

中远

北京

 

订单表:

pid

id

count

way

001

1

100

海运

002

1

50

空运

003

2

500

陆路运输

004

3

30

空运

 

以下sql语句对表进行了创建,添加了上面表格中的数据:

SET FOREIGN_KEY_CHECKS=0;

 

-- ----------------------------

-- Table structure for com

-- ----------------------------

DROP TABLE IF EXISTS com;

CREATE TABLE com (

  id int(11) NOT NULL,

  name varchar(20) DEFAULT NULL,

  adress varchar(20) DEFAULT NULL,

  PRIMARY KEY id)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

-- ----------------------------

-- Records of com

-- ----------------------------

INSERT INTO com VALUES ('1', '顺丰速递', '上海');

INSERT INTO com VALUES ('2', '申通速递', '武汉');

INSERT INTO com VALUES ('3', '中远', '北京');

 

-- ----------------------------

-- Table structure for t_order

-- ----------------------------

DROP TABLE IF EXISTS t_order;

CREATE TABLE t_order (

  pid varchar(10) NOT NULL,

  id int(11) NOT NULL,

  count int(11) DEFAULT NULL,

  way varchar(20) DEFAULT NULL,

  PRIMARY KEY pid)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

 

-- ----------------------------

-- Records of t_order

-- ----------------------------

INSERT INTO t_order VALUES ('001', '1', '100', '海运');

INSERT INTO t_order VALUES ('002', '1', '50', '空运');

INSERT INTO t_order VALUES ('003', '2', '500', '陆路运输');

INSERT INTO t_order VALUES ('004', '3', '30', '空运');

 

在上面sql语句的基础上请实现以下操作:

(1) 创建log数据库,导入log.sql脚本;

(2) 使用JDBC连接log数据库;

(3) 使用JDBC向com托运公司表中插入id为4,name为圆通,adress为广州的一条记录;

(4) 使用JDBC查询上海的运输公司名称;

(5) 使用JDBC将com表中id为3的快递公司地址改为深圳;

(6) 使用JDBC删除id为1的托运公司记录。

(1) 创建数据库和导入数据

这一步需要在您的数据库管理工具(如 MySQL Workbench, Navicat, DBeaver 或命令行)中执行。

登录MySQL

mysql -u root -p 2

创建数据库

S

使用数据库

S

执行SQL脚本:将题目中提供的所有SQL语句复制并粘贴到MySQL客户端中执行。执行后,com 表和 t_order 表以及它们的初始数据就会被创建在 log 数据库中。

(2) - (6) 使用JDBC完成数据库操作

下面是完整的Java代码,它将按顺序完成连接、插入、查询、修改和删除操作。

前提条件:添加JDBC驱动

要运行此Java代码,您必须先将 MySQL JDBC驱动程序(一个 .jar 文件,例如 mysql-connector-j-8.x.x.jar)添加到您的项目类路径中。

如果您使用Maven,可以在 pom.xml 中添加以下依赖:

<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <version>8.0.33</version> <!-- 或更高版本 -->
</dependency>

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JdbcDatabaseOperations {

    // --- 数据库连接信息 (请根据您的环境修改) ---
    // 现代驱动程序类名
    static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
    // 数据库URL,连接到log数据库,并设置时区
    static final String DB_URL = "jdbc:mysql://localhost:3306/log?useSSL=false&serverTimezone=UTC";
    // 数据库用户名和密码
    static final String USER = "root"; // 您的用户名
    static final String PASS = "your_password"; // 您的密码

    public static void main(String[] args) {
        Connection conn = null;
        try {
            // 1. 注册JDBC驱动 (在JDBC 4.0之后可以省略,但写上是好习惯)
            Class.forName(JDBC_DRIVER);

            // 2. 使用JDBC连接log数据库
            System.out.println("正在连接数据库...");
            conn = DriverManager.getConnection(DB_URL, USER, PASS);
            System.out.println("数据库连接成功!\n");

            // 3. 插入一条记录
            insertCompany(conn);

            // 4. 查询上海的运输公司
            queryCompanyByAddress(conn, "上海");

            // 5. 修改id为3的公司地址
            updateCompanyAddress(conn, 3, "深圳");

            // 6. 删除id为1的托运公司记录
            deleteCompany(conn, 1);

        } catch (SQLException se) {
            // 处理JDBC错误
            se.printStackTrace();
        } catch (Exception e) {
            // 处理Class.forName错误
            e.printStackTrace();
        } finally {
            // 关闭资源
            try {
                if (conn != null) {
                    conn.close();
                    System.out.println("\n数据库连接已关闭。");
                }
            } catch (SQLException se) {
                se.printStackTrace();
            }
        }
    }

    /**
     * (3) 向com托运公司表中插入一条记录
     */
    public static void insertCompany(Connection conn) throws SQLException {
        System.out.println("--- 操作(3): 插入新公司记录 ---");
        String sql = "INSERT INTO com (id, name, adress) VALUES (?, ?, ?)";
        try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
            pstmt.setInt(1, 4);
            pstmt.setString(2, "圆通");
            pstmt.setString(3, "广州");
            int rowsAffected = pstmt.executeUpdate();
            System.out.println(rowsAffected + " 条记录被插入: (id=4, name=圆通, adress=广州)");
            System.out.println("--------------------------------\n");
        }
    }

    /**
     * (4) 查询指定地址的运输公司名称
     */
    public static void queryCompanyByAddress(Connection conn, String address) throws SQLException {
        System.out.println("--- 操作(4): 查询地址为 '" + address + "' 的公司 ---");
        String sql = "SELECT name FROM com WHERE adress = ?";
        try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
            pstmt.setString(1, address);
            try (ResultSet rs = pstmt.executeQuery()) {
                System.out.println("查询结果:");
                while (rs.next()) {
                    String name = rs.getString("name");
                    System.out.println("- " + name);
                }
            }
        }
        System.out.println("--------------------------------\n");
    }

    /**
     * (5) 将指定id的快递公司地址改为新地址
     */
    public static void updateCompanyAddress(Connection conn, int id, String newAddress) throws SQLException {
        System.out.println("--- 操作(5): 修改id=" + id + "的公司地址 ---");
        String sql = "UPDATE com SET adress = ? WHERE id = ?";
        try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
            pstmt.setString(1, newAddress);
            pstmt.setInt(2, id);
            int rowsAffected = pstmt.executeUpdate();
            System.out.println(rowsAffected + " 条记录被更新: id=" + id + " 的地址已改为 '" + newAddress + "'");
        }
        System.out.println("--------------------------------\n");
    }

    /**
     * (6) 删除指定id的托运公司记录
     */
    public static void deleteCompany(Connection conn, int id) {
        System.out.println("--- 操作(6): 删除id=" + id + "的公司记录 (及关联订单) ---");
        String deleteOrderSql = "DELETE FROM t_order WHERE id = ?";
        String deleteComSql = "DELETE FROM com WHERE id = ?";

        // 开启事务
        try {
            conn.setAutoCommit(false); // 关闭自动提交

            // 1. 先删除子表(t_order)中的关联记录
            try (PreparedStatement pstmtOrder = conn.prepareStatement(deleteOrderSql)) {
                pstmtOrder.setInt(1, id);
                int orderRows = pstmtOrder.executeUpdate();
                System.out.println("从订单表(t_order)中删除了 " + orderRows + " 条关联记录。");
            }

            // 2. 再删除主表(com)中的记录
            try (PreparedStatement pstmtCom = conn.prepareStatement(deleteComSql)) {
                pstmtCom.setInt(1, id);
                int comRows = pstmtCom.executeUpdate();
                System.out.println("从公司表(com)中删除了 " + comRows + " 条记录。");
            }

            conn.commit(); // 提交事务
            System.out.println("事务提交成功!");

        } catch (SQLException e) {
            System.err.println("删除操作失败,事务将回滚!");
            try {
                if (conn != null) {
                    conn.rollback(); // 回滚事务
                    System.err.println("事务已回滚。");
                }
            } catch (SQLException se2) {
                se2.printStackTrace();
            }
            e.printStackTrace();
        } finally {
            try {
                conn.setAutoCommit(true); // 恢复自动提交模式
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        System.out.println("--------------------------------\n");
    }
}


评论