JDBC有这一篇足够(呕心总结3k字,只为博君一赞!!!)

一、JDBC核心概念

  1. 定义
    JDBC(Java Database Connectivity)是Java语言中用于与数据库进行交互的API。它提供了一种标准的方法来访问各种关系型数据库,如MySQL、Oracle、PostgreSQL等。通过JDBC,Java应用程序可以执行SQL语句、处理查询结果、管理数据库连接等操作。

  2. 核心组件

    • DriverManager:管理数据库驱动的加载与连接获取。
    • Connection:代表数据库连接对象。
    • Statement/PreparedStatement:执行SQL语句的操作对象。
    • ResultSet:存储查询结果的迭代器。
  3. URL格式

    jdbc:<协议>://<IP地址>:<端口号>/<资源名>?<参数>
    

    示例:

    String url = "jdbc:mysql://localhost:3306/testdb?serverTimezone=Asia/Shanghai&useSSL=false";
    

二、JDBC编程六步法

  1. 注册驱动

    Class.forName("com.mysql.cj.jdbc.Driver"); // 推荐方式(自动注册驱动)
    // 或显式注册(不常用)
    DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());
    
  2. 获取连接

    Connection conn = DriverManager.getConnection(url, user, password);
    
  3. 创建操作对象

    • Statement:直接执行静态SQL(存在SQL注入风险)。
      Statement stmt = conn.createStatement();
      int count = stmt.executeUpdate("UPDATE table SET ...");
      
    • PreparedStatement:预编译SQL,支持参数化查询(推荐)。
      PreparedStatement ps = conn.prepareStatement("SELECT * FROM user WHERE name=?");
      ps.setString(1, "admin");
      ResultSet rs = ps.executeQuery();
      
  4. 执行SQL语句

    • executeUpdate():用于DML/DDL语句,返回受影响行数。
    • executeQuery():用于SELECT语句,返回ResultSet
  5. 处理结果集

    while (rs.next()) {
        String name = rs.getString("name");
        int age = rs.getInt("age");
    }
    
  6. 释放资源

    if (rs != null) rs.close();
    if (stmt != null) stmt.close();
    if (conn != null) conn.close();
    

三、关键注意事项

  1. SQL注入防护

    • 问题:用户输入直接拼接到SQL中,可能导致恶意代码执行。
    • 解决方案:使用PreparedStatement,通过占位符(?)传递参数。
  2. 事务控制

    • 默认自动提交,需手动关闭:
      conn.setAutoCommit(false); // 开启事务
      // 执行多条SQL...
      conn.commit(); // 提交事务
      // 或捕获异常时回滚
      conn.rollback();
      
  3. 驱动兼容性

    • MySQL 5驱动类:com.mysql.jdbc.Driver
    • MySQL 8驱动类:com.mysql.cj.jdbc.Driver(需配置serverTimezone参数)。
  4. 资源管理优化

    • 使用工具类封装连接与资源释放:
      public class JDBCUtil {
          private static String url = "jdbc:mysql://..."; // 从配置文件读取
          // 静态块注册驱动
          static { Class.forName("com.mysql.cj.jdbc.Driver"); }
          // 获取连接、关闭资源方法...
      }
      

四、扩展知识

  1. 乐观锁与悲观锁

    • 乐观锁:通过版本号(version字段)控制并发更新,适用于低冲突场景。
    • 悲观锁:通过FOR UPDATELOCK IN SHARE MODE锁定行,强制事务串行化。
  2. 配置管理

    • 使用jdbc.properties文件管理连接信息:
      driver=com.mysql.cj.jdbc.Driver
      url=jdbc:mysql://localhost:3306/testdb?serverTimezone=Asia/Shanghai
      user=root
      password=123456
      
      通过ResourceBundle加载配置,提升灵活性。
      在这里插入图片描述

五、常见错误修正

  1. 拼写错误

    • registerDeiverregisterDriver
    • exexuteUpdataexecuteUpdate
    • com.mysql.jdbc.Deivercom.mysql.cj.jdbc.Driver
  2. 驱动兼容性

    • MySQL 8需添加时区参数:serverTimezone=Asia/Shanghai

六、最佳实践

  1. 优先使用PreparedStatement防止SQL注入。
  2. 通过工具类统一管理数据库连接与资源释放。
  3. 事务操作需明确提交或回滚,避免数据不一致。
  4. 配置文件管理数据库连接信息,提升可维护性。

示例代码

以下是一个简单的JDBC示例,展示了如何连接到MySQL数据库并执行查询:

import java.sql.*;

public class JdbcExample {
    public static void main(String[] args) {
        try {
            // 1. 加载数据库驱动程序
            Class.forName("com.mysql.cj.jdbc.Driver");

            // 2. 建立数据库连接
            Connection connection = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/mydatabase", "username", "password");

            // 3. 创建Statement对象
            Statement statement = connection.createStatement();

            // 4. 执行SQL查询
            ResultSet resultSet = statement.executeQuery("SELECT * FROM mytable");

            // 5. 处理查询结果
            while (resultSet.next()) {
                String name = resultSet.getString("name");
                int age = resultSet.getInt("age");
                System.out.println("Name: " + name + ", Age: " + age);
            }

            // 6. 关闭资源
            resultSet.close();
            statement.close();
            connection.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

注意事项

异常处理:在实际应用中,应该使用try-catch块来捕获和处理SQLException等异常。

资源管理:确保在使用完Connection、Statement和ResultSet等资源后,及时关闭它们,以避免资源泄漏。

SQL注入:使用PreparedStatement而不是Statement来执行SQL语句,以防止SQL注入攻击。

连接池:在高并发应用中,建议使用数据库连接池(如HikariCP、C3P0)来管理数据库连接,以提高性能和资源利用率。

JDBC是Java与数据库交互的基础,掌握它的使用对于开发数据库驱动的应用程序非常重要。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

渣渣盟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值