首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java JDBC 連接數據庫完整教程:從驅動加載到增刪改查實戰

     編輯:程式設計疑難解答

概述

Java 應用程序通過 JDBC (Java Database Connectivity) API 與關係型數據庫進行交互。本文將系統講解如何使用 Java 代碼連接數據庫,並封裝一個通用的數據庫工具類,實現增、刪、改、查等核心操作。

核心步驟

  1. 加載驅動:使用 Class.forName() 加載數據庫驅動類(如 MySQL 的 com.mysql.cj.jdbc.Driver,SQL Server 的 com.microsoft.sqlserver.jdbc.SQLServerDriver)。
  2. 建立連接:調用 DriverManager.getConnection(url, user, password) 獲取 Connection 對象。
  3. 創建語句對象:使用 Statement、PreparedStatement 或 CallableStatement 執行 SQL。
  4. 執行 SQL 並處理結果:executeQuery 用於查詢返回 ResultSet;executeUpdate 用於增刪改返回影響行數。
  5. 釋放資源:在 finally 塊中關閉 ResultSet、Statement、Connection,防止內存洩漏。

通用數據庫工具類實現 (DBTool)

以下代碼演示了一個基於單例模式的簡易工具類,支持 SQL Server 2005+,並封裝了查詢與更新操作:

import java.sql.*;

public class DBTool {
    // 數據庫配置常量 (實際項目中建議放入配置文件)
    private static final String DRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
    private static final String URL = "jdbc:sqlserver://localhost:1433;DatabaseName=YourDB;";
    private static final String USER = "sa";
    private static final String PWD = "your_password";

    private static Connection conn = null;

    // 私有構造器,實現單例連接
    private DBTool() {
        try {
            if (conn == null || conn.isClosed()) {
                Class.forName(DRIVER).newInstance();
                conn = DriverManager.getConnection(URL, USER, PWD);
                System.out.println("數據庫連接成功!");
            }
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("數據庫連接失敗", e);
        }
    }

    // 獲取連接實例
    private static Connection getConn() {
        if (conn == null) new DBTool();
        return conn;
    }

    /**
     * 執行查詢操作
     * @param sql 查詢語句
     * @return ResultSet 結果集 (需調用者關閉)
     */
    public static ResultSet executeQuery(String sql) {
        try {
            return getConn().createStatement(
                    ResultSet.TYPE_SCROLL_SENSITIVE,
                    ResultSet.CONCUR_UPDATABLE).executeQuery(sql);
        } catch (SQLException e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 執行增、刪、改操作
     * @param sql 執行語句
     * @return 影響行數,-1 表示失敗
     */
    public static int executeUpdate(String sql) {
        try {
            return getConn().createStatement().executeUpdate(sql);
        } catch (SQLException e) {
            System.err.println("SQL 執行錯誤: " + e.getMessage());
            return -1;
        }
    }

    // 測試主方法
    public static void main(String[] args) {
        // 查詢示例
        ResultSet rs = executeQuery("SELECT * FROM Users");
        try {
            while (rs != null && rs.next()) {
                System.out.println(rs.getString("username"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }

        // 更新示例
        int rows = executeUpdate("INSERT INTO Users(username, pwd) VALUES('test', '123')");
        System.out.println("插入行數: " + rows);
    }
}

關鍵點解析

1. 驅動類與 URL 格式

不同數據庫的驅動類名和 JDBC URL 格式不同,必須確保與數據庫版本匹配:

  • MySQL 8.0+: com.mysql.cj.jdbc.Driver | jdbc:mysql://host:3306/db?useSSL=false&serverTimezone=UTC
  • SQL Server: com.microsoft.sqlserver.jdbc.SQLServerDriver | jdbc:sqlserver://host:1433;DatabaseName=db
  • Oracle: oracle.jdbc.driver.OracleDriver | jdbc:oracle:thin:@host:1521:sid

2. PreparedStatement 防注入

實際開發中強烈建議使用 PreparedStatement 替代 Statement,利用佔位符 ? 預編譯 SQL,有效防止 SQL 注入攻擊並提升性能。

3. 資源管理最佳實踐

JDK 7+ 引入的 try-with-resources 語法可自動關閉實現 AutoCloseable 接口的資源,代碼更簡潔安全:

try (Connection c = DriverManager.getConnection(URL, USER, PWD);
     PreparedStatement ps = c.prepareStatement(sql);
     ResultSet rs = ps.executeQuery()) {
    // 處理結果集
} catch (SQLException e) {
    e.printStackTrace();
}

常見問題排查

  • ClassNotFoundException:未將數據庫驅動 JAR 包添加到項目類路徑。
  • Connection refused:數據庫服務未啟動、端口錯誤或防火牆阻攔。
  • 中文亂碼:確保數據庫、表、連接 URL 字符集均為 UTF-8 (MySQL 需在 URL 添加 characterEncoding=utf8)。

總結

掌握 JDBC 核心流程並封裝通用工具類是 Java 後端開發的基礎技能。實際項目中,建議使用成熟的連接池(如 HikariCP、Druid)管理連接,並結合 MyBatis、JPA 等 ORM 框架提升開發效率。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved