推薦博客:http://blog.sina.com.cn/s/blog_4f925fc30101820u.html
怕博主把原文刪了,所以在這里先保存一下、
SQL標簽庫
JSTL提供了與數據庫相關操作的標簽,可以直接從頁面上實現數據庫操作的功能,在開發小型網站是可以很方便的實現數據的讀取和操作。本章將詳細介紹這些標簽的功能和使用方法。
SQL標簽庫從功能上可以划分為兩類:設置數據源標簽、SQL指令標簽。
引入SQL標簽庫的指令代碼為:
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
1 設置數據源
使用<sql:setDataSource>標簽可以實現對數據源的配置。
【語法1】:直接使用已經存在的數據源。
<sql:setDataSource dataSource=”dataSource”[var=”name”]
[scope=”page|request|session|application”]/>
【語法2】:使用JDBC方式建立數據庫連接。
<sql:setDataSource driver=”driverClass” url=”jdbcURL”
user=”username”
password=”pwd”
[var=”name”]
[scope=”page|request|session|application”]/>
【參數說明】:見表9-15
表9-15 <sql:DataSource>標簽屬性說明
參數名 |
說明 |
EL |
類型 |
必須 |
默認值 |
dataSource |
數據源 |
是 |
String Javax.sql.DataSource |
否 |
無 |
driver |
使用的JDBC驅動 |
是 |
String |
否 |
無 |
url |
連接數據庫的路徑 |
是 |
String |
否 |
無 |
user |
連接數據庫的用戶名 |
是 |
String |
否 |
無 |
password |
連接數據庫的密碼 |
是 |
String |
否 |
無 |
var |
指定存儲數據源的變量名 |
否 |
String |
否 |
無 |
scope |
指定數據源存儲的JSP范圍 |
否 |
String |
否 |
page |
提示:是否必須是相對的,比如說如果使用數據源則,driver、url等就不再被使用。如果使用JDBC則要用到driver、url、user、password屬性。
例如連接SQL Server需要進行如下配置:
Driver="com.microsoft.jdbc.sqlserver.SQLServerDriver"
url=” jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=pubs"
user=”sa”
password=””
使用<fmt:setDataSource>配置的代碼如下:
<fmt:setDataSource driver=”com.microsoft.jdbc.sqlserver.SQLServerDriver”
url=”jdbc.microsoft:sqlserver://localhost:1433;DatabaseName=pubs”
user=”sa”
password=””>
如果連接其他數據庫,只須把相對應的項修改即可。
提示:可以把數據連接的配置存入session中,如果再用到數據庫連接只須配置使用DataSource屬性。
2 SQL操作標簽
JSTL提供了<sql:query>、<sql:update>、<sql:param>、<sql:dateParam>和<sql:transaction>這5個標簽,通過使用SQL語言操作數據庫,實現增加、刪除、修改等操作。下面將介紹這5個標簽的功能和使用方式。
1.<sql:query>標簽
<sql:query>標簽用來查詢數據。
【語法1】:
<sql:query sql=”sqlQuery” var=”name” [scope=”page|request|session|application”]
[dataSource=”dateSource”]
[maxRow=”maxRow”]
[startRow=”starRow”]/>
【語法2】:
<sql:query var=”name” [scope=”page|request|session|application”]
[dataSource=”dateSource”]
[maxRow=”maxRow”]
[startRow=”starRow”]
>
sqlQuery
</sql:query>
【屬性說明】:見表9-16。
表9-16 <sql:query>標簽屬性說明
參數名 |
說明 |
EL |
類型 |
必須 |
默認值 |
sql |
查詢數據的SQL語句 |
是 |
String |
是 |
無 |
dataSource |
數據源對象 |
是 |
String Javax.sql.DataSoutce |
否 |
無 |
maxRow |
設定最多可以暫存數據的行數 |
是 |
String |
否 |
無 |
startRow |
設定從那一行數據開始 |
是 |
String |
否 |
無 |
var |
指定存儲查詢結果的變量名 |
否 |
String |
是 |
無 |
scope |
指定結果的作用域 |
否 |
String |
否 |
page |
使用<sql:query>必須指定數據源,dataSource是可選的,如果未給定該屬性標簽會在page范圍內查找是否設置過數據源,如果沒有找到將拋出異常。
一般情況下使用<sql:setDateSource>標簽設置一個數據源存儲在session范圍中,當需要數據庫連接時使用dataSource屬性並實現數據庫的操作。
<sql:query>的var屬性是必須的用來存放結果集,如果沒有指定scope范圍則默認為page,即在當前頁面我們可以隨時輸出查詢結果。結果集有一系列的屬性如表9-17所示。
maxRows和startRow屬性用來操作結果集,使用SQL語句首先吧數據放入內存中,檢查是否設置了startRow屬性,如果設置了就從starRow指定的那一行開始取maxRows個值,如果沒有設定則從第一行開始取。
表9-17 結果集參數說明
屬性名 |
類型 |
說明 |
rowCount |
int |
結果集中的記錄總數 |
Rows |
Java.util.Map |
以字段為索引查詢的結果 |
rowsByIndex |
Object[] |
以數字為作索引的查詢結果 |
columnNames |
String[] |
字段名稱數組 |
limitedByMaxRows |
boolean |
是否設置了maxRows屬性來限制查詢記錄的數量 |
提示:limitedByMaxRows用來判斷程序是否收到maxRows屬性的限制。並不是說設定了maxRows屬性,得到結果集的limitedByMaxRows的屬性都為true,當取出的結果集小於maxRows時,則maxRows沒有對結果集起到作用此時也為false。例如可以使用startRow屬性限制結果集的數據量。
結果集的作用就是定義了數據在頁面中的顯示方式。下面給出了結果集每個屬性的作用。
q rowCount屬性。該屬性統計結果集中有效記錄的量,可以使用於大批量數據分頁顯示。
q Rows屬性。等到每個字段對應的值。返回的結果為:字段名={字段值···}
q rowsByIndex屬性。常用得到數據庫中數據的方式,從有效行的第一個元素開始遍歷,到最后一個有效行的最后一個元素。
q columnNames屬性。用於得到數據庫中的字段名。
q limitedByMaxRows屬性。用於判斷是否受到了maxRows的限制。
【示例代碼】:代碼9.20給出了配置數據庫連接,和使用<sql:query>查詢數據以及結果集屬性的使用。
代碼9.20 數據庫示查詢示例:sqldemo01.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
<%@ page contentType="text/html;charset=GBK"%>
<html>
<head>
<title>JSTL: SQL標簽</title>
</head>
<body >
<h3>SQL標簽庫</h3>
<hr>
<sql:setDataSource driver="com.microsoft.jdbc.sqlserver.SQLServerDriver"
url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs"
user="sa" password="" />
<sql:query var="result" sql="select * from person" maxRows="2" startRow="1"/>
結果集的實質是:${result}<br>
得到的行數為:${result.rowCount}<br>
是否收到了maxRows的限制:${result.limitedByMaxRows}
<hr>
<table border="1" align="center">
<tr><c:forEach var="columnName" items="${result.columnNames}">
<td>
<c:out value="${columnName}"/>
</td>
</c:forEach> </tr>
<c:forEach var="row" items="${result.rowsByIndex}">
<tr>
<c:forEach var="column" items="${row}">
<td><c:out value="${column}"/></td>
</c:forEach>
</tr>
</c:forEach>
</table>
</body>
</html>
【代碼解析】:
(1)配置數據源。使用<sql:dataSource>標簽配置數據源,因為只共本頁使用因此存儲在默認的page范圍中。
(2)使用<sql:query>標簽進行數據庫查詢,並定義了maxRows和startRow屬性。並把結果集存儲於作用於page范圍的result變量。使用${result}輸出可以發現結果集就是一個ResultImpl類。
提示:在進行數據源配置時程序不會檢查數據庫連接是否配置正確,直接根據設定的數據庫及連接訪問,如果沒有找到則拋出操作的表異常,因此要放如<c:catch></c:catch>同時在編寫程序時一定要注意數據源是否配置正確。
(3)使用結果集的rowCount屬性得到記錄的總量。代碼為:
${result.rowCount}
(4)使用結果集的limitedMaxRows屬性判斷是否收到maxRows設定的影響。代碼為:
${result.limitedMaxRows}
(5)從結果集中得到數據庫中定義的所有的字段。${result.columnnames}得到的結果是一個字符串數組,因此需要使用<c:forEach>循環輸出。代碼如下:
<c:forEach var="columnName" items="${result.columnNames}">
<c:out value="${columnName}"/>
</c:forEach>
(6)從結果集中得到所有的值。首先要遍歷每一行,然后遍歷每一行中的元素,因此需要循環嵌套。代碼如下:
<c:forEach var="columnName" items="${result.columnNames}">
<c:out value="${columnName}"/>
</c:forEach>
<c:forEach var="row" items="${result.rowsByIndex}">
<c:forEach var="column" items="${row}">
<c:out value="${column}"/></td>
</c:forEach>
</c:forEach>
提示:在代碼解析中省略了html元素表格等標簽的元素,本示例適用於任何數據庫表,只要把數據庫的URL、使用的JDBC進行相應的配置和操作的數據表名進行相應的修改即可看到結果。
2.<sql:update>標簽
<sql:update>用來實現操作數據庫如:使用create、update、delete和insert等SQL語句,並返回影響記錄的條數。
【語法1】:SQL語句放在標簽屬性中。
<sql:update sql=”SQL語句” [var=”name”] [scope=”page|request|session|application”]
[dateSource=”dateSource”]/>
【語法2】:SQL語句放在標簽體內。
<sql:update [var=”name”] [scope=”page|request|session|application”]
[dateSource=”dateSource”]
>
SQL語句
</sql:update>
【參數說明】:見表9-18。
表9-18 <sql:update>標簽屬性說明
參數名 |
說明 |
EL |
類型 |
必須 |
默認值 |
sql |
查詢數據的SQL語句 |
是 |
String |
是 |
無 |
dataSource |
數據源對象 |
是 |
String Javax.sql.DataSoutce |
否 |
無 |
var |
指定存儲查詢結果的變量名 |
否 |
String |
是 |
無 |
scope |
指定結果的作用域 |
否 |
String |
否 |
page |
提示:<sql:update>標簽的屬性同<sql:query>標簽的屬性相比只減少了maxRows和startRow2個屬性。其他參數用法一樣。
使用<sql:update>可以實現數據表的創建、插入數據、更行數據、刪除數據。使用時只須在標簽中放入正確的SQL語句即可,同時要捕獲可能產生的異常。本節只對一個簡單的插入操作進行說明。
【示例代碼】:代碼9.21實現了創建一個表、實現數據的插入。
代碼9.21 數據庫創建、數據插入示例:sqldemo02.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
<%@ page contentType="text/html;charset=GBK"%>
<html>
<head>
<title>JSTL: SQL標簽</title>
</head>
<body >
<h3>SQL標簽庫</h3>
<hr>
<sql:setDataSource driver="com.microsoft.jdbc.sqlserver.SQLServerDriver"
url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs"
user="sa" password="" />
實現數據庫表的創建<br>
<sql:update var="result1">
create table c_user (
id int primary key ,
name varchar(80),
sex varchar(80),
)
</sql:update>
<c:catch var="error">
<sql:update var="result2" >
insert c_user values(05,'Linda','女')
insert c_user values(01,'Rom','男' )
</sql:update>
影響的記錄數為:<c:out value="${result2}"></c:out>
</c:catch>
<c:out value="${error}"></c:out><br>
<hr>
</body>
</html>
【代碼解析】:
(1)配置數據源。
(2)使用<sql:update>標簽創建一個新表。
(3)向表中插入兩行數據。
提示:本示例也沒有針對固定的表進行操作,在使用時直接運行即可,如果使用的是其他數據庫,需要更改數據源配置和SQL語句部分修改。
使用<sql:update>的var屬性記錄結果是不准確的,尤其是在一個標簽中使用多條sql語句只能記錄下第一條。
3.<sql:param>標簽
<sql:param>標簽用於動態的為SQL語句設定參數,同<sql:query>標簽共同使用。可以防止SQL注入作用類似於java.sql.PreparedStatement。
【語法1】:
<sql:param value=”value”/>
【語法2】:
<sql:param>
Value
</sql:param>
【參數說明】:
value的作用為SQL中的參數賦值。
【使用示例】:
<sql:query var=”result”>
select * from person where 序號=?
<sql:query>
4.<sql:dateParam>標簽
<sql:dataParam>標簽主要用於為SQL標簽填充日期類型的參數值。
【語法】:
<sql:dateParam value=”date”[type=”timestamp|time|date”]/>
【參數說明】:
q value屬性:java.util.Date類型的參數。
q type屬性:指定填充日期的類型timestamp(全部日期和時間)、time(填充的參數為時間)、date(填充的參數為日期)。
5.<sql:transaction>標簽
<sql:transaction>標簽提供了數據操作的一種安全機制(即事務回滾),當操作數據庫的某條SQL語句發生異常時,取消<sql:transaction>標簽體中的所有操作,恢復原來的狀態,重新對數據庫進行操作。
【語法】:
<sql:transaction [dataSource=”dataSource”]
[isolation=”read_committed|read_uncommitted|repeatable|serializable”]
>
<sql:query>
<sql:uptade>
</sql:transation>