2010年7月19日 星期一

J2EE - 資料庫讀取

我一般使用的資料庫是 MySQL

先介紹一些基本的SQL語法:

建立一個名為 demo 的資料庫:

CREATE DATABASE demo;

使用 demo 資料庫:

USE demo;

建立名為 book 的資料表:

CREATE TABLE book (
 bookId INT PRIMARY KEY, //bookId 為主鍵
 bookName VARCHAR(20), //書名
 publisher VARCHAR(20), // 出版社
 price INT // 價格
);

加入一筆資料到 book:

INSERT INTO book VALUES (1, 'J2EE 開發手冊', '雞豐', 500);


譬如最後的結果如下:




接下來可以撰寫一張 JSP 去讀取資料庫的內容,因為這邊只是單純的介紹如何讀取資料庫

所以直接將程式撰寫在 JSP 頁面裡,也缺乏模組化或透過 hibernate 來簡化

但最基本的連接資料庫即如下:

首先必須要有 JDBC 的驅動程式

將 JDBC 的 jar 置放在該 web application 的 /WEB-INF/lib 下

之後在 撰寫幾行固定的程式

Class.forName("com.mysql.jdbc.Driver") ; //載入驅動程式

Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo","root","XXX");
//透過 DriverManager 取得 Connection
//getConnection() 的參數就是設定了 url、使用者名稱、和密碼
//jdbc:mysql://localhost:3306/demo
//其中localhost 主機名稱 3306 連接埠 demo 資料庫名稱
// root 是 user XXX 是密碼

接下來要執行 SQL 語句來讀取資料庫,必須先取得 Statemant 物件,如下:

Statement stmt = conn.createStatement(); //用 Connection 物件呼叫 createStatement()

最後再透過 Statement 的 executeQuery() 方法,來執行查詢語句

ResultSet rst = stmt.executeQuery("SELECT * FROM book;");

呼叫後回傳的 ResultSet 物件,即為查詢後的結果
之後在用 next() 方法取得下一筆資料


while(rst.next())
{
//透過 ResultSet 物件的 getString() 和 getInt() 取得相對應的欄位值
 out.println("<tr>");
 out.println("<td>" + rst.getInt("bookId")+ "</td>");
 out.println("<td>" + rst.getString("bookName")+ "</td>");
 out.println("<td>" + rst.getString("publisher")+ "</td>");
 out.println("<td>" + rst.getInt("price")+ "</td>");
 out.println("</tr>");
}

因為這邊在設定 MySQL 的時候 還沒換成 UTF-8 的編碼
加上在 DriverManager.getConnection() 的時候
沒有告知要用何種編碼,譬如:

jdbc:mysql://localhost:3306/demo?user=root&amp;password=XXX&amp;useUnicode=true&amp;characterEncoding=UTF8

&amp;為 '&' 的替代字元


如果沒有進行以上的動作,則從 JSP 讀出來的中文字可能會變成亂碼

但可透過以下的方法調校:

String bookName = new String(rst.getString("bookName").getBytes("ISO-8859-1"), "BIG5");

new String() 建構子有很多覆載的形式,可以去 API 上看看。



沒有留言:

張貼留言