從Jpetstore 開始IBATIS之旅

來源:互聯網
上載者:User

前一陣在研究O/R MAPPING,覺得HIBERNATE和IBATIS都是好東西,但IBATIS更容易上手,而且跟資料庫打交道的時候只需把SQL 陳述式配置在XML裡即可,不象HIBERNAMTE要寫複合其規範的HQL。當然現在HIBERNATE大行其道肯定是有道理的,我過一陣子也打算好好學習一下。
技術發展的太快,學習方法是很重要的。(看來開源確實促進了生產力的發展啊,由此推斷,共產主義社會肯定會實現的啦。)我認為必須摒棄抱本書按部就班的學習方法,而應該是STUDY IN ACTION,在實踐中學習,缺啥補啥,大不了不斷重構好了。當然前提是有一定的技術積累了。 為了學習IBATIS,除了大致看了一下IBATIS的官方文檔,我把主要精力放在研究作者的範例JPETSTORE上了,大家可以道WWW.IBATIS.COM去下載4.0版本的例子,3.X的不要下了,代碼寫的沒有4.0的優美。 然後再去下載MYSQL,TOMCAT,安裝調試讓JETSTORE跑起來。這個過程我就不講了,大家動動腦筋找點成就感吧。工欲善其事,必先利其器。我用的是JBUILDER9,因為我以前用DELPHI的對BORLAND的產品有感情啊(當然BORLAND不會對我有感情,因為。。。。。。^_^,中國特色)。建一個新項目,儲存後關掉PROJECT,然後把JPETSTORE的程式碼封裝拷貝到:project rc\下,再開啟剛才的項目,順利的話你就能看到項目下的一堆包啦。現在編譯肯定是有問題的,別急別急,在項目裡載入上JPETSTORE源碼LIB目錄下的所有.JAR和SERVLET.JAR,為了連MYSQL,你還得載入MYSQL的JDBC驅動。具體做法,你可以在JBUILDER9 Tools\config libraries 建立三個LIB,比如IBATISLIB裡放上JPETSTORE源碼LIB目錄下的所有.JAR,servlet就不要建了,JB9裡帶了,再建一個MYSQLLIB放上MYSQL的JDBC驅動的.jar,然後修改JPETSTORE源碼SRC\PROPERTIES\database.properties的內容,例如,我的是driver=org.gjt.mm.mysql.Driverurl=jdbc:mysql://localhost/jpetstoreusername=jpetstorepassword=ibatis9977現在MAKE PROJECT應該可以通過了。好啦,開啟com.ibatis.jpetstore底下的所有.java檔案吧。Domain目錄下放的是JAVABEAN,一般是跟表相對應的。Persistence目錄下放的是DAO介面和具體實作類別,DAO即Data Access Objects(DATA ACCESS OBJECT),是用來跟資料庫打交道的。IBATIS的O/R MAPPING的使用方法也就在這個目錄裡面。Presentation目錄下放的是FORMBEAN,後面還要說到JPETSTORE範例對STRUTS的創造性使用。Service目錄下放的是SERVICE類,通過SERVICE對象調用DAO對象的方法來訪問資料庫的,這是一種常用的設計模式。 常見的STRUTS編程應該是一個動作對應一個ACTION,例如寫一個交友網站,使用者登入和使用者查詢就得寫分別寫兩個ACTION來處理。而JPETSTORE的作者克林頓(Clinton Begin,名字夠響亮的)寫了一個ACTION動態調用FORMBEAN的不同方法來處理不同的動作。代碼如下,注意execute()的寫法!
public class BeanAction extends Action {
public ActionForward execute(ActionMapping mapping,
ActionForm form, HttpServletRequest request,
HttpServletResponse response)
throws Exception {
String forward = "success";
try {
ActionContext.initialize(request, response);
if (form != null) {
// Explicit Method Mapping
Method method = null;
String methodName = mapping.getParameter();
if (methodName != null && !"*".equals(methodName)) {
try {
method = form.getClass().getMethod(methodName,
null); forward = (String) method.invoke(form, null);
} catch (Exception e) {
throw new BeanActionException("Error dispatching
bean action via method parameter ('" + methodName + "').
Cause: " + e, e);
}
}
// Path Based Method Mapping
if (method == null && !"*".equals(methodName)) {
methodName = mapping.getPath();
if (methodName.length() > 1) {
int slash = methodName.lastIndexOf("/") + 1;
methodName = methodName.substring(slash);
if (methodName.length() > 0) {
try {
method = form.getClass().getMethod
(methodName, null);
forward = (String) method.invoke(form, null);
} catch (Exception e) {
throw new BeanActionException("Error dispatching
bean action via URL pattern ('" + methodName + "').
Cause: " + e, e);
}
}
}
}
}
} catch (Exception e) {
request.setAttribute("BeanActionException", e);
throw e;
}
return mapping.findForward(forward);
}
}

也就是通過對struts-config.xml的配置資訊的讀取來決定調用的方法,或者是不調用任何方法。例如: 當ACTIONSERVLET收到請求/shop/viewCategory.shtml,(JPETSTORE裡尾碼定義的是“.shtml”)調用catalogBean的viewCategory方法。怎麼樣,有創意吧,如果你願意,就再也不用寫那麼多的ACTION了。下面談一談IBATIS的O/R MAPPING吧。請大家開啟目錄your project\com\ibatis\jpetstore\persistence qlmapdao ql,看到了什嗎?除了設定檔sql-map-config.xml以外,是一些和JAVABEAN相對應的XML,開啟sql-map-config.xml和Acount.xml看看吧,再返到your project\com\ibatis\jpetstore\persistence目錄,開啟dao.xml發現他們的關係了吧。可能這時你搞不清這些XML有什麼用處,別急,IBATIS官方文檔裡說的很清楚(有中文版的哦)。我大致說一下跟JAVABEAN對應的那些XML檔案的作用吧,比如Acount.xml,是映射JAVABEAN和資料庫的表的檔案。你可以按照IBATIS的規範在裡面寫任意的SQL語句,參數和傳回值可以是基本類型及其封裝類,MAP,自訂的類。最常用的當然是返回自訂類執行個體了。不過如果傳回值是自訂的類執行個體的話,你就需要先定義resultMap,比如:<resultMap id="accountResult" class="account"> <result property="username" column="USERID"/> <result property="email" column="EMAIL"/> <result property="firstName" column="FIRSTNAME"/> <result property="lastName" column="LASTNAME"/> <result property="status" column="STATUS"/> <result property="address1" column="ADDR1"/> <result property="address2" column="ADDR2"/> <result property="city" column="CITY"/> <result property="state" column="STATE"/> <result property="zip" column="ZIP"/> <result property="country" column="COUNTRY"/> <result property="phone" column="PHONE"/> <result property="languagePreference" column="LANGPREF"/> <result property="favouriteCategoryId" column="FAVCATEGORY" /> <result property="listOption" column="MYLISTOPT" /> <result property="bannerOption" column="BANNEROPT" /> <result property="bannerName" column="BANNERNAME" /> <resultMap>然後再引用:<select id="getAccountByUsername" resultMap="accountResult" parameterClass="string"> select SIGNON.USERNAME as USERID, ACCOUNT.EMAIL, ACCOUNT.FIRSTNAME, ACCOUNT.LASTNAME, ACCOUNT.STATUS, ACCOUNT.ADDR1, ACCOUNT.ADDR2, ACCOUNT.CITY, ACCOUNT.STATE, ACCOUNT.ZIP, ACCOUNT.COUNTRY, ACCOUNT.PHONE, PROFILE.LANGPREF, PROFILE.FAVCATEGORY, PROFILE.MYLISTOPT, PROFILE.BANNEROPT, BANNERDATA.BANNERNAME from ACCOUNT, PROFILE, SIGNON, BANNERDATA where ACCOUNT.USERID = #value# and SIGNON.USERNAME = ACCOUNT.USERID and PROFILE.USERID = ACCOUNT.USERID and PROFILE.FAVCATEGORY = BANNERDATA.FAVCATEGORY <select>再開啟AccountSqlMapDao.java看看:
public Account getAccount(String username) { return (Account) queryForObject("getAccountByUsername", username); }
思考一下,看明白其中的關聯了吧。開啟AccountService.JAVA:
public Account getAccount(String username) {
return accountDao.getAccount(username);
}
開啟AccountBean.java:
public String newAccount() {
try {
accountService.insertAccount(account);
account = accountService.getAccount
(account.getUsername());//在這調用的
myList = catalogService.getProductListByCategory
(account.getFavouriteCategoryId());
authenticated = true;
repeatedPassword = null;
return "success";
} catch (Exception e) {
throw new BeanActionException ("There was a problem
creating your Account Information. Cause: " + e, e); }
}
看了半天,寫個例子試試吧
package com.ibatis.jpetstore.service;
import com.ibatis.dao.client.DaoManager;
import com.ibatis.jpetstore.domain.*;
import com.ibatis.jpetstore.persistence.DaoConfig;
import com.ibatis.common.util.PaginatedList;
import com.ibatis.jpetstore.persistence.iface.*;
import java.util.*;
public class IbatisTest {
private DaoManager daoManager =
DaoConfig.getDaomanager();
private AccountDao accountDao;
public IbatisTest() {
accountDao = (AccountDao) daoManager.getDao
(AccountDao.class);
Account account=accountDao.getAccount("j2ee", "j2ee");
System.out.println(account.getFirstName());
}
public static void main(String[] args) {
IbatisTest ibatisTest=new IbatisTest();
}
}
你還可以試試insert,update,delete。IBATIS裡可是支援分頁的,用起來很爽的,大家有空還是花點功夫鑽研一下吧。關於DEBUG:我前兩天照搬JPETSTORE的架構試著寫了一個交友網站,基本上挺順利,只是感覺DEBUG比較麻煩,通常為了找一個錯花上幾個小時。JBUILDER帶的DEBUG我沒用過,但可是肯定肯定和DELPHI上的DEBUG是有天壤之別的。而且JUNIT我也是剛開始學,也沒用上。這裡,我把自己比較土的辦法介紹一下:一,當你寫了新的O/R MAPPING的時候,可以先寫個包含MAIN方法的類測試一下,就向我上面的測試例子一樣。二,當你想跟蹤變數值的時候,你可以利用IBATIS帶的工具類ActionContext把變數寫到SESSION裡,比如你有你個FORMBEAN:UserBean.java,其中有一個方法是處理使用者登入的,你為了跟蹤使用者的使用者名稱和密碼,可以這樣寫:
public String logon() {
try {
user = userService.getUser(user.getUsername(),
user.getPassword());
if (user== null ) {
clear();
return "failure";
} else {
user.setPassword(null);
authenticated = true;
user.setMessageCount
(messageService.getMessageNewCount(user.getUserId()));
ActionContext.getActionContext().setSimpleMessage
("newCount="+newCount.toString()+"
toUserId="+user.getUserId());//寫入SESSION
return " failure ";}//匯入到Error.jsp
}catch (Exception e){
throw new BeanActionException ("There was a problem
logoning your Account Information. Cause: " + e, e);
}
}
當然你需要包含下面的語句
import com.ibatis.struts.ActionContext;
Error.jsp:
<%@ taglib uri="struts-logic" prefix="logic" %>
<%@ taglib uri="struts-bean" prefix="bean" %>
<%@ taglib uri="struts-html" prefix="html" %>
<%@ page import="java.io.PrintWriter"%>
<logic:present name="message">
<bean:write

name="message" />
</logic:present>
//輸出你需要的資訊
<logic:present name="errors">
<logic:iterate id="error" name="errors">


<bean:write name="error" />

</logic:iterate>
</logic:present>
<logic:notPresent name="BeanActionException">
<logic:notPresent name="message">
Something happened...
But no further information was provided.
</logic:notPresent>
</logic:notPresent>


<logic:present name="BeanActionException">>
Error!
name="BeanActionException"
property="class.name"/>


<bean:write name="BeanActionException"
property="message"/>
</logic:present>


<logic:present name="BeanActionException">
Stack


<%
Exception e = (Exception)request.getAttribute
("BeanActionException");
e.printStackTrace(new PrintWriter(out));
%>


</logic:present>
三,為跟蹤變數,你還可以利用LOG4J把變數值寫到LOG裡去,這種方法很常見,不明白就去www.google.com查吧。四,為避免寫javabean出現大小寫或其他的錯誤,強烈建議不要把BEAN當做普通CLASS來寫,要用IDE 建立一個BEAN,這樣IDE會幫你找出很多錯誤。我就吃了不少苦頭。入門了嗎?有問題請留言。為了貼上XML費了老鼻子勁,不容易啊。我要開始研究SPRING和HIBERNATE啦。

相關文章

Cloud Intelligence Leading the Digital Future

Alibaba Cloud ACtivate Online Conference, Nov. 20th & 21st, 2019 (UTC+08)

Register Now >

Starter Package

SSD Cloud server and data transfer for only $2.50 a month

Get Started >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。