当前位置: 首页 > news >正文

手把手教你用JDBC搞定MySQL增删改查(附Educoder实战代码解析)

从零到精通的JDBC实战指南:MySQL增删改查全解析

在Java开发的世界里,数据库操作是每个开发者必须掌握的技能。JDBC作为Java连接数据库的标准API,虽然现在有各种ORM框架简化了操作,但理解JDBC底层原理仍然是进阶高级开发的必经之路。本文将带你从零开始,通过一个完整的员工管理系统案例,深入理解JDBC的每一个关键步骤,并教你如何将这些知识应用到实际项目中。

1. JDBC基础与环境搭建

1.1 JDBC核心组件解析

JDBC(Java Database Connectivity)是Java语言中用来规范客户端程序如何访问数据库的应用程序接口。它主要由以下几个核心组件构成:

  • DriverManager:负责管理数据库驱动,建立与数据库的连接
  • Connection:表示与特定数据库的连接会话
  • Statement/PreparedStatement:用于执行静态SQL语句和预编译SQL语句
  • ResultSet:表示数据库结果集,通常通过执行查询语句生成
// JDBC基础使用流程示例 Class.forName("com.mysql.cj.jdbc.Driver"); Connection conn = DriverManager.getConnection(url, username, password); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM employee");

1.2 MySQL环境准备

在开始编码前,我们需要准备好MySQL数据库环境。以下是推荐配置:

组件版本备注
MySQL Server8.0+社区版即可
JDK11+推荐LTS版本
MySQL Connector/J8.0+JDBC驱动

安装完成后,创建我们的示例数据库和表:

CREATE DATABASE tsgc CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE tsgc; CREATE TABLE employee ( no VARCHAR(10) PRIMARY KEY, name VARCHAR(50) NOT NULL, password VARCHAR(50), sex VARCHAR(10), salary DECIMAL(10,2) );

2. 增删改查全流程实战

2.1 数据库连接最佳实践

建立数据库连接是JDBC操作的第一步,也是容易出错的地方。以下是几个关键注意事项:

  1. 驱动加载:现代JDBC驱动通常会自动注册,但显式加载仍是好习惯
  2. 连接字符串:包含服务器地址、端口、数据库名和编码设置
  3. 认证信息:用户名和密码应通过安全方式管理
  4. 连接池:生产环境务必使用连接池(HikariCP等)
public class DBUtil { private static final String URL = "jdbc:mysql://localhost:3306/tsgc?useSSL=false&serverTimezone=UTC"; private static final String USER = "root"; private static final String PASSWORD = "123123"; public static Connection getConnection() throws SQLException { return DriverManager.getConnection(URL, USER, PASSWORD); } }

提示:在生产环境中,数据库连接信息应该放在配置文件中,而不是硬编码在代码里。

2.2 增删改查操作详解

2.2.1 插入数据(INSERT)
public void addEmployee(Employee emp) { String sql = "INSERT INTO employee(no, name, password, sex, salary) VALUES(?, ?, ?, ?, ?)"; try (Connection conn = DBUtil.getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setString(1, emp.getNo()); pstmt.setString(2, emp.getName()); pstmt.setString(3, emp.getPassword()); pstmt.setString(4, emp.getSex()); pstmt.setDouble(5, emp.getSalary()); pstmt.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } }
2.2.2 查询数据(SELECT)
public List<Employee> getAllEmployees() { List<Employee> employees = new ArrayList<>(); String sql = "SELECT * FROM employee"; try (Connection conn = DBUtil.getConnection(); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql)) { while (rs.next()) { Employee emp = new Employee(); emp.setNo(rs.getString("no")); emp.setName(rs.getString("name")); emp.setPassword(rs.getString("password")); emp.setSex(rs.getString("sex")); emp.setSalary(rs.getDouble("salary")); employees.add(emp); } } catch (SQLException e) { e.printStackTrace(); } return employees; }

3. 高级技巧与性能优化

3.1 PreparedStatement的优势

与Statement相比,PreparedStatement有三大优势:

  1. 防止SQL注入:通过参数化查询避免拼接SQL字符串
  2. 性能更好:SQL语句预编译,多次执行只需编译一次
  3. 可读性高:参数通过set方法设置,代码更清晰
// 使用PreparedStatement更新数据 public void updatePassword(String no, String newPassword) { String sql = "UPDATE employee SET password = ? WHERE no = ?"; try (Connection conn = DBUtil.getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setString(1, newPassword); pstmt.setString(2, no); int affectedRows = pstmt.executeUpdate(); System.out.println("更新了 " + affectedRows + " 条记录"); } catch (SQLException e) { e.printStackTrace(); } }

3.2 事务处理机制

JDBC默认是自动提交模式,要使用事务需要手动控制:

public void transferSalary(String fromNo, String toNo, double amount) { Connection conn = null; try { conn = DBUtil.getConnection(); conn.setAutoCommit(false); // 开始事务 // 扣除转出员工工资 String sql1 = "UPDATE employee SET salary = salary - ? WHERE no = ?"; try (PreparedStatement pstmt1 = conn.prepareStatement(sql1)) { pstmt1.setDouble(1, amount); pstmt1.setString(2, fromNo); pstmt1.executeUpdate(); } // 增加转入员工工资 String sql2 = "UPDATE employee SET salary = salary + ? WHERE no = ?"; try (PreparedStatement pstmt2 = conn.prepareStatement(sql2)) { pstmt2.setDouble(1, amount); pstmt2.setString(2, toNo); pstmt2.executeUpdate(); } conn.commit(); // 提交事务 } catch (SQLException e) { if (conn != null) { try { conn.rollback(); // 回滚事务 } catch (SQLException ex) { ex.printStackTrace(); } } e.printStackTrace(); } finally { if (conn != null) { try { conn.setAutoCommit(true); // 恢复自动提交 conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }

4. 项目实战:员工管理系统

4.1 系统架构设计

一个完整的员工管理系统应该包含以下模块:

  1. 数据访问层(DAO):封装所有数据库操作
  2. 业务逻辑层(Service):处理业务规则和流程
  3. 表现层:用户界面或API接口
src/ ├── main/ │ ├── java/ │ │ ├── dao/ │ │ │ └── EmployeeDao.java │ │ ├── service/ │ │ │ └── EmployeeService.java │ │ ├── model/ │ │ │ └── Employee.java │ │ └── util/ │ │ └── DBUtil.java │ └── resources/ │ └── db.properties └── test/ └── java/ └── dao/ └── EmployeeDaoTest.java

4.2 异常处理与日志记录

良好的异常处理和日志记录是健壮系统的关键:

public class EmployeeDao { private static final Logger logger = Logger.getLogger(EmployeeDao.class.getName()); public boolean deleteEmployee(String no) { String sql = "DELETE FROM employee WHERE no = ?"; try (Connection conn = DBUtil.getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setString(1, no); int affectedRows = pstmt.executeUpdate(); return affectedRows > 0; } catch (SQLException e) { logger.log(Level.SEVERE, "删除员工失败: " + no, e); throw new RuntimeException("数据库操作失败", e); } } }

在实际项目中,我发现将JDBC操作封装到DAO层后,业务代码会变得非常简洁。例如查询高薪员工只需要调用employeeDao.findBySalaryGreaterThan(threshold),而不需要关心具体的SQL和ResultSet处理。

http://www.gsyq.cn/news/1464753.html

相关文章:

  • STM32F405VG工程:TIM2/TIM3双定时器+DMA动态调PWM,开箱即用
  • XGLM-1.7B模型评估方法:准确率、延迟与资源消耗的全面测试
  • 微信原生记账小程序完整工程包|含支付集成、图表统计与多页面截图
  • MicroBlaze软核调试避坑指南:从时钟配置到中断失效,手把手教你定位Vivado/SDK常见问题
  • MATLAB答题卡自动批改工具:从拍照到得分图的一键处理流程
  • 2026上海GEO生成式引擎优化公司技术观察
  • 多维聚合中的数据操作:超越GROUP BY的实战指南
  • bert-base-uncased-squad-v1 vs 其他问答模型:80.9%精确匹配率背后的技术优势解析
  • 快速掌握mt5-large API调用:Python实战指南与参数配置技巧
  • 从Educoder到真实项目:手把手教你封装一个可复用的JDBC工具类(含连接池思路)
  • EmoLLMs系列全解析:Emobloom-7b-openmind与7大情感模型特性对比
  • AI视频生成中的社会偏见问题与去偏技术探讨
  • 本地生活门店月度运营目标拆解模型
  • Claude 3.5安全层归零:模型内生安全架构解析
  • 手把手教你用NEP计算光电探测器的最小可探测功率(含Python代码示例)
  • 工业级NLP系统构建:从BERT落地到实时金融舆情分类
  • 深度解析Vue3企业级后台管理系统的架构设计与性能优化
  • AI如何成为数学推理协作者而非解题器
  • Oops Framework-4-Oops Framework入口类Root.ts
  • 【git】-- 远程操作
  • BFS-Best-Face-Swap高级技巧:利用LoRA技术提升换脸效果与效率
  • 从游戏地形到有限元分析:Delaunay三角剖分在Unity和COMSOL中的隐藏用法
  • 提升团队效能,基于快马AI构建chromedriver智能版本管理与自动下载工具
  • KV-Embedding技术:无训练文本嵌入新方法解析
  • arabic_PP-OCRv5_mobile_rec_onnx性能测试报告:准确率、速度和内存占用全面分析
  • 微博话题洞察工作流:Plotly交互式可视化实战
  • 2026年知名的平模门芯板发泡剂/硫氧镁保温发泡剂/水泥发泡剂优质厂家推荐榜 - 行业平台推荐
  • 利用快马AI快速原型化:十分钟构建ccswitch下载管理工具界面
  • 2026年评价高的无机硫氧镁改性剂/硫氧镁门芯改性剂主流厂家对比评测 - 品牌宣传支持者
  • 别再搞混了!手把手教你用D435i跑通VINS-Fusion(单目/双目模式详解)