首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

Java JDBC 連線 MySQL 完整範例:從連線池到 CRUD 封裝

     編輯:MySQL 綜合教學

JDBC 核心概念與優勢

JDBC(Java Database Connectivity) 是 Java 執行 SQL 的標準 API,提供統一介面存取多種關聯式資料庫。其優點:

  • 操作便捷:免除複雜驅動程式呼叫。
  • 可移植性強:同一套代碼可跨資料庫平台運行。
  • 通用性好:透過 JDBC-ODBC Bridge 相容舊系統。
  • 面向對象:易於封裝連線、Statement、ResultSet 等常用操作。

完整 DAO 封裝範例

package DAO;

import java.sql.*;
import java.util.*;

public class JDBC {
    protected Connection conn;
    protected Statement statement;

    // 取得資料庫連線
    public static Connection getConnection() throws Exception {
        Connection connection = null;
        try {
            Class.forName("com.mysql.jdbc.Driver"); // 載入驅動
            // 127.0.0.1:3306/test 為本地資料庫,user/password 請自行修改
            connection = DriverManager.getConnection(
                "jdbc:mysql://127.0.0.1:3306/test", "user", "password");
        } catch (Exception e) {
            e.printStackTrace();
            throw new Exception("連線 MySQL 失敗");
        }
        return connection;
    }

    // 新增資料
    public int insert(String sql) throws Exception {
        conn = getConnection();
        try {
            statement = (Statement) conn.createStatement();
            int count = statement.executeUpdate(sql);
            conn.close();
            return count;
        } catch (SQLException e) {
            e.printStackTrace();
            throw new Exception("新增資料失敗");
        }
    }

    // 更新資料
    public int update(String sql) throws Exception {
        conn = getConnection();
        try {
            statement = (Statement) conn.createStatement();
            int count = statement.executeUpdate(sql);
            conn.close();
            return count;
        } catch (SQLException e) {
            e.printStackTrace();
            throw new Exception("更新資料失敗");
        }
    }

    // 查詢資料,回傳 List<Map>
    public List<Object> query(String sql) throws Exception {
        conn = getConnection();
        try {
            statement = (Statement) conn.createStatement();
            ResultSet rs = statement.executeQuery(sql);
            List<Object> list = ResultSetToList(rs);
            conn.close();
            return list;
        } catch (SQLException e) {
            e.printStackTrace();
            throw new Exception("查詢資料失敗");
        }
    }

    // 刪除資料
    public int delete(String sql) throws Exception {
        conn = getConnection();
        try {
            statement = (Statement) conn.createStatement();
            int count = statement.executeUpdate(sql);
            conn.close();
            return count;
        } catch (SQLException e) {
            e.printStackTrace();
            throw new Exception("刪除資料失敗");
        }
    }

    // 分頁查詢
    public List<Object> findByPage(String sql, int page, int count) throws Exception {
        conn = getConnection();
        PreparedStatement pre = conn.prepareStatement(sql);
        pre.setMaxRows(count);
        ResultSet rs = pre.executeQuery();
        if (page < 1) rs.absolute(0);
        else {
            page = page * count - 1;
            rs.absolute(page);
        }
        List<Object> list = ResultSetToList(rs);
        return list;
    }

    // ResultSet 轉 List<Map>
    public List<Object> ResultSetToList(ResultSet rs) throws SQLException {
        if (rs == null) return Collections.emptyList();
        ResultSetMetaData md = rs.getMetaData();
        int columnCount = md.getColumnCount();
        List<Object> list = new ArrayList<>();
        while (rs.next()) {
            Map<Object, Object> rowData = new HashMap<>(columnCount);
            for (int i = 1; i <= columnCount; i++) {
                rowData.put(md.getColumnName(i), rs.getObject(i));
            }
            list.add(rowData);
        }
        return list;
    }
}

JDBC 連線資料庫五大步驟

  1. 註冊驅動:Class.forName("com.mysql.jdbc.Driver");
  2. 取得連線:Connection conn = DriverManager.getConnection(url, user, pass);
  3. 建立 Statement:Statement stmt = conn.createStatement();
  4. 執行 SQL:ResultSet rs = stmt.executeQuery("SELECT * FROM user");
  5. 處理結果:迴圈 rs.next() 讀取欄位值。
  6. 釋放資源:依序關閉 rs、stmt、conn。

關鍵提醒

  • 實務上建議使用 連線池(HikariCP、Druid)管理連線,避免頻繁開關效能低落。
  • 優先使用 PreparedStatement 防止 SQL 注入。
  • 資源關閉請放在 finally 區塊或使用 try-with-resources (Java 7+)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved