3、JDBC的基本操作
内容:使用JDBC连接数据库,并进行增删改查基本操作。本题涉及的表有两张:
托运公司表(com):包含托运公司编号,托运公司名称,电话,地址四个字段。
订单表(t_order):包含订单号,托运公司编号,商品数量,运输方式四个字段。
托运公司表:
订单表:
以下sql语句对表进行了创建,添加了上面表格中的数据:
在上面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");
}
}