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

JDBC连接Mysql模板(含查询+更新)

✨ 核心思路

1. 模板化复用:固定代码不用改,只需替换数据库连接参数

2. 资源自动管理:使用 try-with-resources 自动关闭连接、Statement、ResultSet,避免内存泄漏

3. 安全防注入:更新操作使用 PreparedStatement ,防止SQL注入风险

完整可运行代码

import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.sql.PreparedStatement; public class ReadStudents { public static void main(String[] args) { // ========== 只改这3个参数!!! ========== String url="jdbc:mysql://localhost:3306/student_db?useSSL=false&serverTimezone=UTC"; String user="root"; String password="123456"; // ========== 以下是固定模板,无需修改 ========== // try-with-resources 自动关闭资源,无需手动close try(Connection connection = DriverManager.getConnection(url,user,password)){ // 加载MySQL驱动(新版本JDBC可省略,但写上更兼容) Class.forName("com.mysql.cj.jdbc.Driver"); System.out.println("✅ 数据库连接成功"); // 调用更新方法 updateData(connection); // 创建Statement对象执行查询 try(Statement statement = connection.createStatement()){ String sql="SELECT * FROM students"; try(ResultSet resultSet = statement.executeQuery(sql)){ System.out.println("\n📋 学生列表"); while (resultSet.next()){ int id=resultSet.getInt("id"); String name=resultSet.getString("name"); // 修正:getNString → getString int age=resultSet.getInt("age"); System.out.printf("ID:%d, 姓名:%s, 年龄:%d%n",id,name,age); } } } }catch (ClassNotFoundException e){ System.err.println("❌ 驱动加载失败!"); e.printStackTrace(); }catch (SQLException e){ System.err.println("❌ 数据库操作出错!"); e.printStackTrace(); }catch (Exception e){ e.printStackTrace(); } } /** * 更新数据示例(使用PreparedStatement防止SQL注入) */ private static void updateData(Connection connection) throws SQLException { String sql="UPDATE students SET age=? WHERE id=?"; try(PreparedStatement pstmt = connection.prepareStatement(sql)){ // 设置SQL参数 pstmt.setInt(1,22); // age=22 pstmt.setInt(2,1); // WHERE id=1 // 执行更新 int affectedRows=pstmt.executeUpdate(); System.out.println("🔄 更新了"+affectedRows+"行数据"); } } }

此次过程中遇到的问题

1.驱动类名写错 ClassNotFoundException: com.mysql.jdbc.Driver

问题现象

加载驱动时抛出异常,提示找不到驱动类。

排查过程

一开始写的是 com.mysql.jdbc.Driver ,后来发现 MySQL 8.0+ 的驱动类名改了,旧版驱动名不兼容。

解决方法

MySQL 8.0+ 驱动类名是 com.mysql.cj.jdbc.Driver ,并且可以省略手动加载驱动(JDBC 4.0 自动加载)

2.getNString() 方法报错 NullPointerException

问题现象

查询 name 字段时,用 resultSet.getNString("name") 直接返回空指针。

排查过程

查了 MySQL 官方文档才知道, getNString() 是专门用来获取 NCHAR/NVARCHAR 类型的,MySQL 普通字符串用 VARCHAR ,所以用不了这个方法。

解决方法

换成 getString() 方法,兼容所有字符串类型

http://www.jsqmd.com/news/1244136/

相关文章:

  • Hermes 个人提效跑通后,团队接入为何先栽在权限与日志配置上?
  • 南昌亨得利官方售后电话服务热线手表维修保养权威公示(2026年7月最新) - 亨得利官方
  • Containerd 2.3.3 镜像拉取技巧指南
  • 针对络合态重金属废水,探索集成Tulsimer 树脂的深度处理与资源回收工艺
  • PPA方法:基于统计自一致性提升大语言模型推理能力
  • iScroll终极指南:专业级网页平滑滚动解决方案
  • 寄重物怎么寄便宜?慧寄侠智能比价,最高省70%运费指南 - 快递物流资讯
  • 2026英德宝墩湖温泉酒店周边正宗清远鸡哪家好盘点 - 谁都没有我好看
  • 精密 CNC 加工厂家怎么选?决定 0.003mm 批产稳定的三处隐形分水岭
  • 校地创新合作审核要点是什么?
  • Vibe Coding 实战指南:我用 AI 辅助写完了一整个项目
  • 2026美赛数学建模D题完整参考论文(含模型建立求解、代码等)
  • 终极B站会员购抢票指南:3步实现自动化购票的完整解决方案
  • SCMP前期缴费和考试费什么时候交 - 众智商学院职业教育
  • 高精度激光发射传感器:稳定测距,精准触发
  • 嵌入式以太网核心:EMAC接收机制、DMA描述符与MDIO管理详解
  • 深圳搬运公司:工厂设备装卸+叉车租赁流程步骤,企业临时搬运成本控制方法 - szxybj
  • 【单片机毕业设计】基于 STM32 的智能噪声监测与远程预警系统设计,基于 STM32 单片机的环境噪声采集与物联网监测装置设计(010903)
  • CSSOM树和DOM树是同时解析的吗?
  • AirplaneJS高级配置:自定义频率、增益与端口,优化你的航班追踪体验
  • Open Generative AI:免费开源AI图像与视频生成平台终极指南
  • 盘点 | 香港科技大学沈劭劼团队2026上半年硬核成果
  • 2026年美赛数学建模C题完整参考论文(含模型和代码)
  • 解决99%兼容性问题:Gemini-OpenAI-Proxy常见错误处理与调试技巧
  • 为什么青少年学编程需要一个专门设计的IDE? - 科技焦点
  • SDR++实战指南:跨平台无线电接收软件高效使用方案
  • 品牌在AI搜索中找不到了?教你如何识别并监测流量流失点
  • 如何彻底解决PS4手柄在Windows上的兼容性问题:DS4Windows完整使用指南
  • 耳夹式耳机适合通勤和运动吗?sanag 塞那 Apex的一天使用场景
  • 南京筷子兄弟龙虾:本地老饕为何反复回购这家店? - 天涯视角