当前位置:首页 > 后端开发 > 正文

Java如何连接SQL数据库

Java通过JDBC API连接SQL数据库,需加载驱动、建立Connection连接,创建Statement执行SQL语句,处理ResultSet结果集,最后关闭资源确保安全。

Java与SQL数据库的连接是开发企业级应用的核心技术之一,通过JDBC(Java Database Connectivity)API实现,以下是详细步骤和最佳实践,遵循安全、高效原则:

连接前的准备工作

  1. 环境依赖

    • Java开发环境:JDK 8+(Oracle JDK 或 OpenJDK)
    • 数据库:MySQL/Oracle/SQL Server等(以MySQL 8.0为例)
    • 驱动包:下载对应数据库的JDBC驱动(MySQL Connector/J)
  2. 项目配置

    • Maven项目添加依赖:
      <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <version>8.0.33</version>
      </dependency>

连接数据库的6个关键步骤

import java.sql.*;
public class JdbcExample {
    // 数据库配置(实际项目应使用配置管理)
    private static final String URL = "jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC";
    private static final String USER = "root";
    private static final String PASSWORD = "securePassword123";
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        try {
            // 1. 加载驱动 (JDBC 4.0+ 自动加载,可省略)
            Class.forName("com.mysql.cj.jdbc.Driver");
            // 2. 建立连接
            conn = DriverManager.getConnection(URL, USER, PASSWORD);
            // 3. 创建PreparedStatement(防SQL注入)
            String sql = "SELECT * FROM users WHERE age > ?";
            pstmt = conn.prepareStatement(sql);
            pstmt.setInt(1, 18);  // 参数下标从1开始
            // 4. 执行查询
            rs = pstmt.executeQuery();
            // 5. 处理结果集
            while (rs.next()) {
                System.out.println(
                    "ID: " + rs.getInt("id") + 
                    ", Name: " + rs.getString("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();
            }
        }
    }
}

安全与性能最佳实践

  1. 防SQL注入

    Java如何连接SQL数据库  第1张

    • 必须使用PreparedStatement替代Statement
    • 示例错误写法:"SELECT * FROM users WHERE name='" + userInput + "'"
  2. 连接池管理

    • 推荐使用HikariCP或Druid:
      HikariConfig config = new HikariConfig();
      config.setJdbcUrl(URL);
      config.setUsername(USER);
      config.setPassword(PASSWORD);
      HikariDataSource ds = new HikariDataSource(config);
      Connection conn = ds.getConnection(); // 从连接池获取
  3. 资源关闭规范

    • 使用try-with-resources(Java 7+)自动关闭:
      try (Connection conn = DriverManager.getConnection(URL);
           PreparedStatement pstmt = conn.prepareStatement(sql)) {
          // 操作代码
      } // 自动调用close()
  4. 异常处理

    • 捕获特定异常:
      catch (SQLException e) {
          System.err.println("数据库错误: " + e.getErrorCode());
      }

常见问题排查

错误现象 解决方案
No suitable driver 检查URL格式(jdbc:mysql://)
Access denied 验证用户名/密码及IP权限
SSL not enabled URL添加?useSSL=true
时区错误 添加&serverTimezone=Asia/Shanghai

关键提示:生产环境必须启用SSL加密连接,避免敏感数据泄露,定期更新JDBC驱动修复安全破绽。

扩展应用场景

  1. 事务管理

    conn.setAutoCommit(false); // 关闭自动提交
    try {
        // 执行多个SQL
        conn.commit(); // 提交事务
    } catch (SQLException e) {
        conn.rollback(); // 回滚
    }
  2. 批量处理

    pstmt = conn.prepareStatement("INSERT INTO logs VALUES (?)");
    for (String log : logs) {
        pstmt.setString(1, log);
        pstmt.addBatch(); // 加入批处理
    }
    int[] counts = pstmt.executeBatch(); // 执行批处理

引用说明: 基于Oracle官方JDBC教程[1]、MySQL Connector/J文档[2]及OWASP SQL注入防护指南[3]编写,遵循Java编码安全规范,连接池配置参考HikariCP最佳实践[4]。

参考资料
[1] Oracle JDBC Documentation
[2] MySQL Connector/J Developer Guide
[3] OWASP SQL Injection Prevention
[4] HikariCP Configuration

0