上一篇                     
               
			  Java如何连接SQL数据库
- 后端开发
- 2025-07-05
- 3767
 Java通过JDBC API连接SQL数据库,需加载驱动、建立Connection连接,创建Statement执行SQL语句,处理ResultSet结果集,最后关闭资源确保安全。
 
Java与SQL数据库的连接是开发企业级应用的核心技术之一,通过JDBC(Java Database Connectivity)API实现,以下是详细步骤和最佳实践,遵循安全、高效原则:
连接前的准备工作
-  环境依赖 - Java开发环境:JDK 8+(Oracle JDK 或 OpenJDK)
- 数据库:MySQL/Oracle/SQL Server等(以MySQL 8.0为例)
- 驱动包:下载对应数据库的JDBC驱动(MySQL Connector/J)
 
-  项目配置 - Maven项目添加依赖: <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> </dependency>
 
- Maven项目添加依赖: 
连接数据库的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();
            }
        }
    }
} 
安全与性能最佳实践
-  防SQL注入  - 必须使用PreparedStatement替代Statement
- 示例错误写法:"SELECT * FROM users WHERE name='" + userInput + "'"
 
- 必须使用
-  连接池管理 - 推荐使用HikariCP或Druid: HikariConfig config = new HikariConfig(); config.setJdbcUrl(URL); config.setUsername(USER); config.setPassword(PASSWORD); HikariDataSource ds = new HikariDataSource(config); Connection conn = ds.getConnection(); // 从连接池获取 
 
- 推荐使用HikariCP或Druid: 
-  资源关闭规范 - 使用try-with-resources(Java 7+)自动关闭: try (Connection conn = DriverManager.getConnection(URL); PreparedStatement pstmt = conn.prepareStatement(sql)) { // 操作代码 } // 自动调用close()
 
- 使用try-with-resources(Java 7+)自动关闭: 
-  异常处理  - 捕获特定异常: 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驱动修复安全破绽。
扩展应用场景
-  事务管理 conn.setAutoCommit(false); // 关闭自动提交 try { // 执行多个SQL conn.commit(); // 提交事务 } catch (SQLException e) { conn.rollback(); // 回滚 }
-  批量处理  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
 
  
			 
			 
			 
			 
			 
			 
			 
			