ToB企服应用市场:ToB评测及商务社交产业平台

标题: JDBC 完全指南:掌握 Java 数据库交互的核心技术 [打印本页]

作者: 九天猎人    时间: 11 小时前
标题: JDBC 完全指南:掌握 Java 数据库交互的核心技术

JDBC 完全指南:掌握 Java 数据库交互的核心技术


一、JDBC 是什么?为什么它如此重要?

JDBC(Java Database Connectivity)是 Java 语言中用于连接和操纵关系型数据库的尺度 API。它允许开辟者通过同一的接口访问差异的数据库(如 MySQL、Oracle、PostgreSQL 等),而无需关心底层数据库的详细实现。 JDBC是学习Mybatis的前提,Mybatis是JDBC的简化,清楚认识到jdbc的流程,才能更好理解Mybatis。Mybatis来日诰日准时更新。
JDBC 的核心代价



二、JDBC 架构与核心组件

JDBC 的架构分为两层:
核心接口与类

组件作用DriverManager管理数据库驱动,建立与数据库的连接Connection表现与数据库的会话,用于管理事务和创建语句对象Statement执行静态 SQL 语句(如 SELECT, INSERT)PreparedStatement预编译 SQL 语句,防止 SQL 注入,提升性能CallableStatement调用数据库存储过程ResultSet封装查询结果集,支持遍历和读取数据
三、JDBC 工作流程详解

6 步完成数据库操纵

     1. 注册驱动(可选)

从 JDBC 4.0 开始,支持主动驱动加载,无需手动调用 Class.forName()。
  1. // 旧方式(JDBC 3.0)  
  2. Class.forName("com.mysql.cj.jdbc.Driver");  
  3. // JDBC 4.0+ 自动加载驱动(需驱动 JAR 包含 META-INF/services/java.sql.Driver 文件)  
复制代码
2. 建立连接

通过 DriverManager.getConnection() 获取 Connection 对象。
  1. String url = "jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC";  
  2. String user = "root";  
  3. String password = "123456";  
  4. try (Connection conn = DriverManager.getConnection(url, user, password)) {  
  5.     // 使用连接执行操作  
  6. }  
复制代码
3. 创建 Statement

根据需求选择 Statement 或 PreparedStatement。
  1. // 静态 SQL(存在 SQL 注入风险)  
  2. Statement stmt = conn.createStatement();  
  3. // 预编译 SQL(推荐)  
  4. String sql = "INSERT INTO users(name, email) VALUES (?, ?)";  
  5. PreparedStatement pstmt = conn.prepareStatement(sql);  
复制代码
4. 执行 SQL


  1. // 插入数据  
  2. pstmt.setString(1, "Alice");  
  3. pstmt.setString(2, "alice@example.com");  
  4. int rows = pstmt.executeUpdate();  
  5. System.out.println("插入行数: " + rows);  
  6. // 查询数据  
  7. ResultSet rs = stmt.executeQuery("SELECT * FROM users");  
复制代码
5. 处置惩罚结果集

遍历 ResultSet 并读取数据。
  1. while (rs.next()) {  
  2.     int id = rs.getInt("id");  
  3.     String name = rs.getString("name");  
  4.     System.out.println(id + ", " + name);  
  5. }  
复制代码
6. 关闭资源

使用 try-with-resources 主动关闭资源(Java 7+)。
  1. try (Connection conn = DriverManager.getConnection(url, user, password);  
  2.      PreparedStatement pstmt = conn.prepareStatement(sql);  
  3.      ResultSet rs = pstmt.executeQuery()) {  
  4.     // 操作代码  
  5. } catch (SQLException e) {  
  6.     e.printStackTrace();  
  7. }  
复制代码

四、PreparedStatement vs Statement:为什么前者更优秀?

对比项StatementPreparedStatementSQL 注入风险高(直接拼接 SQL)低(参数化查询)性能每次执行需编译 SQL预编译一次,重复使用服从高可读性字符串拼接复杂参数占位符(?)清楚易读 示例:PreparedStatement 防 SQL 注入
  1. String input = "admin'; DROP TABLE users;--";  
  2. // 错误方式(Statement)  
  3. String sql = "SELECT * FROM users WHERE name = '" + input + "'";  
  4. // 实际 SQL: SELECT * FROM users WHERE name = 'admin'; DROP TABLE users;--'  
  5. // 正确方式(PreparedStatement)  
  6. PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM users WHERE name = ?");  
  7. pstmt.setString(1, input); // 参数会被安全处理  
复制代码

五、事务管理:包管数据一致性

通过 Connection 对象控制事务:
  1. try (Connection conn = DriverManager.getConnection(url, user, password)) {  
  2.     conn.setAutoCommit(false); // 关闭自动提交  
  3.     // 执行多个操作  
  4.     updateAccount(conn, "A", -100);  
  5.     updateAccount(conn, "B", 100);  
  6.     conn.commit(); // 提交事务  
  7. } catch (SQLException e) {  
  8.     conn.rollback(); // 回滚事务  
  9. }  
复制代码
关键方法


六、连接池:提升性能的关键

为什么必要连接池?


常用连接池库


HikariCP 示例配置
  1. HikariConfig config = new HikariConfig();  
  2. config.setJdbcUrl("jdbc:mysql://localhost/mydb");  
  3. config.setUsername("root");  
  4. config.setPassword("123456");  
  5. config.setMaximumPoolSize(10);  
  6. try (HikariDataSource dataSource = new HikariDataSource(config);  
  7.      Connection conn = dataSource.getConnection()) {  
  8.     // 使用连接  
  9. }  
复制代码

七、异常处置惩罚与最佳实践

1. 处置惩罚 SQLException


2. 最佳实践



八、进阶:JdbcTemplate 与 ORM 框架

1. Spring JdbcTemplate

简化 JDBC 样板代码:
  1. @Autowired  
  2. private JdbcTemplate jdbcTemplate;  
  3. public List<User> getUsers() {  
  4.     return jdbcTemplate.query("SELECT * FROM users", (rs, rowNum) -> {  
  5.         User user = new User();  
  6.         user.setId(rs.getInt("id"));  
  7.         user.setName(rs.getString("name"));  
  8.         return user;  
  9.     });  
  10. }  
复制代码
2. ORM 框架(如 MyBatis、Hibernate)



九、完整示例:JDBC CRUD 操纵

  1. public class JdbcDemo {  
  2.     private static final String URL = "jdbc:mysql://localhost:3306/mydb";  
  3.     private static final String USER = "root";  
  4.     private static final String PASSWORD = "123456";  
  5.     public static void main(String[] args) {  
  6.         // 插入用户  
  7.         insertUser("Bob", "bob@example.com");  
  8.         // 查询用户  
  9.         List<User> users = getUsers();  
  10.         users.forEach(System.out::println);  
  11.     }  
  12.     public static void insertUser(String name, String email) {  
  13.         String sql = "INSERT INTO users(name, email) VALUES (?, ?)";  
  14.         try (Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);  
  15.              PreparedStatement pstmt = conn.prepareStatement(sql)) {  
  16.             pstmt.setString(1, name);  
  17.             pstmt.setString(2, email);  
  18.             pstmt.executeUpdate();  
  19.         } catch (SQLException e) {  
  20.             e.printStackTrace();  
  21.         }  
  22.     }  
  23.     public static List<User> getUsers() {  
  24.         List<User> users = new ArrayList<>();  
  25.         String sql = "SELECT * FROM users";  
  26.         try (Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);  
  27.              Statement stmt = conn.createStatement();  
  28.              ResultSet rs = stmt.executeQuery(sql)) {  
  29.             while (rs.next()) {  
  30.                 User user = new User();  
  31.                 user.setId(rs.getInt("id"));  
  32.                 user.setName(rs.getString("name"));  
  33.                 user.setEmail(rs.getString("email"));  
  34.                 users.add(user);  
  35.             }  
  36.         } catch (SQLException e) {  
  37.             e.printStackTrace();  
  38.         }  
  39.         return users;  
  40.     }  
  41. }  
复制代码

**十、总结

核心要点回顾


掌握 JDBC,您已买通 Java 与数据库的桥梁!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4