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

JSP 中使用 SQL 標籤庫操作資料庫:連線管理、查詢與參數化最佳實踐

     編輯:Java 相關知識

背景:為什麼需要 SQL 標籤?

JSP 主責動態頁面渲染,不宜混雜複雜 Java 邏輯 (Scriptlet 已棄用)。JSTL SQL 標籤庫 (sql.tld) 提供宣告式資料庫操作,實現資料存取與展示分離,適合中小型專案或原型快速開發。

核心標籤詳解

1. <sql:setDataSource> 建立資料源

<%@ taglib prefix="sql" uri="https://java.sun.com/jsp/jstl/sql" %>

<sql:setDataSource 
    var="ds" 
    driver="oracle.jdbc.OracleDriver" 
    url="jdbc:oracle:thin:@localhost:1521:ORCL"
    user="scott" 
    password="tiger" 
    scope="application" />
  • driver:不同資料庫必須對應正確驅動類 (MySQL: com.mysql.cj.jdbc.Driver, PostgreSQL: org.postgresql.Driver)。
  • 多資料庫支援:搭配 <c:choose> 根據部署配置動態選擇驅動/URL。
  • scope:application 共享連線池 (需配合 javax.sql.DataSource 實現),request/session 適用輕量場景。

2. <sql:query> 執行查詢

<sql:query dataSource="${ds}" var="result" maxRows="50" startRow="${param.start}">
    SELECT product_id, product_name, price 
    FROM products 
    WHERE category_id = ? AND status = 'ACTIVE'
    <sql:param value="${param.categoryId}" />
</sql:query>

<c:forEach var="row" items="${result.rows}">
    ${row.product_name} - ${row.price} <br/>
</c:forEach>

關鍵最佳實踐

實踐說明範例
必須先建立連線sql:query 依賴 dataSource 屬性或 setDataSource 變數dataSource="${ds}"
使用參數化查詢防 SQL 注入、利用資料庫執行計劃緩存、提升效能<sql:param value="..."/> 對應 SQL 中 ?
大小寫敏感度Oracle 欄位名不區分大小寫,值區分;MySQL 依 collation;統一用資料庫實際欄位名${row.PRODUCT_NAME} vs ${row.product_name}
分頁預設參數避免無條件全表掃描;maxRows 限制單頁筆數,startRow 配合頁碼參數maxRows="50" startRow="${(param.page-1)*50}"
業務預設值銷售單預設今日、商品預設最新 50 筆,減少資料庫壓力WHERE order_date = CURDATE()

進階:更新操作 <sql:update>

<sql:update dataSource="${ds}" var="count">
    UPDATE inventory SET stock = stock - ? WHERE product_id = ?
    <sql:param value="${param.qty}" />
    <sql:param value="${param.pid}" />
</sql:update>
<c:if test="${count > 0}">扣減庫存成功</c:if>

架構演進建議

JSTL SQL 適合簡單 CRUD、原型、報表類頁面。隨著專案增長,建議遷移至:

  • MVC 框架:Spring MVC + MyBatis/JPA,Controller/Service/DAO 分層。
  • 連線池:HikariCP/Druid,在 context.xml 定義 DataSource,JNDI 查找注入。
  • 事務管理:@Transactional 宣告式事務,JSTL SQL 無事務支援。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved