JDBC(Java Database Connectivity)

张开发
2026/4/16 12:25:38 15 分钟阅读

分享文章

JDBC(Java Database Connectivity)
可以下面我专门介绍一下JDBC 连接流程。什么是 JDBC 连接流程JDBCJava Database Connectivity是 Java 操作数据库的一套标准接口。所谓JDBC 连接流程就是Java 程序从“准备驱动”到“连接数据库”再到“执行 SQL、处理结果、释放资源”的完整过程。它是理解数据库连接池、Druid、MyBatis、JPA这些技术的基础因为这些框架底层最终都绕不开 JDBC。一、JDBC 连接数据库的基本流程标准流程通常分成 6 步加载数据库驱动建立数据库连接创建 SQL 执行对象执行 SQL处理结果集关闭并释放资源二、详细说明每一步1加载数据库驱动Java 程序本身并不知道怎么和 MySQL、Oracle 通信所以需要数据库厂商提供的驱动包。例如 MySQL 的驱动Class.forName(com.mysql.cj.jdbc.Driver);这一步的作用把 MySQL 驱动类加载进 JVM注册数据库驱动让 JDBC 知道后面该用哪个驱动去连接数据库补充在较新的 Spring Boot / JDBC 驱动版本里这一步很多时候可以省略因为驱动会自动注册。2建立数据库连接通过DriverManager获取连接ConnectionconnDriverManager.getConnection(jdbc:mysql://localhost:3306/test?useSSLfalseserverTimezoneAsia/Shanghai,root,123456);这里会返回一个Connection对象。这一步底层做了什么建立连接并不是简单 new 一个对象通常包括解析 JDBC URL查找合适的数据库驱动和数据库建立 TCP 连接用户名密码认证创建数据库会话分配数据库端资源为什么这一步很贵因为它涉及网络通信认证握手数据库服务端资源创建这也是为什么生产环境一般不用“每次都新建连接”而要使用Druid / HikariCP 这种连接池。3创建 SQL 执行对象拿到连接之后不能直接执行 SQL还要创建执行对象。常见有三种Statement用于执行普通 SQL 字符串。Statementstmtconn.createStatement();PreparedStatement最常用支持预编译和参数绑定。PreparedStatementpsconn.prepareStatement(select * from user where id ?);ps.setInt(1,1);CallableStatement用于调用存储过程。4执行 SQL根据 SQL 类型不同执行方法不同。查询操作ResultSetrsps.executeQuery();新增、更新、删除introwsps.executeUpdate();通用执行booleanflagps.execute();5处理结果集如果是查询语句会返回ResultSet。while(rs.next()){intidrs.getInt(id);Stringnamers.getString(name);System.out.println(id name);}这一步做什么遍历查询结果按字段名或下标取值把数据库中的记录转成 Java 数据比如VARCHAR→StringINT→intDATETIME→Timestamp/LocalDateTime6关闭资源最后一定要释放资源通常关闭顺序是ResultSetStatement/PreparedStatementConnection例如rs.close();ps.close();conn.close();为什么必须关闭因为这些对象背后都占用了资源Java 内存数据库连接服务端会话网络资源如果不关闭容易导致连接泄漏数据库连接被耗尽程序性能越来越差三、完整示例下面是一个最基础的 JDBC 查询示例importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.ResultSet;publicclassJdbcDemo{publicstaticvoidmain(String[]args){Connectionconnnull;PreparedStatementpsnull;ResultSetrsnull;try{// 1. 加载驱动Class.forName(com.mysql.cj.jdbc.Driver);// 2. 获取连接connDriverManager.getConnection(jdbc:mysql://localhost:3306/test?useSSLfalseserverTimezoneAsia/Shanghai,root,123456);// 3. 创建预编译对象Stringsqlselect id, name from user where id ?;psconn.prepareStatement(sql);// 4. 绑定参数ps.setInt(1,1);// 5. 执行查询rsps.executeQuery();// 6. 处理结果集while(rs.next()){intidrs.getInt(id);Stringnamers.getString(name);System.out.println(idid, namename);}}catch(Exceptione){e.printStackTrace();}finally{// 7. 释放资源try{if(rs!null)rs.close();if(ps!null)ps.close();if(conn!null)conn.close();}catch(Exceptione){e.printStackTrace();}}}}四、JDBC 连接流程图解可以把整个流程记成加载驱动 ↓ 获取 Connection ↓ 创建 Statement / PreparedStatement ↓ 执行 SQL ↓ 得到 ResultSet查询时 ↓ 处理结果 ↓ 关闭资源五、为什么说 JDBC 连接流程是连接池的基础因为连接池优化的主要就是第 2 步获取连接。普通 JDBC 的做法是每次请求 建立连接 → 执行 SQL → 关闭连接这种方式的问题是建连成本高并发能力差容易拖慢系统连接池的做法是应用启动 先创建一批连接放入池中 每次请求 从池中拿连接 → 执行 SQL → 归还池中所以你学 Druid 时一定要理解Druid 并没有改变 JDBC 的使用本质它只是把 JDBC 中“频繁创建和关闭 Connection”这件事优化成了“连接复用”。六、JDBC 中几个关键对象1. Driver数据库驱动负责和具体数据库通信。2. DriverManager管理驱动并负责获取连接。3. Connection数据库连接对象表示和数据库的一次会话。4. Statement执行 SQL 的对象。5. PreparedStatement预编译 SQL 对象实际开发最常用。6. ResultSet查询结果集对象。七、为什么实际开发更常用 PreparedStatement相比StatementPreparedStatement更常用因为它有两个优势1. 防止 SQL 注入错误写法Stringsqlselect * from user where name name;这样容易被注入。正确写法PreparedStatementpsconn.prepareStatement(select * from user where name ?);ps.setString(1,name);2. 支持预编译SQL 模板可以预编译提高执行效率尤其是重复执行时更明显。八、JDBC 连接流程中常见问题1. 忘记关闭连接会导致连接泄漏最终数据库连接被占满。2. 每次都新建连接性能差高并发场景下压力很大。3. 使用 Statement 拼接 SQL容易产生 SQL 注入问题。4. 事务控制不当比如忘记提交或回滚可能导致数据不一致。九、结合事务再补充一下默认情况下JDBC 通常是自动提交事务的conn.setAutoCommit(false);如果你手动管理事务则流程会变成获取连接 ↓ 关闭自动提交 ↓ 执行多条 SQL ↓ 成功则 commit 失败则 rollback ↓ 关闭资源例如conn.setAutoCommit(false);try{// 执行多条SQLconn.commit();}catch(Exceptione){conn.rollback();}这在转账、下单、库存扣减这种场景里很常见。十、JDBC 连接流程JDBC 连接流程一般包括六步首先加载数据库驱动然后通过 DriverManager 获取 Connection 连接对象接着创建 Statement 或 PreparedStatement 执行对象执行 SQL如果是查询语句会返回 ResultSet 结果集再对结果集进行遍历处理最后关闭 ResultSet、Statement 和 Connection释放资源。其中建立 Connection 的成本比较高所以在实际项目里一般会配合 Druid 或 HikariCP 这类连接池对连接进行复用和统一管理。十一、你学 Druid 时要重点关联的点学完 JDBC 连接流程后再去看 Druid重点要连起来理解这几个问题Druid 优化的是 JDBC 哪一步→ 主要是Connection 获取与管理为什么要用连接池→ 因为getConnection()成本高conn.close()在连接池里是什么意思→ 不是真正关闭而是归还池中Druid 监控的是什么→ 连接使用情况、SQL 执行情况、慢 SQL、连接池状态

更多文章