2008年8月21日 星期四

JAVA --- Statement與PreparedStatement的差別

首先先分別展示Statement與PrepareStatement兩者用法上的差異.
Statement:
...
String strsql = "insert into mytable(Name, Birthday) values("SHAGIN45","1984/06/07")";
Statement mysta = new Statement();
mysta.executeUpdate(strsql);
...

PreparedStatement:
...
String strsql = "insert into mytable(Name, Birthday) values(?,?)";
PreparedStatement mysta = new PrepareStatement();
mysta.setString(1,"SHAGIN45");
mysta.setString(2,"1984/06/07");
mysta.executeUpdate();

從上面兩個例子,可以很明顯的看出兩者使用上的不同,當你所執行sql不需要設定參數時,你就可以使用Statement.反之,若是你需要自行在適當的時機,設定相對應的參數時,則可以使用PrepareStatement (而且PrepareStatement的sql語法使用上閱讀性比較好).

在網路上有許多人在討論PrepareStatement跟Statement兩者間的效能差異,PreparedStatement在Oracle上的表現比Statement來的好(在MySQL上似乎就看不出兩者的性能優劣),並且當要重複執行同一sql多次時,PreparedStatement也會表現的比Statement來的好.但是,由於PreparedStatement的sql是可以自行設定參數型態,因此當sql要被傳至DB執行時,其還需進行編碼轉換,而Statement只需對已經寫死的sql進行字串轉換,所以以單純的查詢動作來說,Statement的表現可能還會比PreparedStatement表現來的好. 總歸一句,除了看你使用PreparedStatement或是Statement會影響DB的存取效能外,你所使用的JDBC Deiver與SQL語法也都會影響,因此遇到需要重複執行sql或是要自訂參數時,我建議使用PreparedStatement;只需要對DB進行簡單的查詢時,我則建議使用Statement!

reference:
http://ivanl.javaeye.com/blog/49129
http://www.javaeye.com/topic/5631

End~

2008年8月12日 星期二

JAVA --- 連接DataBase

我這次使用MySQL來建立我的DB,在設定好DB的table以及其內容後,接下來就是要讓自己的程式與其相連接嚕~.在JDBC連結DB的時候有幾個動作要做:

註冊驅動程式--->建立連線--->產生Statement--->利用Statement執行sql要求--->得到結果.

Step1. 首先就是註冊MySQL的Driver. 你必須先去MySQL的官網下載其驅動程式 http://dev.mysql.com/downloads/connector/j/5.0.html ,下載下來後解壓縮,並且把解壓縮後的資料夾內,一個名為 "mysql-connector-java-[version]-bin.jar" 的檔案複製到C:\Program Files\Java\jre[version]\lib\ext 內 (要注意一下自己的jre版本,java下可能會有不同版本的jre,要把mysql-connector-java-[version]-bin.jar複製到正確的jre內),接著再重新啟動eclipse,其會自動將MySQL的驅動載入.

Step2. 接著就是要在程式上動手腳了.首先要利用Class.forName()來對DriverManager註冊Driver,例如:
String JD = "com.mysql.jdbc.Driver";
Class.forName(JD);
其主要的作用是讓JVM查找指定的class,並且執行class內某段static程式碼,例如:
static {
DriverManager.registerDriver(Driver driver) ;
}
若是找不到指定的資料庫驅動程式類別,則會丟出java.lang.ClassNotFoundException !!

Step3. 產生Connection object. 利用DriverManager.getConnection()來決定你要連結的資料庫,以及要以什麼身分登入,例如:
try{
String DU = "jdbc:mysql://localhost/brick"; //使用jdbc協定,子協定為mysql,資料庫名稱為//localhost/brick
Connection connection = DriverManager.getConnection(DU,"root", "123");
} catch (ClassNotFoundException e){
System.out.println ("系統找不到connection class!");
}catch(SQLException sqlException){
sqlException.printStackTrace();
System.exit(1);
}
若是DriverManager無法連接到資料庫,getConnection()則會丟出java.sql.SQLException!!

Step4. 利用Statement執行SQL語法. 可以用connection.createStatement()來產生statement object,例如:
Statement statement = connection.createStatement();
產生出來後使用statement使用executeUpdate(),executeQuery()等方法來執行sql語法,並且它們會回傳ResultSet object,例如:
String sql = "select * from tbCusinfo";
ResultSet rs = atement.executeQuery(sql);
另外,executeUpdate()主要是用來執行CREATE TABLE、INSERT、DROP TABLE、ALTER TABLE等會改變資料庫內容的sql語法.

Step5. 利用ResultSetMetaData取得ResultSet object中關於欄位 (Field) 的資訊.例如:
ResultSetMetaData metaData = resultSet.getMetaData();
int noofcolumns = metaData.getColumnCount(); //取得欄位個數

上述主要幾個步驟就是JDBC連接DB時幾個主要的步驟,若是後續還有需要對DB取出的data進行使用的話,則可利用metaData.getXXX()的方式做處理.

reference
http://caterpillar.onlyfun.net/Gossip/JavaGossip-V2/StatementResultSet.htm
http://dslab.ee.ncku.edu.tw/~lok/notes/java/jdbc/jdbc.htm

End~

2008年8月10日 星期日

My SQL---Error message 1366

今天試用MySQL來建立資料庫.安裝好後建立了一個測試資料庫,但是要新增資料的時候卻失敗了,顯示Error message-1366,我上網找了一下有沒有解決的辦法,發現原來是default-character-set設定的問題,在安裝好MySQL後,系統會預設使用default-character-set=latin1,所以當你的資料有中文,日文,韓文...等等語言時,它會無法encode~因此以下為解決此錯誤的方法:

Step1. 先停止MySQL的service. (可以去官網下載其所提供的tools,這些tools可以提供GUI對DB進行管理或監測).

Step2. 找出MySQL安裝目錄下的一個檔案,名為"my.ini".

Step3. 開啟此檔,並且在[mysqld]下加入default-character-set=GBK,並把本來的efault-character-set=latin1註解掉.

Step4. 重新啟動MySQL的service,並且把原先的DB刪掉,重新再建立一個DB~這樣就OK拉!!

Referce
MySQL官網下載:
http://dev.mysql.com/downloads/
MySQL GUI Tools 下載:
http://dev.mysql.com/downloads/gui-tools/5.0.html

End~