HTML網頁基礎語言

Download Report

Transcript HTML網頁基礎語言

第11章 JSP與JDBC建立網頁資料庫








11-1
11-2
11-3
11-4
11-5
11-6
11-7
11-8
JDBC的基礎
建立MySQL的資料庫連結
建立Access的資料庫連結
JSP的資料庫基本存取
SQL語言的資料庫查詢
SQL語言的資料庫操作
JNDI與連結池
JSTL的資料庫存取標籤庫
11-1 JDBC的基礎-說明


昇陽公司提出的資料庫中介軟體
(Middleware)稱為「JDBC」(Java
Database Connectivity),這是一種開
放標準的Java程式介面,可以讓Java程式
連接資料庫管理系統,
以Java技術來說,就是實作JDBC驅動程式
介面(JDBC Driver Interface)的類別,
即JDBC AP即JDBC API。
11-1 JDBC的基礎-圖例
11-1 JDBC的基礎-驅動程式種類




JDBC-ODBC橋接驅動程式(JDBC-ODBC Bridge):
Java程式不是直接連接資料庫管理系統,而是透過微軟
ODBC的中介軟體來存取資料庫。
原生API的Java驅動程式(A Native-API Partly
Java Driver):將Java程式的JDBC呼叫轉換成專屬資
料庫管理系統的原生API呼叫。
Java網路協定驅動程式(A Net-protocol All Java
Driver):將Java程式的JDBC呼叫轉換成資料庫管理
系統專屬的網路協定,再由伺服器轉換成資料庫管理系統
的API呼叫。
Java原生通訊協定驅動程式(A Native-protocol All
Java Driver):將Java程式的JDBC呼叫直接轉換成資
料庫管理系統原生通訊協定的API呼叫,以便客戶端直接
連線資料庫伺服器。
11-2 建立MySQL的資料庫連結


11-2-1 安裝MySQL的JDBC驅動程式
11-2-2 使用JDBC連結MySQL資料庫
11-2-1 安裝MySQL的JDBC驅動
程式

MySQL資料庫系統支援JDBC的Java原生通訊協
定驅動程式,稱為MySQL Connector/J,我們
可以在MySQL網站免費下載,目前版本是3.0版,
在JSP的Web應用程式安裝MySQL
Connector/J,其步驟如下所示:
• 1. 使用解壓縮工具從壓縮檔取出JAR檔案:
mysql-connector-java-3.0.16-ga-bin.jar。
• 2. 將JAR檔案複製Web應用程式的「WEBINF\lib」資料夾,以本章的Ch11應用程式為
例,其完整路徑為
「C:\Inetpub\wwwroot\Ch11\WEBINF\lib」。
11-2-2 使用JDBC連結MySQL資料
庫-說明

在安裝好MySQL的JDBC驅動程式後,JSP
程式就可以使用JDBC建立資料庫連結,然
後透過JDBC API執行SQL指令來存取資料
庫的記錄資料。
11-2-2 使用JDBC連結MySQL資料
庫-步驟一
步驟一:載入驅動程式
 在JSP程式首先需要載入JDBC驅動程式,如下所
示:
String sDriver = "com.mysql.jdbc.Driver";
Class.forName(sDriver);
 上述程式碼的字串sDriver是驅動程式名稱
com.mysql.jdbc.Driver,接著使用Class類別
方法forName()方法載入驅動程式。
11-2-2 使用JDBC連結MySQL資料
庫-步驟二
步驟二:建立Connection連結物件
 在載入JDBC驅動程式後,就可以使用
DriverManager類別的getConnection()
類別方法建立Connection物件dbCon,如
下所示:
sCon =
"jdbc:mysql://localhost:3306/school?user
=root&password=123456";
dbCon=DriverManager.getConnection(sCon);
11-2-2 使用JDBC連結MySQL資料
庫-步驟三
步驟三:建立JDBC的Statement物件
 Statement物件的目的是執行SQL指令,
在建立好Connection物件後,就可以使用
createStatement()方法建立Statement
物件,如下所示:
stmt = dbCon.createStatement();
11-3 建立Access的資料庫連結



11-3-1 JDBC-ODBC資料庫連結的基礎
11-3-2 建立資料庫與系統資料來源
11-3-3 使用JDBC-ODBC連結Access資
料庫
11-3-1 JDBC-ODBC資料庫連結
的基礎-說明


Access並不支援JDBC驅動程式。所以JSP
程式需要使用JDBC的JDBC-ODBC橋接驅
動程式,透過JDBC-ODBC驅動程式存取
ODBC資料來源的Access資料庫。
「ODBC」(Object Database
Connectivity)是微軟開發的中介軟體,
提供Windows作業系統的應用程式一種標
準的資料庫存取方式,能夠存取位在其它
電腦上執行的資料庫系統。
11-3-1 JDBC-ODBC資料庫連結的
基礎-圖例
11-3-2 建立資料庫與系統資料來
源-建立Access資料庫

Access資料庫是學校資料庫School.mdb,在
School.mdb資料庫擁有Students資料表,其欄
位說明,如下表所示:
欄位名稱
stdno
name
address
birthday
totalcredit
資料類型
文字
文字
文字
日期/時間
數字/整數
長度
5
12
50
N/A
N/A
11-3-2 建立資料庫與系統資料來源新增ODBC系統資料來源

在Access建立好資料
庫後,就可以在
Windows作業系統建
立ODBC系統資料來源,
筆者準備在Windows
XP作業系統的電腦新
增Access資料庫
School.mdb名為
【school_db】的
ODBC系統資料來源,
如右圖所示:
11-3-3 使用JDBC-ODBC連結
Access資料庫-載入驅動程式
載入JDBC-ODBC驅動程式
 在JSP程式載入的驅動程式是透過ODBC存取資
料庫,所以載入JDBC-ODBC驅動程式,如下所
示:
String sDriver =
"sun.jdbc.odbc.JdbcOdbcDriver";
Class.forName(sDriver);
 上述程式碼的字串sDriver是驅動程式名稱
sun.jdbc.odbc.JdbcOdbcDriver,接著載入
JDBC-ODBC驅動程式。
11-3-3 使用JDBC-ODBC連結
Access資料庫-JDBC URL
JDBC URL位址字串
 在載入JDBC-ODBC驅動程式後,就可以
使用DriverManager類別的
getConnection()類別方法建立
Connection物件dbCon,如下所示:
String sCon = "jdbc:odbc:school_db";
dbCon =
DriverManager.getConnection(sCon);
11-4 JSP的資料庫基本存取



11-4-1 取得資料表的資訊
11-4-2 顯示資料表的記錄資料
11-4-3 使用JDBC連結MySQL資料庫的中
文問題
11-4-1 取得資料表的資訊-步驟四
取得資料表資訊是繼續第11-2-2節的步驟
三。
步驟四:使用Statement物件執行SQL指令
 在前面已經說過,建立Statement物件的
目的是執行SQL指令,如下所示:

String sSQL="SELECT * FROM students";
boolean state = stmt.execute(sSQL);
11-4-1 取得資料表的資訊-步驟五
步驟五:取得ResultSet和ResultSetMetaData物
件
 在使用Statement物件執行SQL指令後,接著可
以使用getResultSet()方法取得ResultSet物件,
如下所示:
ResultSet rs = stmt.getResultSet();
 上述程式碼在取得ResultSet物件後,再使用
getMetaData()方法取得ResultSetMetaData
物件,如下所示:
ResultSetMetaData md = rs.getMetaData();
 在取得ResultSetMetaData物件後,就可以使用
相關方法取得資料表的相關資訊。
11-4-1 取得資料表的資訊-方法

ResultSetMetaData物件的相關方法,如
下表所示:
方法
int getColumnCount()
int getColumnDisplaySize(int)
說明
取得資料表共有多少欄位
取得資料表欄位的尺寸,參數是欄位編
號,從 1 開始
String getColumnLabel(int)
取得資料表欄位名稱,參數是欄位編號
String getColumnTypeName(int) 取得資料表欄位的資料類型,參數是欄位
編號
11-4-2 顯示資料表的記錄資料-步驟
四
在這一節筆者準備執行SQL查詢指令取得資料表
的記錄資料,步驟是繼續第11-2-2節的步驟三。
步驟四:使用Statement物件執行SQL指令
 在JSP程式執行SQL查詢指令可以取得查詢結果
的ResultSet物件,這是使用executeQuery()方
法取得ResultSet物件,如下所示:
rs = stmt.executeQuery(sSQL);
 程式碼取得參數SQL指令sSQL查詢結果的
ResultSet物件rs,參數的SQL查詢指令可以取
得資料表students的所有記錄。

11-4-2 顯示資料表的記錄資料-步驟
五
步驟五:使用迴圈取得ResultSet物件的記錄
 在取得查詢結果的ResultSet物件後,可以使用
while迴圈配合next()方法來顯示記錄,如下所
示:
while ( rs.next() ) {
out.print(rs.getString("stdno"));
out.print(rs.getString("name"));
out.print(rs.getString("address"));
out.print(rs.getDate("birthday"));
out.print(rs.getInt("totalcredit"));
}
11-4-2 顯示資料表的記錄資料-步驟
五
步驟六:關閉連結的Connection和
Statement物件
 在處理完資料庫的查詢或操作後,JSP程式
需要關閉Connection和Statement物件,
使用的都是close()方法,如下所示:
stmt.close();
dbCon.close();
11-4-3 使用JDBC連結MySQL資料
庫的中文問題-編碼
指定JDBC驅動程式的編碼
 在載入JDBC驅動程式時,JSP程式需要指定編碼
參數來連結MySQL資料庫,如下所示:
String sCon =
"jdbc:mysql://localhost:3306/school?user=root&" +
"password=123456&useUnicode=true&characterEnc
oding=MS950";
dbCon = DriverManager.getConnection(sCon);

上述JDBC驅動程式設定useUnicode和
characterEncoding屬性值為true和MS950,
使用Unicode的MS950編碼。
11-4-3 使用JDBC連結MySQL資料
庫的中文問題-Unicode字串1
將中文欄位值轉換成Unicode字串
 在JSP程式顯示透過JDBC取得MySQL資料
庫的中文記錄資料時,因為JDBC驅動程式
在轉換中文內碼時,一個中文字會被切割
成2個字元,例如:0x4175會切割成0x41
和0x75。
 所以,JSP程式在顯示中文的記錄資料時,
需要先將欄位字串還原成完整中文內碼的
Unicode字串,這就是toUnicode()方法的
功能。
11-4-3 使用JDBC連結MySQL資料
庫的中文問題-Unicode字串2
String toUnicode(String s) {
if (s == null || s.length() == 0) {
return null;
}
byte[] buffer = new byte[s.length()];
int i, j;
for (i = 0, j = 0; i < s.length(); i++) {
if ( s.charAt(i) >= 0x100 ) {
char c = (char) s.charAt(i);
byte[] buf = (""+c).getBytes();
buffer[j++] = (byte) buf[0];
buffer[j++] = (byte) buf[1];
}
else
buffer[j++] = (byte) s.charAt(i);
}
return new String(buffer,0,j);
}
11-4-3 使用JDBC連結MySQL資料
庫的中文問題-表單資料編碼
指定表單傳送資料的編碼
 當SQL指令或欄位值使用表單方式傳遞中文內容
給JSP程式時,在JSP程式需要指定傳送的編碼方
式,如下所示:
request.setCharacterEncoding("MS950");
 上述程式碼使用request物件的
setCharacterEncoding()方法指定傳送的編碼
方式為MS950,這和JDBC驅動程式的編碼相同,
如此JSP程式才能送出正確的SQL指令,將中文
欄位內容存入資料庫。
11-5 SQL語言的資料庫查詢



11-5-1 分頁顯示SQL查詢結果
11-5-2 SQL語言的基礎
11-5-3 SQL查詢指令 - SELECT
11-5-1 分頁顯示SQL查詢結果建立Statement物件
建立分頁顯示的Statement物件
 因為ResultSet物件的記錄資料需要使用相
關方法來移動記錄指標,如此才能分頁顯
示查詢結果,所以在使用Connection物件
的方法建立Statement物件時,需要設定
指標型態和同步等級,如下所示:
stmt = dbCon.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
11-5-1 分頁顯示SQL查詢結果-移動
記錄指標的方法
ResultSet物件移動記錄指標的相關方法
方法
說明
boolean first()
移動記錄指標到第 1 筆記錄,成功傳回 true
boolean last()
移動記錄指標到最後 1 筆記錄,成功傳回 true
boolean isFirst()
檢查記錄指標是否是第 1 筆記錄,是傳回 true
boolean isLast()
檢查記錄指標是否是最後 1 筆記錄,是傳回 true
boolean
檢查記錄指標是否在第 1 筆記錄之前,是傳回 true
isBeforeFirst()
boolean isAfterLast() 檢查記錄指標是否在最後 1 筆記錄之後,是傳回 true
int getRow()
取得目前這筆記錄是 ResultSet 物件的第幾筆記錄,
即記錄編號
boolean absolute(int) 移動記錄指標到參數記錄編號的第幾筆記錄,成功傳
回 true
11-5-1 分頁顯示SQL查詢結果-分頁
顯示1
當JSP程式分頁顯示SQL查詢結果時,首先
需要計算出ResultSet物件的記錄總數,如
下所示:
rs.last();
int totalRecords = rs.getRow();
 在取得記錄總數後,即可計算出這些記錄
一共可以分成幾頁來顯示,如下所示:
totalPages = totalRecords/pageSize;
if ( (totalRecords % pageSize) != 0 )
totalPages++;

11-5-1 分頁顯示SQL查詢結果-分頁
顯示2
在計算出記錄數和分頁數後,只需使用URL參數
傳入顯示的分頁pageNo,就可以移動記錄指標
到指定分頁的第1筆記錄,如下所示:
rs.absolute((pageNo-1) * pageSize + 1);
 在JSP程式顯示分頁記錄是一個do/while迴圈,
因為我們已經使用absloute()方法移動記錄指標
到分頁的第1筆記錄,所以可以直接取得欄位值,
如下所示:
int count = 0;
do {
count++;
………
} while ( rs.next() && count < pageSize );

11-5-2 SQL語言的基礎-說明


「SQL」(Structured Query Language)是
「ANSI」(American National Standards
Institute)標準的資料庫語言,SQL指令語法可
以用來查詢、新增、刪除和更新資料庫的記錄,
目前Access、SQL Server、DB2、MySQL、
MySQL MaxDB、Oracle和Sybase等資料庫管
理系統都是以ANSI的SQL語言作為標準的資料庫
語言。
早在1970年,E. F. Codd建立關聯式資料庫的觀
念,同時提出構想的資料庫語言,這是一種完整
和通用的資料存取方式,雖然在當時並沒有真正
建立語法,但這就是SQL的源起。
11-5-2 SQL語言的基礎-種類



資料定義語言(Data Definition Language,
DLL):建立資料表、索引和視界(Views)等,
並且定義資料表的欄位。
資料操作語言(Data Manipulation
Language,DML):屬於資料表記錄查詢、
插入、刪除和更新指令。
資料控制語言(Data Control Language,
DCL):屬於資料庫安全設定和權限管理的相關
指令。
11-5-3 SQL查詢指令 – SELECT
(語法)
JSP程式在建立資料庫連結後,就可以使用
SQL指令進行資料庫查詢,SQL的資料查
詢指令只有一個SELECT指令,完整指令語
法如下所示:
SELECT 欄位1, 欄位2 FROM 資料表
WHERE conditions
 上述SELECT指令的欄位1~2為記錄的欄位,
conditions是查詢條件,指令使用口語來
說是「從資料表取回符合WHERE子句條件
的記錄,顯示欄位1和2」。

11-5-3 SQL查詢指令 – SELECT
("*"記錄欄位)
"*"記錄欄位
 在前述SQL語法的欄位1~2是取回的資料
表欄位,我們可以使用"*"符號代表所有欄
位,表示取回資料表記錄的所有欄位,如
下所示:
SELECT * FROM students
 上述指令沒有WHERE子句,所以將資料表
內所有的記錄和欄位取回。
11-5-3 SQL查詢指令 – SELECT
(單一查詢條件1)
單一查詢條件的WHERE子句
 SQL查詢指令的單一條件,WHERE子句的基本
規則和範例,如下所示:
 文字欄位要加上單引號,例如:學號93001,如
下所示:
SELECT * FROM students WHERE
stdno='93001'
 數值欄位不需要額外字元括起,例如:總學分大
於17,如下所示:
SELECT * FROM students WHERE totalcredit
> 17

11-5-3 SQL查詢指令 – SELECT
(單一查詢條件2)
文字的欄位可以使用【LIKE】包含運算子
配合"%"萬用字元,此時查詢的條件子句
只需包含的子字串就符合條件,例如:學
號包含"3"的子字串,如下所示:
SELECT * FROM students WHERE
stdno LIKE '%3%'
 數值或日期欄位可以使用<>、>、<、>=
和<=不等於、大於、小於、大於等於和小
於等於等運算子建立多樣化的查詢條件。

11-5-3 SQL查詢指令 – SELECT
(多重查詢條件)
多重查詢條件的WHERE子句
 WHERE子句的查詢條件可以使用AND和OR邏輯
運算子連接,其基本語法,如下所示:
 AND且運算子:連接的前後條件都必須成立,整
個條件才成立。例如:學號包含"3"且姓名有"會"
子字串,如下所示:
SELECT * FROM students WHERE stdno LIKE
'%3%' AND name LIKE '%會%'
 OR或運算子:連接的前後條件只需任何一個成立
即可。例如:學號包含"6"或姓名有"會"子字串,
如下所示:
SELECT * FROM students WHERE stdno LIKE
'%6%' OR name LIKE '%會%'
11-5-3 SQL查詢指令 – SELECT
(排序輸出)
排序輸出
 SQL的查詢結果可以指定欄位進行由小到大,或
由大到小排序,只需在SELECT指令的最後加上
ORDER BY子句即可,如下所示:
SELECT * FROM students WHERE totalcredit
> 17 ORDER BY totalcredit
 上述查詢結果使用totalcredit欄位排序,預設是
由小到大的ASC,如果想倒過來由大到小,只需
加上DESC,如下所示:
SELECT * FROM students WHERE totalcredit
> 17 ORDER BY totalcredit DESC
11-6 SQL語言的資料庫操作


11-6-1 在資料表插入、刪除和更新記錄
11-6-2 PreparedStatement類別執行
SQL指令
11-6-1 在資料表插入、刪除和更
新記錄-插入記錄
SQL語言插入記錄指令INSERT可以新增一筆記
錄到資料表,INSERT指令的語法格式,如下所
示:
INSERT INTO table (column1,column2,…..)
VALUES ('value1', 'value2 ', …)
 INSERT指令的注意事項,如下所示:

• 不論欄位或值的清單,都需要使用逗號分隔。
• INSERT指令VALUES的值,數值不用單引號包圍,字
元與日期/時間需要單引號包圍,Access的日期時間需
要"#"符號。
• INSERT指令的欄位名稱清單,並不需要和資料表定義
的欄位數目或順序相同,只需選擇需要新增資料的欄
位,但是括號內的欄位名稱順序需和VALUES值的順序
相同。
11-6-1 在資料表插入、刪除和更新
記錄-更新記錄
UPDATE更新記錄指令是將資料表內符合條件的
記錄,都更新成指定的欄位值,語法如下所示:
UPDATE table SET column1 = ‘value1’
WHERE conditions
 如果更新欄位不只一個,請使用逗號分隔,其語
法格式,如下所示:
UPDATE table SET column1 = 'value1' ,
column2 = 'value2' WHERE conditions
 UPDATE指令的注意事項,如下所示:

• WHERE子句是必要元素,如果沒有WHERE子句,資
料表內所有記錄欄位都會被更新。
• 更新欄位值是數值不用單引號包圍,字元與日期/時間
需要單引號包圍,Access的日期時間需要"#"符號。
11-6-1 在資料表插入、刪除和更新
記錄-刪除記錄
SQL語言刪除記錄指令DELETE是將資料表內符
合條件的記錄通通刪除掉。DELETE指令的語法
格式,如下所示:
DELETE FROM table WHERE conditions
 上述指令table是資料表,WHERE子句
conditions為刪除記錄的條件,口語來說是「將
符合conditions條件的記錄刪除掉」,DELETE
指令的注意事項,如下所示:

• WHERE子句是DELETE指令的必要元素,如果沒有
WHERE子句,資料表內的所有記錄都會被刪除。
11-6-2 PreparedStatement類別
執行SQL指令-1

PreparedStatement類別是Statement
類別的子介面,PreparedStatement物件
可以預先建立SQL指令字串,並且使用參
數指定欄位值,以避免欄位資料型態轉換
的錯誤,如下所示:
String sSQL="INSERT INTO students " +
"(stdno,name,address,birthday,totalcredit) ";
sSQL+="VALUES (?,?,?,#"+birthday+"#,?)";
11-6-2 PreparedStatement類別執行
SQL指令-2
接著使用prepareStatement()方法建立
PreparedStatement物件pstmt,如下所示:
PreparedStatement pstmt =
dbCon.prepareStatement(sSQL);
 PreparedStatement物件pstmt的SQL指令參
數需要使用setXXX()方法,這些方法是對應
ResultSet類別的getXXX()方法,如下所示:
pstmt.setString(1, stdno);
pstmt.setString(2, name);
pstmt.setString(3, address);
pstmt.setInt(4, Integer.parseInt(credit));

11-7 JNDI與連結池


11-7-1 連結池與JNDI的基礎
11-7-2 在JSP程式使用JNDI與連結池
11-7-1 連結池與JNDI的基礎-說明


在JDBC 2.0版定義資料來源(DataSource)介
面,可以讓Java應用程式使用此機制取得資料庫
連結,換句話說,在JSP程式並不需要撰寫建立
資料庫連結的相關程式碼,而是從資料來源取得
資料庫連結,如此,在不修改JSP程式情況下,
就可以更改資料來源連結的資料庫。
當JSP容器實作JDBC 2.0的資料來源
(DataSource)介面,就可以將資料庫連結的
管理工作交給JSP容器來處理,而不用JSP程式自
行處理。例如:Resin的JSP容器已經實作JDBC
的資料來源介面,而且支援連結池(Connection
Pool)的功能。
11-7-1 連結池與JNDI的基礎-連結池


連結池(Connection Pool)是在維護多個資料
庫連結的集合,以便重複使用這些資料庫連結來
降低使用資料庫所造成的系統負擔,因為JSP程
式建立資料庫連結是一種十分浪費系統資源的操
作,如果重複使用已經開啟的資料庫連結,就可
以大幅提昇系統效能。
連結池的運作是在一開始就建立一定數量的資料
庫連結,如同一個池塘,當JSP程式需要使用資
料庫連結時,就從池塘中取出沒用使用的資料庫
連結給JSP程式使用,在使用完後即歸還連結池,
以便其它JSP程式可以重複使用。
11-7-1 連結池與JNDI的基礎-JNDI


JNDI (Java Naming and Directory
Interface)提供Java應用程式所需資源的
命名服務(Naming Service),簡單的說,
如同Internet的DNS命名服務,使用網域
名稱即可找到指定的主機資源。
JNDI可以先定義資源的JNDI名稱,在
Java應用程式只需使用JNDI名稱即可取得
所需的資源。
11-7-2 在JSP程式使用JNDI與連結
池-定義JNDI的資料來源與連結池
在web.xml或resin.conf檔案是在<web-app-default>或<web-app>標
籤下使用<database>子標籤來定義JNDI的資料來源與連結池,如下所示:
<database>
<jndi-name>jdbc/mysql</jndi-name>
<driver>
<type>
com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource
</type>
<url>jdbc:mysql://localhost:3306/school</url>
<user>root</user>
<password>123456</password>
</driver>
<prepared-statement-cache-size>8</prepared-statement-cachesize>
<max-connections>20</max-connections>
<max-idle-time>30s</max-idle-time>
<init-param useUnicode="true" characterEncoding="MS950"/>
</database>

11-7-2 在JSP程式使用JNDI與連結
池-取得JNDI定義的資料庫連結
在JSP程式在JSP程式取得JNDI定義的資料庫連結前,需
要匯入一些套件,如下所示:
<%@ page import="java.sql.*"%>
<%@ page import="javax.sql.*"%>
<%@ page import="javax.naming.*"%>
 JSP程式使用InitialContext物件的lookup()方法找尋
JNDI名稱,其搜尋路徑為java:comp/env,如下所示:
Context env=(Context) new
InitialContext().lookup("java:comp/env");
DataSource ds = (DataSource)
env.lookup("jdbc/mysql");
 在找到後,即可取得資料庫連結,如下所示:
Connection dbCon = ds.getConnection();

11-8 JSTL的資料庫存取標籤庫




11-8-1
11-8-2
11-8-3
11-8-4
指定資料來源標籤
資料庫查詢標籤
資料庫更新標籤
交易處理標籤
11-8 JSTL的資料庫存取標籤庫
JSTL資料庫存取標籤庫提供資料庫查詢、
更新和交易(Transaction)處理標籤,在
JSP程式請先使用taglib指引元素匯入資料
庫存取標籤庫的URI,如下所示:
<%@ taglib
uri="http://java.sun.com/jsp/jstl/sql“
prefix="sql" %>

11-8-1 指定資料來源標籤

<sql:setDataSource>標籤可以指定JSP
程式預設資料庫的資料來源,如下所示:
<sql:setDataSource
driver="sun.jdbc.odbc.JdbcOdbcDriver"
url="jdbc:odbc:school_db"/>

上述標籤指定JDBC-ODBC驅動程式,存
取ODBC系統資料來源school_db的資料
庫。
11-8-2 資料庫查詢標籤-說明
JSTL的資料庫查詢標籤是<sql:query>,
可以執行SQL查詢指令來查詢資料庫的記
錄資料,如下所示:
<sql:query var="result">
SELECT * FROM students
</sql:query>
 上述標籤執行其中的SQL指令,將傳回的
記錄資料儲存在var屬性的result變數。

11-8-2 資料庫查詢標籤-指定使用的
資料來源
<sql:query>標籤的dataSource屬性可以指定資料來源,
其值是<sql:setDataSource>標籤指定的資料來源變數,
如下所示:
<sql:setDataSource
driver="sun.jdbc.odbc.JdbcOdbcDriver"
url="jdbc:odbc:school_db"
var="school_db" scope="session"/>
 在同一個交談期的JSP程式,都可以直接使用此資料來源,
如下所示:
<sql:query var="result"
dataSource="${sessionScope.school_db}">
SELECT * FROM students
</sql:query>

11-8-2 資料庫查詢標籤-顯示查詢結
果(標題列)
<sql:query>標籤的var屬性指定儲存查
詢結果的物件變數,JSP程式使用
columnNames屬性取得記錄的欄位名稱,
配合<c:forEach>標籤,就可以顯示查詢
結果的標題列,如下所示:
<c:forEach
items="${result.columnNames}"
var="row">
<td><c:out value="${row}"/></td>
</c:forEach>

11-8-2 資料庫查詢標籤-顯示查詢結
果(rows屬性)
取得查詢記錄的欄位值是使用rows屬性,如下所
示:
<c:forEach items="${result.rows}"
var="row">
<tr>
<td><c:out
value="${row.stdno}"/></td>
…………
<td><c:out
value="${row.totalcredit}"/></td>
</tr>
</c:forEach>

11-8-2 資料庫查詢標籤-顯示查詢結
果(rowsByIndex屬性)
使用欄位索引,請使用rowsByIndex屬性,如下
所示:
<c:forEach items="${result.rowsByIndex}"
var="row">
<tr>
<td><c:out value="${row[0]}"/></td>
<td><c:out value="${row[1]}"/></td>
…………
<td><c:out value="${row[4]}"/></td>
</tr>
</c:forEach>

11-8-3 資料庫更新標籤
JSTL的資料庫更新標籤<sql:update>可以執行SQL操
作指令來新增、更新或刪除記錄資料,如下所示:
<sql:update var="count">
UPDATE students SET address=?,birthday=?
WHERE stdno=?
<sql:param value="${param.Address}"/>
<sql:dateParam value="${b_date}"
type="date"/>
<sql:param value="${param.Stdno}"/>
</sql:update>
 標籤可以執行其中的SQL操作指令,在指令中的3個"?"符
號代表3個動態參數,其值是使用<sql:param>和
<sql:dateParam>子標籤依序指定參數值。

11-8-4 交易處理標籤-說明

在資料庫系統的最主要操作是存取資料庫
中的資料,如果有多個存取操作需要執行,
而且這些操作需要視為一個無法分割的單
位。整個操作過程對於資料庫系統來說稱
為一個「交易」(Transaction),或譯成
「異動」。
11-8-4 交易處理標籤-範例
JSTL的<sql:transaction>標籤可以將多個
<sql:query>和<sql:update>標籤的SQL查詢
與操作指令視為一個交易,如下所示:
<sql:transaction>
<sql:query var="count">
SELECT * ……
</sql:query>
<sql:update var="count">
INSERT ………..
</sql:update>
</sql:transaction>
