JDBC 进阶 API 补充

JDBC 进阶 API 补充

六、JDBC 进阶 API 补充

  1. 获取自增主键(新增后拿到数据库自增 ID)

场景:插入数据后,需要获取主键自增值。

// 创建对象时指定:返回自增主键 String sql = "insert into user(name) values(?)"; pstmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); pstmt.setString(1, "王五"); pstmt.executeUpdate(); // 获取自增主键结果集 ResultSet keys = pstmt.getGeneratedKeys(); if(keys.next()){ int id = keys.getInt(1); System.out.println("自增主键ID:" + id); }
  1. 批处理 Batch(批量增删改)

大量数据插入时使用,大幅提升效率:

String sql = "insert into user(name) values(?)"; pstmt = conn.prepareStatement(sql); // 循环添加参数 + 加入批处理 for (int i = 0; i < 1000; i++) { pstmt.setString(1, "用户" + i); pstmt.addBatch(); // 添加到批任务 } pstmt.executeBatch(); // 批量执行 pstmt.clearBatch(); // 清空批任务
  1. JDBC 常用异常

  • ClassNotFoundException:驱动类找不到(jar 包缺失、类名写错)

  • SQLSyntaxErrorException:SQL 语法错误

  • SQLInvalidAuthorizationSpecException:账号 / 密码错误

  • CommunicationsException:IP、端口错误,数据库未启动


七、关键总结(面试 / 考点)

  1. 六大核心 API:DriverDriverManagerConnectionStatementPreparedStatementResultSet

  2. 优先使用 PreparedStatement:防 SQL 注入、预编译高效

  3. 占位符?索引从 1 开始,不能加单引号

  4. MySQL8 必须配置serverTimezone时区参数

  5. 资源关闭顺序:ResultSet > Statement > Connection

  6. JDBC 事务默认自动提交,手动事务需setAutoCommit(false)


八、工具类封装(实战常用)

把重复的加载驱动、获取连接、释放资源封装成工具类,项目标准写法:

import java.sql.*; public class JdbcUtil { // 静态常量 private static final String DRIVER = "com.mysql.cj.jdbc.Driver"; private static final String URL = "jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC"; private static final String USER = "root"; private static final String PWD = "123456"; // 静态代码块:只加载一次驱动 static { try { Class.forName(DRIVER); } catch (ClassNotFoundException e) { e.printStackTrace(); } } // 获取连接 public static Connection getConnection() throws SQLException { return DriverManager.getConnection(URL, USER, PWD); } // 释放资源(重载方法) public static void close(Connection conn, PreparedStatement pstmt) { close(conn, pstmt, null); } public static void close(Connection conn, PreparedStatement pstmt, ResultSet rs) { try { if (rs != null) rs.close(); if (pstmt != null) pstmt.close(); if (conn != null) conn.close(); } catch (SQLException e) { e.printStackTrace(); } } }