JDBC 工作原理
JDBCJava Database Connectivity是 Java 中用于执行 SQL 语句的一套 API它定义了 Java 程序与数据库之间的标准接口。核心组件DriverManager管理不同数据库驱动的注册负责建立数据库连接Driver数据库驱动接口由数据库厂商实现Connection代表与数据库的物理连接会话Statement执行 SQL 语句的对象ResultSet存储查询结果集的表格式数据工作流程Java 应用程序 ↓ 加载驱动Class.forName() ↓ DriverManager 获取连接 ↓ 创建 Connection 对象 ↓ 创建 Statement/PreparedStatement ↓ 执行 SQLexecuteQuery/executeUpdate ↓ 处理 ResultSet 结果集 ↓ 关闭资源finally 块中详细步骤说明1. 加载数据库驱动Class.forName(com.mysql.cj.jdbc.Driver);将驱动类加载到 JVM 中JDBC 4.0 可自动加载META-INF/services 机制2. 建立数据库连接String url jdbc:mysql://localhost:3306/mydb; String user root; String password 123456; Connection conn DriverManager.getConnection(url, user, password);3. 创建 Statement 对象// 普通 Statement Statement stmt conn.createStatement(); // PreparedStatement预编译防 SQL 注入 PreparedStatement pstmt conn.prepareStatement(SELECT * FROM user WHERE id ?); // CallableStatement调用存储过程 CallableStatement cstmt conn.prepareCall({call procedure_name(?)});4. 执行 SQL// 查询 ResultSet rs stmt.executeQuery(SELECT * FROM user); // 更新INSERT/UPDATE/DELETE int rows stmt.executeUpdate(UPDATE user SET nameTom WHERE id1); // 通用执行返回 booleantrue 表示 ResultSetfalse 表示更新计数 boolean hasResultSet stmt.execute(sql);5. 处理结果集while (rs.next()) { int id rs.getInt(id); String name rs.getString(name); Date date rs.getDate(create_time); }6. 关闭资源反向顺序if (rs ! null) rs.close(); if (stmt ! null) stmt.close(); if (conn ! null) conn.close();核心原理1. 驱动注册机制每个驱动类的静态代码块中调用DriverManager.registerDriver()实际加载时自动注册到 DriverManager 的注册驱动列表中2. 连接建立过程DriverManager 遍历已注册的驱动调用每个驱动的acceptsURL(url)检查是否能处理该 URL第一个匹配的驱动调用connect(url, info)建立连接3. Statement 执行流程Statement → 拼接 SQL 字符串 → 发送到数据库 → 数据库解析、优化、执行 → 返回结果 PreparedStatement → 预编译 SQL数据库端→ 参数占位符 → 重复执行只需传参4. 事务管理conn.setAutoCommit(false); // 关闭自动提交 // 执行多个 SQL conn.commit(); // 提交事务 // 或 conn.rollback(); // 回滚事务Statement vs PreparedStatement特性StatementPreparedStatementSQL 注入不安全拼接字符串安全参数化查询性能每次都要编译预编译执行效率高代码可读性差字符串拼接好占位符清晰适用场景执行一次无参数多次执行有参数连接池原理优化性能传统 JDBC 每次创建/关闭连接成本高连接池通过复用解决// 使用 HikariCP 连接池 HikariConfig config new HikariConfig(); config.setJdbcUrl(url); config.setUsername(user); config.setPassword(password); config.setMaximumPoolSize(10); HikariDataSource ds new HikariDataSource(config); Connection conn ds.getConnection(); // 从池中获取 // 使用连接... conn.close(); // 归还到池中非真正关闭常见问题Class.forName 是否必需JDBC 4.0 不需要驱动 jar 包的 META-INF/services/java.sql.Driver 自动注册资源泄漏原因忘记在 finally 块关闭资源建议使用 try-with-resourcesJava 7ResultSet 特性只能向前遍历一次使用完 Statement 或 Connection 后自动关闭最佳实践try (Connection conn dataSource.getConnection(); PreparedStatement pstmt conn.prepareStatement(SELECT * FROM user WHERE id ?)) { pstmt.setInt(1, userId); try (ResultSet rs pstmt.executeQuery()) { while (rs.next()) { // 处理结果 } } } catch (SQLException e) { // 异常处理 e.printStackTrace(); }这种设计使得 Java 程序能够以统一的方式访问不同的数据库实现了数据库访问的标准化。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2557079.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!