|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
JAVA是一种可以撰写跨平台应用软件的面向对象的程序设计语言,由升阳(SunMicrosystems)公司的詹姆斯·高斯林(JamesGosling)等人于1990年代初开发。
前一阵在研讨O/RMAPPING,以为HIBERNATE和IBATIS都是好工具,但IBATIS更简单上手,并且跟数据库打交道的时分只需把SQL语句设置在XML里便可,不象HIBERNAMTE要写复合其标准的HQL。固然如今HIBERNATE年夜行其道一定是有事理的,我过一阵子也盘算好勤学习一下。
手艺开展的太快,进修办法是很主要的。(看来开源的确增进了临盆力的开展啊,由此揣度,共产主义社会一定会完成的啦。)我以为必需摒弃抱本书墨守成规的进修办法,而应当是STUDYINACTION,在理论中进修,缺啥补啥,年夜不了不休重构好了。固然条件是有必定的手艺堆集了。为了进修IBATIS,除大抵看了一下IBATIS的官方文档,我把次要精神放在研讨作者的典范JPETSTORE上了,人人能够道WWW.IBATIS.COM往下载4.0版本的例子,3.X的不要下了,代码写的没有4.0的幽美。然后再往下载MYSQL,TOMCAT,安装调试让JETSTORE跑起来。这个历程我就不讲了,人人动动头脑找点成绩感吧。工欲善其事,必先利其器。我用的是JBUILDER9,由于我之前用DELPHI的对BORLAND的产物有情感啊(固然BORLAND不会对我有情感,由于。。。。。。^_^,中国特征)。建一个新项目,保留后关失落PROJECT,然后把JPETSTORE的代码包拷贝到:projectrc下,再翻开方才的项目,顺遂的话你就可以看到项面前目今的一堆包啦。如今编译一定是有成绩的,别急别急,在项目里加载上JPETSTORE源码LIB目次下的一切.JAR和SERVLET.JAR,为了连MYSQL,你还得加载MYSQL的JDBC驱动。详细做法,你能够在JBUILDER9Toolsconfiglibraries新建三个LIB,好比IBATISLIB里放上JPETSTORE源码LIB目次下的一切.JAR,servlet就不要建了,JB9里带了,再建一个MYSQLLIB放上MYSQL的JDBC驱动的.jar,然后修正JPETSTORE源码SRCPROPERTIESdatabase.properties的内容,比方,我的是driver=org.gjt.mm.mysql.Driverurl=jdbc:mysql://localhost/jpetstoreusername=jpetstorepassword=ibatis9977如今MAKEPROJECT应当能够经由过程了。好啦,翻开com.ibatis.jpetstore底下的一切.java文件吧。Domain目次下放的是JAVABEAN,通常为跟表绝对应的。Persistence目次下放的是DAO接口和详细完成类,DAO即数据会见对象(DATAACCESSOBJECT),是用来跟数据库打交道的。IBATIS的O/RMAPPING的利用办法也就在这个目次内里。Presentation目次下放的是FORMBEAN,前面还要说到JPETSTORE典范对STRUTS的制造性利用。Service目次下放的是SERVICE类,经由过程SERVICE对象挪用DAO对象的办法来会见数据库的,这是一种经常使用的计划形式。罕见的STRUTS编程应当是一个举措对应一个ACTION,比方写一个结交网站,用户登录和用户查询就得写分离写两个ACTION来处置。而JPETSTORE的作者克林顿(ClintonBegin,名字够嘹亮的)写了一个ACTION静态的挪用FORMBEAN的分歧办法来处置分歧的举措。代码以下,注重execute()的写法!
publicclassBeanActionextendsAction{
publicActionForwardexecute(ActionMappingmapping,
ActionFormform,HttpServletRequestrequest,
HttpServletResponseresponse)
throwsException{
Stringforward="success";
try{
ActionContext.initialize(request,response);
if(form!=null){
//ExplicitMethodMapping
Methodmethod=null;
StringmethodName=mapping.getParameter();
if(methodName!=null&&!"*".equals(methodName)){
try{
method=form.getClass().getMethod(methodName,
null);forward=(String)method.invoke(form,null);
}catch(Exceptione){
thrownewBeanActionException("Errordispatching
beanactionviamethodparameter("+methodName+").
Cause:"+e,e);
}
}
//PathBasedMethodMapping
if(method==null&&!"*".equals(methodName)){
methodName=mapping.getPath();
if(methodName.length()>1){
intslash=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(Exceptione){
thrownewBeanActionException("Errordispatching
beanactionviaURLpattern("+methodName+").
Cause:"+e,e);
}
}
}
}
}
}catch(Exceptione){
request.setAttribute("BeanActionException",e);
throwe;
}
returnmapping.findForward(forward);
}
}
也就是经由过程对struts-config.xml的设置信息的读取来决意挪用的办法,大概是不挪用任何办法。比方:当ACTIONSERVLET收到哀求/shop/viewCategory.shtml,(JPETSTORE里后缀界说的是“.shtml”)挪用catalogBean的viewCategory办法。怎样,有创意吧,假如你乐意,就不再用写那末多的ACTION了。上面谈一谈IBATIS的O/RMAPPING吧。请人人翻开目次yourprojectcomibatisjpetstorepersistenceqlmapdaoql,看到了甚么?除设置文件sql-map-config.xml之外,是一些和JAVABEAN绝对应的XML,翻开sql-map-config.xml和Acount.xml看看吧,再返到yourprojectcomibatisjpetstorepersistence目次,翻开dao.xml发明他们的干系了吧。大概这时候你弄不清这些XML有甚么用途,别急,IBATIS官方文档里说的很分明(有中文版的哦)。我大抵说一下跟JAVABEAN对应的那些XML文件的感化吧,好比Acount.xml,是映照JAVABEAN和数据库的表的文件。你能够依照IBATIS的标准在内里写恣意的SQL语句,参数和前往值能够是基础范例及其包装类,MAP,自界说的类。最经常使用确当然是前往自界说类实例了。不外假如前往值是自界说的类实例的话,你就必要先界说resultMap,好比:<resultMapid="accountResult"class="account"><resultproperty="username"column="USERID"/><resultproperty="email"column="EMAIL"/><resultproperty="firstName"column="FIRSTNAME"/><resultproperty="lastName"column="LASTNAME"/><resultproperty="status"column="STATUS"/><resultproperty="address1"column="ADDR1"/><resultproperty="address2"column="ADDR2"/><resultproperty="city"column="CITY"/><resultproperty="state"column="STATE"/><resultproperty="zip"column="ZIP"/><resultproperty="country"column="COUNTRY"/><resultproperty="phone"column="PHONE"/><resultproperty="languagePreference"column="LANGPREF"/><resultproperty="favouriteCategoryId"column="FAVCATEGORY"/><resultproperty="listOption"column="MYLISTOPT"/><resultproperty="bannerOption"column="BANNEROPT"/><resultproperty="bannerName"column="BANNERNAME"/><resultMap>然后再援用:<selectid="getAccountByUsername"resultMap="accountResult"parameterClass="string">selectSIGNON.USERNAMEasUSERID,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.BANNERNAMEfromACCOUNT,PROFILE,SIGNON,BANNERDATAwhereACCOUNT.USERID=#value#andSIGNON.USERNAME=ACCOUNT.USERIDandPROFILE.USERID=ACCOUNT.USERIDandPROFILE.FAVCATEGORY=BANNERDATA.FAVCATEGORY<select>再翻开AccountSqlMapDao.java看看:
publicAccountgetAccount(Stringusername){return(Account)queryForObject("getAccountByUsername",username);}
思索一下,看分明个中的联系关系了吧。翻开AccountService.JAVA:
publicAccountgetAccount(Stringusername){
returnaccountDao.getAccount(username);
}
翻开AccountBean.java:
publicStringnewAccount(){
try{
accountService.insertAccount(account);
account=accountService.getAccount
(account.getUsername());//在这挪用的
myList=catalogService.getProductListByCategory
(account.getFavouriteCategoryId());
authenticated=true;
repeatedPassword=null;
return"success";
}catch(Exceptione){
thrownewBeanActionException("Therewasaproblem
creatingyourAccountInformation.Cause:"+e,e);}
}
看了半天,写个例子尝尝吧
packagecom.ibatis.jpetstore.service;
importcom.ibatis.dao.client.DaoManager;
importcom.ibatis.jpetstore.domain.*;
importcom.ibatis.jpetstore.persistence.DaoConfig;
importcom.ibatis.common.util.PaginatedList;
importcom.ibatis.jpetstore.persistence.iface.*;
importjava.util.*;
publicclassIbatisTest{
privateDaoManagerdaoManager=
DaoConfig.getDaomanager();
privateAccountDaoaccountDao;
publicIbatisTest(){
accountDao=(AccountDao)daoManager.getDao
(AccountDao.class);
Accountaccount=accountDao.getAccount("j2ee","j2ee");
System.out.println(account.getFirstName());
}
publicstaticvoidmain(String[]args){
IbatisTestibatisTest=newIbatisTest();
}
}
你还能够尝尝insert,update,delete。IBATIS里但是撑持分页的,用起来很爽的,人人有空仍是花点工夫研究一下吧。关于DEBUG:我前两天照搬JPETSTORE的架构试着写了一个结交网站,基础上挺顺遂,只是感到DEBUG对照贫苦,一般为了找一个错花上几个小时。JBUILDER带的DEBUG我没用过,但但是一定一定和DELPHI上的DEBUG是有大相径庭的。并且JUNIT我也是刚入手下手学,也没用上。这里,我把本人对照土的举措先容一下:一,当你写了新的O/RMAPPING的时分,能够先写个包括MAIN办法的类测试一下,就向我下面的测试例子一样。二,当你想跟踪变量值的时分,你能够使用IBATIS带的工具类ActionContext把变量写到SESSION里,好比你有你个FORMBEAN:UserBean.java,个中有一个办法是处置用户登录的,你为了跟踪用户的用户名和暗码,能够如许写:
publicStringlogon(){
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(Exceptione){
thrownewBeanActionException("Therewasaproblem
logoningyourAccountInformation.Cause:"+e,e);
}
}
固然你必要包括上面的语句
importcom.ibatis.struts.ActionContext;
Error.jsp:
<%@tagliburi="struts-logic"prefix="logic"%>
<%@tagliburi="struts-bean"prefix="bean"%>
<%@tagliburi="struts-html"prefix="html"%>
<%@pageimport="java.io.PrintWriter"%>
<logic:presentname="message">
<bean:write
name="message"/>
</logic:present>
//输入你必要的信息
<logic:presentname="errors">
<logic:iterateid="error"name="errors">
<bean:writename="error"/>
</logic:iterate>
</logic:present>
<logic:notPresentname="BeanActionException">
<logic:notPresentname="message">
Somethinghappened...
Butnofurtherinformationwasprovided.
</logic:notPresent>
</logic:notPresent>
<logic:presentname="BeanActionException">>
Error! |
|