JSP JSTL <sql:query>標籤:通過SQL語句查詢

2020-07-16 10:04:56
<sql:query> 標籤用於通過 SQL 語句查詢符合條件的資料。

語法:

無查詢條件的語法格式如下:

<sql:query sql="sqlQuery"
           var="varName"[scope="{page|request|session|application}"]
           [dataSource="dataSource"]
           [maxRows="maxRows"]
           [startRow="startRow"]>
  <sql:param>actions
</sql:query>

含有查詢條件的語法格式如下:

<sql:query var="varName"
           [scope="{page|request|session|application}"]
           [dataSource="dataSource"]
           [maxRows="maxRows"]
           [startRow="startRow"]>
  query
  optional<sql:param>actions
</sql:query>


<sql:query> 標籤各屬性的詳細介紹如表所示。

<sql:query> 標籤屬性
屬性 型別 描述 參照 EL
sql String 查詢資料的SQL語句 可以
dataSource String,javax.sql.DataSource 使用的資料來源物件 可以
maxRows String 指定查詢記錄的最大行數 可以
startRows String 指定查詢記錄的開始行數 可以
var String 儲存查詢結果的變數,該變數包含5個操作結果集的屬性,相應的屬性說明如下表所示 不可以
scope String 變數的儲存範圍 不可以


說明:dataSource 屬性是可選項,如果沒有設定該屬性,會在 page 範圍內尋找資料來源物件,如果找不到,則會丟擲 JspException 異常。

結果集變數的屬性
屬性 型別 描述
rowCount int 結果集中的記錄總數
columnNames String[] 欄位名陣列
rows java.util.Map 以欄位名索引結果集
rowsByIndex Object[] 以數位下標索引結果集
limitedByMaxRows boolean 是否設定了maxRows屬性來限制查詢記錄的數量

範例1:

應用 <sql:setDataSource> 標籤連線 SQL Server 2000 資料庫 db_testJSTL,並應用 <sql:query> 標籤輸出資料表 tb_user 中的從第 3 條記錄開始的5條記錄,關鍵程式碼如下:
<%@page language="java" contentType="text/html;charset=GBK" pageEncoding="GBK"%>
  <%@taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql"%>
    <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
      <sql:setDataSource driver="com.microsoft.jdbc.sqlserver.SQLServerDriver"
                         url="jdbc:microsoft:sqlserver://localhost:1433;databaseName=db_testJSTL"
                         user="sa" password=""/>
      <sql:query var="rs" sql="SELECT*FROM tb_user" maxRows="5" startRow="2"/>
      <table width="300" border="1" cellspacing="0" cellpadding="0" bordercolor="#FFFFFF"
             bordercolordark="#999999" bordercolorlight="#FFFFFF">
        <tr>
          <td align="center">&nbsp;${rs.columnNames[0]}</td>
          <td align="center">&nbsp;${rs.columnNames[1]}</td>
          <td align="center">&nbsp;${rs.columnNames[2]}</td>
        </tr>
        <c:forEach items="${rs.rowsByIndex}"var="row">
          <tr>
            <td>&nbsp;${row[0]}</td>
            <td>&nbsp;${row[1]}</td>
            <td>&nbsp;${row[2]}</td>
          </tr>
        </c:forEach>
      </table>

範例2

應用 <sql:setDataSource> 標籤連線 MySQL 資料庫 db_testJSTL,並應用 <sql:query> 標籤輸出資料表 tb_user 中的全部記錄,關鍵程式碼如下:
<%@page language="java" contentType="text/html;charset=GBK" pageEncoding="GBK"%>
  <%@taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql"%>
    <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
      連線 MySQL 資料庫
      <sql:setDataSource driver="com.mysql.jdbc.Driver"
                         url="jdbc:mysql://localhost:3306/db_testjstl"user="root"
                         password="111"/>
      <sql:query var="rs" sql="SELECT*FROM tb_user"/>
      <table width="300" border="1" cellspacing="0" cellpadding="0" bordercolor="#FFFFFF"
             bordercolordark="#999999"bordercolorlight="#FFFFFF">
        <tr>
          <td align="center">&nbsp;${rs.columnNames[0]}</td>
          <td align="center">&nbsp;${rs.columnNames[1]}</td>
          <td align="center">&nbsp;${rs.columnNames[2]}</td>
        </tr>
        <c:forEach items="${rs.rowsByIndex}" var="row">
          <tr>
            <td>&nbsp;${row[0]}</td>
            <td>&nbsp;${row[1]}</td>
            <td>&nbsp;${row[2]}</td>
          </tr>
        </c:forEach>
      </table>

範例3

在 <sql:query> 標籤中指定資料來源為 <sql:setDataSource> 標籤建立的資料來源 conn,關鍵程式碼如下:
<%@page language="java" contentType="text/html;charset=GBK" pageEncoding="GBK"%>
  <%@taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql"%>
  <sql:setDataSource driver="com.microsoft.jdbc.sqlserver.SQLServerDriver"
    url="jdbc:microsoft:sqlserver://localhost:1433;databaseName=db_testJSTL"
    user="sa" password="" var="conn"/>
  <sql:transaction dataSource="${conn}">
  <sql:query var="rs" sql="SELECT*FROM tb_user"/>

典型應用

應用 <sql:query> 標籤從資料庫中 tb_goods 表的第 4 行記錄開始無條件地查詢6條記錄。使用 <sql:query> 標籤查詢資料,關鍵程式碼如下:
<%@page pageEncoding="gbk" contentType="text/html;charset=GBK"%>
  <%@taglib prefix="sql" uri="/WEB-INF/sql.tld"%>
    <%@taglib prefix="c" uri="/WEB-INF/c.tld"%>
      <sql:setDataSource driver="com.microsoft.jdbc.sqlserver.SQLServerDriver"
                         url="jdbc:microsoft:sqlserver://localhost:1433;databaseName=db_JSDQ26"
                         user="sa"password=""/>
      <sql:query var="result" sql="select*from tb_goods" maxRows="6" startRow="4"/>
      <table width="400" border="1" cellpadding="0" cellspacing="0"
             bordercolor="white" bordercolordark="white" bordercolorlight="black">
        <tr align="center" bgcolor="cyan">
          <td width="80">${result.columnNames[1]}</td>
          <td width="300">${result.columnNames[2]}</td>
          <td width="50">${result.columnNames[3]}</td>
          <td width="50">${result.columnNames[4]}</td>
        </tr>
        <c:forEach items="${result.rowsByIndex}" var="row">
          <tr>
            <td>${row[1]}</td>
            <td>${row[2]}</td>
            <td>${row[3]}</td>
            <td>${row[4]}</td>
          </tr>
        </c:forEach>
      </table>
執行結果如下:

商品名稱 簡介 單價 現價
康佳電視 高效節能型、使用壽命長 2980.0000 2980.0000
奧馬冰箱 實用又實惠、使用壽命長 1980.0000 1980.0000
三星彩電 等離子電視、對人體無輻射作用 2950.0000 2950.0000
創維彩電 實用型、節能型 1999.0000 1890.0000
TCL電視 外型美觀、使用壽命長 3290.0000 3290.0000
索尼數碼相機 品質好、使用壽命長 2005.0000 2005.0000