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

JDBC执行sql过程

1. 加载数据库驱动​

JDBC 通过 ​​驱动(Driver)​​ 实现与不同数据库的通信。驱动需提前加载到 JVM:

手动加载(JDBC 4.0 前)​​:

Class.forName("com.mysql.cj.jdbc.Driver"); // MySQL 驱动类

自动加载(JDBC 4.0+)​​:通过 SPI 机制自动识别驱动类,无需显式调用。

​2. 建立数据库连接

通过 DriverManager 或 ​​连接池(如 HikariCP)​​ 获取 Connection 对象:

String url = "jdbc:mysql://localhost:3306/mydb?useSSL=false";

String user = "root";

String password = "123456";

Connection conn = DriverManager.getConnection(url, user, password);

3. 创建 Statement 对象​

JDBC 提供三种执行 SQL 的接口:

​接口​​特点​
Statement静态 SQL,存在 SQL 注入风险,适用于简单查询。
PreparedStatement预编译 SQL,参数化传递,防止 SQL 注入,适合重复执行或含动态参数的 SQL。
CallableStatement调用存储过程。

示例:使用 PreparedStatement

String sql = "SELECT id, name FROM users WHERE age > ?";

PreparedStatement pstmt = conn.prepareStatement(sql);

pstmt.setInt(1, 18); // 设置参数(索引从 1 开始)

4. 执行 SQL 并处理结果​

执行 SQL​

查询操作​​(返回 ResultSet):

ResultSet rs = pstmt.executeQuery();

更新操作​​(返回影响行数):

int rowsAffected = pstmt.executeUpdate(); // INSERT/UPDATE/DELETE

处理结果集​

while (rs.next()) { int id = rs.getInt("id");

// 按列名获取 String name = rs.getString(2); // 按索引获取(从 1 开始)

System.out.println(id + ": " + name); }

结果集类型​​:

  • TYPE_FORWARD_ONLY:默认,只能向前遍历。
  • TYPE_SCROLL_INSENSITIVE:可滚动,不感知数据库变化。
  • TYPE_SCROLL_SENSITIVE:可滚动,感知数据库变化(多数驱动不实现)。

5. 事务管理(可选)

通过 Connection 控制事务:

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

        // 执行多个 SQL...

        conn.commit(); // 提交事务

} catch (SQLException e) {

        conn.rollback(); // 回滚事务

} finally {

        conn.setAutoCommit(true); // 恢复自动提交

}

​隔离级别​​:通过 conn.setTransactionIsolation(level) 设置(如 READ_COMMITTED)。

​6. 释放资源​

必须显式关闭资源​​以避免内存泄漏和连接耗尽:

try {

        if (rs != null) rs.close();

        if (pstmt != null) pstmt.close();

        if (conn != null) conn.close(); // 实际中连接池会回收而非真正关闭

} catch (SQLException e) {

        e.printStackTrace();

}

http://www.xdnf.cn/news/5399.html

相关文章:

  • 技术视角解析:哈达斯无醇气泡葡萄汁的双重风味密码​
  • GLPK(GNU线性规划工具包)介绍
  • Java 中的数据类型误导点!!!
  • windows 环境下 python环境安装与配置
  • Redis-x64-3.0.500
  • React文档-State数据扁平化
  • Vue3响应式原理源码解析(通俗易懂版)
  • Qt中在子线程中刷新UI的方法
  • llama.cpp无法使用gpu的问题
  • 【TypeScript】索引签名类型(Index Signatures)
  • 字符串---StringBuilder的使用
  • Kubernetes生产实战(一):多容器Pod协同实践
  • 超详细Kokoro-82M本地部署教程
  • JavaScript基础-switch分支流程控制
  • 3498. 字符串的反转度
  • MATLAB安装常见问题及解决方案详解(含代码示例)
  • 抖音app 抓包分析
  • 日语学习-日语知识点小记-构建基础-JLPT-N4阶段(18):条件形 文法
  • AI编程: 使用Trae1小时做成的音视频工具,提取音频并识别文本
  • 【python】json解析:invalid literal for int() with base 10: ‘\“\“‘“
  • 模型 启动效应
  • python如何提取Chrome中的保存的网站登录用户名密码?
  • 【日撸 Java 三百行】综合任务 1
  • Spark流水线在线演示
  • 小程序初始化加载时间优化 步骤思考与总结
  • (二)Linux下基本指令 2
  • 碰一碰发视频源码搭建的定制化开发指南,支持OEM
  • Vue v-model 深度解析:实现原理与高级用法
  • 【c++】多态详解
  • 【MySQL】数据表插入数据