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

JDBC 與 JavaBean 完整實戰教學:從基礎 CRUD 到連接池與 MVC 架構

     編輯:Java 綜合教學

JDBC 與 JavaBean 完整實戰教學

JDBC 核心概念

JDBC (Java Database Connectivity) 為 Java 存取關聯式資料庫的標準 API,位於 java.sql 與 javax.sql 套件。核心四大介面:

  • DriverManager:管理各資料庫驅動程式。
  • Connection:資料庫連線物件,負責傳輸 SQL 與結果。
  • Statement / PreparedStatement:執行靜態/參數化 SQL。
  • ResultSet:封裝查詢結果集。

標準 JDBC 開發步驟

  1. 載入驅動:Class.forName("oracle.jdbc.driver.OracleDriver")
  2. 建立連線:DriverManager.getConnection(url, user, pwd)
  3. 創建 Statement:conn.createStatement() 或 conn.prepareStatement(sql)
  4. 執行 SQL:executeQuery() (查詢) / executeUpdate() (增刪改)
  5. 處理 ResultSet:while(rs.next()) { rs.getInt(1); ... }
  6. 關閉資源:rs.close(); stmt.close(); conn.close(); (逆序關閉,放在 finally 區塊)

PreparedStatement 優勢

  • 預編譯 SQL,效能優於 Statement。
  • 使用 ? 佔位符防止 SQL 注入。
  • 日期類型:setTimestamp(idx, new Timestamp(date.getTime()));CLOB 視為 String 處理。

實戰架構:BaseDao + Dao 介面/實作 + Properties 配置

1. 資料庫配置 database.properties

# MySQL
jdbc.driver_class=com.mysql.jdbc.Driver
jdbc.connection.url=jdbc:mysql://192.168.9.223:3306/test_2016?useUnicode=true&characterEncoding=utf-8
jdbc.connection.username=root
jdbc.connection.password=ablejava

2. 配置管理工具 ConfigManager (單例模式)

public class ConfigManager {
    private static ConfigManager instance;
    private Properties props = new Properties();
    private ConfigManager() {
        try (InputStream in = getClass().getClassLoader().getResourceAsStream("database.properties")) {
            props.load(in);
        } catch (IOException e) { e.printStackTrace(); }
    }
    public static ConfigManager getInstance() {
        if (instance == null) instance = new ConfigManager();
        return instance;
    }
    public String getString(String key) { return props.getProperty(key); }
}

3. 通用 BaseDao 封裝連線、CRUD、資源關閉

public class BaseDao {
    protected Connection conn;
    protected PreparedStatement ps;
    protected ResultSet rs;

    public boolean getConnection() {
        String driver = ConfigManager.getInstance().getString("jdbc.driver_class");
        String url = ConfigManager.getInstance().getString("jdbc.connection.url");
        String user = ConfigManager.getInstance().getString("jdbc.connection.username");
        String pwd = ConfigManager.getInstance().getString("jdbc.connection.password");
        try {
            Class.forName(driver);
            conn = DriverManager.getConnection(url, user, pwd);
            return true;
        } catch (Exception e) { e.printStackTrace(); return false; }
    }

    // 通用增刪改
    public int executeUpdate(String sql, Object[] params) {
        int rows = 0;
        if (getConnection()) {
            try {
                ps = conn.prepareStatement(sql);
                for (int i = 0; i < params.length; i++) ps.setObject(i+1, params[i]);
                rows = ps.executeUpdate();
            } catch (SQLException e) { e.printStackTrace(); }
        }
        return rows;
    }

    // 通用查詢
    public ResultSet executeQuery(String sql, Object[] params) {
        if (getConnection()) {
            try {
                ps = conn.prepareStatement(sql);
                for (int i = 0; i < params.length; i++) ps.setObject(i+1, params[i]);
                rs = ps.executeQuery();
            } catch (SQLException e) { e.printStackTrace(); }
        }
        return rs;
    }

    public boolean closeResource() {
        try { if (rs != null) rs.close(); } catch (SQLException e) { e.printStackTrace(); return false; }
        try { if (ps != null) ps.close(); } catch (SQLException e) { e.printStackTrace(); return false; }
        try { if (conn != null) conn.close(); } catch (SQLException e) { e.printStackTrace(); return false; }
        return true;
    }
}

4. 具體 Dao 介面與實作 (以 Emp 為例)

// EmpDao.java
public interface EmpDao {
    void empList();                           // 查詢全部
    void add(int empno, String ename, ...);   // 新增
    void delete(int empno);                   // 刪除
    void update(int empno, String ename);     // 修改
}

// EmpDaoImpl.java
public class EmpDaoImpl extends BaseDao implements EmpDao {
    public void empList() {
        String sql = "select * from emp";
        try {
            ResultSet rs = executeQuery(sql, new Object[]{});
            while (rs.next()) {
                // 映射到 Emp 物件並列印
            }
        } catch (SQLException e) { e.printStackTrace(); }
        finally { closeResource(); }
    }
    // add/delete/update 同理使用 executeUpdate
}

資料來源與連接池

DataSource 負責獲取連線;連接池 管理連線生命週期 (創建、複用、銷毀),兩者職責不同。

Tomcat 配置 JNDI 資料源 (context.xml)

<Resource name="jdbc/orcl" auth="Container" type="javax.sql.DataSource"
    maxActive="100" maxIdle="30" maxWait="10000"
    username="scott" password="orcl"
    driverClassName="oracle.jdbc.OracleDriver"
    url="jdbc:oracle:thin:@localhost:1521:orcl"/>

程式碼中透過 JNDI 取得連線

Context ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/orcl");
Connection conn = ds.getConnection();

MVC 三層架構

層次職責典型技術
表示層 (View)資料呈現、用戶交互JSP, HTML, JavaScript, JSTL/EL
控制層 (Controller)接收請求、協調業務、頁面導向Servlet, Spring MVC @Controller
業務邏輯層 (Service/BO)封裝業務規則、事務控制Service 介面/實作, @Transactional
資料訪問層 (DAO)CRUD、資料源操作Dao 介面/實作, JdbcTemplate, MyBatis

JSP 動作標籤與頁面包含

  • <jsp:useBean id="service" class="com.service.Impl" scope="page/request/session/application"> 實例化 Bean。
  • <jsp:setProperty name="service" property="dao" value="<%=dao%>"> 依賴注入。
  • 靜態包含: <%@ include file="top.jsp" %> (編譯期合併,被包含頁變動需重編譯)。
  • 動態包含: <jsp:include page="url"> (運行期合併結果,被包含頁變動無需重編譯)。
  • 轉發: <jsp:forward page="url"> (同 RequestDispatcher.forward)。

SQL 注入防範

永遠使用 PreparedStatement 參數化查詢,切勿拼接 SQL 字串。惡意輸入範例:a' or 1=1 --。

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