JDBC 完整笔记 + 核心 API 详解(入门到实战)
JDBC 完整笔记 核心 API 详解入门到实战一、JDBC 概述什么是 JDBCJDBCJava DataBase ConnectivityJava 数据库连接是 Java 官方定义的一套操作所有关系型数据库的接口API。作用Java 程序统一规范访问 MySQL、Oracle、SQLServer 等数据库一套代码适配多数据库。本质java.sqljavax.sql包下的接口、类、异常。JDBC 架构Java 应用程序调用 JDBC 接口JDBC 接口标准Sun 定义规范数据库驱动实现类数据库厂商实现 JDBC 接口如mysql-connector-java数据库服务MySQL/Oracle 等核心面向接口编程只操作 JDBC 接口不直接接触驱动实现类。使用前提导入对应数据库驱动 jar 包MySQL 5.xmysql-connector-java-5.1.xx.jarMySQL 8.xmysql-connector-java-8.0.xx.jar驱动类、URL 有变化项目中添加依赖普通项目 / MavenMaven 依赖MySQL8xmldependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version8.0.33/version /dependency二、JDBC 核心六大核心 API重点表格接口 / 类包作用Driverjava.sql驱动接口数据库厂商实现DriverManagerjava.sql驱动管理类获取数据库连接Connectionjava.sql数据库连接对象代表 Java 和数据库的通道Statementjava.sqlSQL 语句执行对象静态 SQL有 SQL 注入风险PreparedStatementjava.sql预编译 SQL 对象推荐防注入、效率高ResultSetjava.sql结果集对象封装数据库查询返回的数据三、JDBC 标准执行 7 步固定流程加载驱动获取数据库连接 Connection编写 SQL 语句获取 SQL 执行对象Statement/PreparedStatement执行 SQL接收结果处理结果查询才需要释放资源ResultSet → Statement → Connection四、逐个 API 详解 代码示例Driver 驱动接口 驱动加载1.1 驱动类全限定名MySQL 5.xcom.mysql.jdbc.DriverMySQL 8.xcom.mysql.cj.jdbc.Driver新增cj包必须写对1.2 加载驱动方式本质通过反射加载驱动类自动执行静态代码块完成驱动注册// 方式1Class.forName(全类名) 【主流写法】 Class.forName(com.mysql.cj.jdbc.Driver); // 方式2new 驱动对象不推荐硬编码 new com.mysql.cj.jdbc.Driver();补充MySQL 6.0 可省略加载驱动 驱动包内置META-INF/services/java.sql.Driver文件自动加载驱动但企业开发仍建议手动写兼容性更好。DriverManager 驱动管理类获取连接2.1 核心静态方法// 获取数据库连接返回 Connection 对象 public static Connection getConnection(String url, String user, String password)2.2 URL 地址格式关键通用格式jdbc:数据库类型://数据库IP:端口/数据库名?参数MySQL 标准 URLplaintextjdbc:mysql://localhost:3306/数据库名本机简写localhost:3306 可省略plaintextjdbc:mysql:///数据库名MySQL8 必须追加时区参数否则报错时区异常plaintextjdbc:mysql://localhost:3306/数据库名?useSSLfalseserverTimezoneUTCallowPublicKeyRetrievaltrue参数说明useSSLfalse关闭 SSL 安全连接本地测试必加serverTimezoneUTC指定时区解决时区报错allowPublicKeyRetrievaltrue解决密码认证异常2.3 代码获取连接// 数据库信息 String url jdbc:mysql://localhost:3306/testdb?useSSLfalseserverTimezoneUTC; String user root; String pwd 123456; // 获取连接 Connection conn DriverManager.getConnection(url, user, pwd); System.out.println(conn); // 不为null即连接成功Connection 连接对象接口Connection是 Java 与数据库的会话通道生命周期一次连接。3.1 核心方法创建 SQL 执行对象java运行// 创建普通 Statement Statement createStatement() // 创建预编译 PreparedStatement推荐 PreparedStatement prepareStatement(String sql)事务管理JDBC 事务核心java运行// 关闭自动提交开启事务默认 true 自动提交 void setAutoCommit(boolean autoCommit) // 提交事务 void commit() // 回滚事务 void rollback() // 设置事务保存点进阶 Savepoint setSavepoint()关闭连接void close()3.2 事务使用示例// 关闭自动提交开启事务默认 true 自动提交 void setAutoCommit(boolean autoCommit) // 提交事务 void commit() // 回滚事务 void rollback() // 设置事务保存点进阶 Savepoint setSavepoint()Statement 静态执行对象了解不推荐4.1 作用执行静态、固定拼接的 SQL 语句存在 SQL 注入漏洞。4.2 核心方法// 执行 DQL 查询(select)返回结果集 ResultSet ResultSet executeQuery(String sql) // 执行 DML(insert/update/delete)、DDL返回受影响行数 int executeUpdate(String sql) // 万能方法可执行任意SQL返回boolean是否有结果集 boolean execute(String sql)4.3 示例SQL 注入风险演示// 拼接SQL极易被注入 String name 张三 or 11; String sql select * from user where name name; Statement stmt conn.createStatement(); ResultSet rs stmt.executeQuery(sql); // 会查询出所有数据注入成功结论正式开发禁止使用 Statement一律用PreparedStatement。PreparedStatement 预编译执行对象⭐ 重点推荐5.1 特点预编译 SQLSQL 模板先发送数据库编译后续只传参数执行效率高使用占位符参数单独设置彻底防止 SQL 注入支持批量操作5.2 使用步骤编写 SQL使用?作为参数占位符无单引号通过Connection创建对象传入 SQL调用setXxx(占位符索引, 值)给?赋值索引从 1 开始执行 SQL无需再传 SQL 语句5.3 核心方法1给占位符赋值 setXxx () 系列根据字段类型选择对应方法// 通用格式set类型(第几个?, 值) void setInt(int parameterIndex, int x) void setString(int parameterIndex, String x) void setDouble(int parameterIndex, double x) void setDate(int parameterIndex, Date x) void setObject(int parameterIndex, Object x) // 万能方法2执行 SQL 方法无参// 查询 select → 返回 ResultSet ResultSet executeQuery() // 增删改 → 返回受影响行数 int executeUpdate() // 批量执行批量增删改 void addBatch() // 添加批处理任务 int[] executeBatch() // 执行批量任务 void clearBatch() // 清空批处理5.4 完整增删改查示例示例 1查询DQL// 1. 带 ? 占位符的SQL String sql select id,name,age from user where age ?; // 2. 创建预编译对象 PreparedStatement pstmt conn.prepareStatement(sql); // 3. 给?赋值索引从1开始 pstmt.setInt(1, 18); // 4. 执行查询 ResultSet rs pstmt.executeQuery();示例 2新增DMLString sql insert into user(name,age) values(?,?); PreparedStatement pstmt conn.prepareStatement(sql); pstmt.setString(1, 李四); pstmt.setInt(2, 20); int rows pstmt.executeUpdate(); // 返回影响行数 System.out.println(影响行数 rows);ResultSet 结果集对象封装查询数据ResultSet用来接收select查询返回的表格数据内部维护一个行指针游标。6.1 核心原理游标默认指向第一行数据之前调用next()向下移动一行有数据返回 true无数据返回 false6.2 核心方法1游标移动方法boolean next() // 下移一行常用 boolean previous() // 上移一行滚动结果集 boolean first() // 移到第一行 boolean last() // 移到最后一行 void beforeFirst() // 回到初始位置2获取列数据 getXxx () 系列两种取值方式列索引 / 列名推荐列名可读性高// 按列索引从1开始 int getInt(int columnIndex) String getString(int columnIndex) Date getDate(int columnIndex) // 按列名推荐 int getInt(String columnLabel) String getString(String columnLabel) Date date rs.getTimestamp(current_time); Object getObject(String columnLabel) // 万能获取6.3 遍历结果集标准写法// 循环遍历每一行数据 while(rs.next()){ // 取列值 int id rs.getInt(id); String name rs.getString(name); int age rs.getInt(age); System.out.println(id name age); }6.4 关闭资源顺序顺序必须ResultSet → PreparedStatement → Connectionif(rs ! null) try{rs.close();}catch(Exception e){} if(pstmt ! null) try{pstmt.close();}catch(Exception e){} if(conn ! null) try{conn.close();}catch(Exception e){}五、完整 JDBC 基础模板可直接复用import java.sql.*; public class JdbcDemo { public static void main(String[] args) { Connection conn null; PreparedStatement pstmt null; ResultSet rs null; try { // 1. 加载驱动 Class.forName(com.mysql.cj.jdbc.Driver); // 2. 获取连接 String url jdbc:mysql://localhost:3306/testdb?useSSLfalseserverTimezoneUTC; String user root; String pwd 123456; conn DriverManager.getConnection(url, user, pwd); // 3. 编写SQL 创建预编译对象 String sql select * from user; pstmt conn.prepareStatement(sql); // 4. 执行查询获取结果集 rs pstmt.executeQuery(); // 5. 遍历结果 while (rs.next()) { int id rs.getInt(id); String name rs.getString(name); System.out.println(id name); } } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); } finally { // 6. 释放资源 try { if (rs ! null) rs.close(); if (pstmt ! null) pstmt.close(); if (conn ! null) conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }

相关新闻