??xml version="1.0" encoding="utf-8" standalone="yes"?>
cMcM间的关系对于理解面向对象h很重要的作用Q以前在面试的时候也l常被问到这个问题,在这里我׃l一下?br />cMcM间存在以下关p?
UML图与应用代码例子:
If you've already installed a prior version of Abator, simply run the Eclipse Install/Update tool and the new version will be found automatically. If you've not already installed Abator, then you can use the built in Eclipse install support by following these steps: 2、安装好后将在New菜单中看C个新的文件类?font face="Courier New">Abator for iBATIS Configuration FileQ此是Abator的配|文Ӟ配置文g的详l说明见http://ibatis.apache.org/docs/tools/abator/ (tng) (tng) (tng) <javaModelGenerator targetPackage="com.dwerp.itatis.domain" targetProject="BhbManage" /> (tng) (tng) (tng) <table tableName="BHBGL"> (tng) </abatorContext> 4、右键单击配|文Ӟ点击Generate iBatis ArtifactsQ生成文件?/font> (tng)
此文为网l文章引用,原文链接?/font>
http://seagar.javaeye.com/blog/post/189580
cMcdpȝUML图与代码表现
(1)泛化(Generalization)
(2)兌(Association)
(3)依赖(Dependency)
(4)聚合(Aggregation)
1.泛化(Generalization)
[泛化]
表示cMcM间的l承关系Q接口与接口之间的承关p,或类Ҏ(gu)口的实现关系。一般化的关pL从子cL向父cȝQ与l承或实现的Ҏ(gu)相反?br />[具体表现]
父类 父类实例Qnew 子类()
[UML图](?.1)
?.1AnimalcMTigerc?Dogcȝ泛化关系
[代码表现]
2.依赖(Dependency)
[依赖]
对于两个相对独立的对象,当一个对象负责构造另一个对象的实例Q或者依赖另一个对象的服务Ӟq两个对象之间主要体Cؓ(f)依赖关系?br />[具体表现]
依赖关系表现?font color="#ff0000">局部变?/font>Q?font color="#ff0000">Ҏ(gu)的参?/font>Q以?qing)?font color="#ff0000">?rn)态方法的调用
[现实例子]
比如说你要去拧螺丝,你是不是要借助(也就是依?Z刀(Screwdriver)来帮助你完成拧螺?screw)的工?br />[UML表现](?.2)
?.2 PersoncMScrewdrivercȝ依赖关系
[代码表现]
3.兌(Association)
[兌]
对于两个相对独立的对象,当一个对象的实例与另一个对象的一些特定实例存在固定的对应关系Ӟq两个对象之间ؓ(f)兌关系?br />[具体表现]
兌关系是?font color="#ff0000">实例变量来实?br />[现实例子]
比如客户和订单,每个订单对应特定的客P每个客户对应一些特定的订单Q再例如公司和员工,每个公司对应一些特定的员工Q每个员工对应一特定的公?br />[UML图] (?.3)
?.3 公司和员工的兌关系
[代码表现]
[聚合]
当对象A被加入到对象B中,成ؓ(f)对象B的组成部分时Q对象B和对象A之间集关pR聚合是兌关系的一U,是较强的兌关系Q强调的?font color="#ff0000">整体?font color="#ff0000">部分之间的关pR?br />[具体表现]
与关联关pMP聚合关系也是通过实例变量来实现这样关pȝ。关联关pd聚合关系来语法上是没办法区分的,?font color="#ff0000">语义上才?font color="#ff0000">更好的区?/font>两者的区别?br />[兌与聚合的区别]
(1)兌关系所涉及(qing)的两个对象是处在同一个层ơ上的。比如h和自行R是一U关联关p,而不是聚合关p,因ؓ(f)Z是由自行车组成的?br />聚合关系涉及(qing)的两个对象处于不q等的层ơ上Q一个代表整体,一个代表部分。比如电(sh)脑和它的昄器、键盘、主板以?qing)内存就是聚集关p,因ؓ(f)L是电(sh)脑的l成部分?br />(2)对于h聚集关系Q尤其是集关p)(j)的两个对象,整体对象?x)制U它的组成对象的生命周期。部分类的对象不能单独存在,它的生命周期依赖于整体类的对象的生命周期Q当整体消失Q部分也随之消失。比如张三的?sh)脑被偷了(jin),那么电(sh)脑的所有组件也不存在了(jin)Q除非张三事先把一些电(sh)脑的lgQ比如硬盘和内存Q拆?jin)下来?br />[UML图](?.4)
?.3 ?sh)脑和组件的聚合关?/font>
[代码表现]
]]>
iBatis DAO事务探烦(ch)Qhttp://www.aygfsteel.com/RongHao/archive/2006/01/20/28817.htmlQ?
今天l箋研究?jin)JPetStore的持久层Q其中由于看?jin)一文章的误导Q导致我对其中的事务处理p怀疑。通过阅读源代码与看上面两文章,对这个问题才认识清楚。和我当初预想的一致?
阅读全文
]]>
阅读全文
]]>
今天我在看JpetStore代码Ӟ在点?br />http://127.0.0.1:8083/JPetStore/shop/viewCategory.shtml?categoryId=BIRDS
Ӟ当跟t函数viewCategory时发现此时categoryID已经赋g(jin)Q我却找不到在什么地方赋值的Q好是花费了(jin)一番周执?br />查看此段链接对应的struts.xml (tng) (tng) (tng) (tng)<action (tng)path="/shop/viewCategory" (tng)type="org.apache.struts.beanaction.BeanAction"
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)name="catalogBean" (tng)scope="session"
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)validate="false">
(tng) (tng) (tng) (tng) (tng) (tng)<forward (tng)name="success" (tng)path="/catalog/Category.jsp"/>
此时出现错误Q错误如下:(x)java.lang.IllegalArgumentException: (tng)Cannot (tng)invoke (tng)com.ibatis.jpetstore.presentation.CatalogBean.setCategory (tng)- (tng)argument (tng)type (tng)mismatch
(tng) (tng) (tng) (tng)org.apache.commons.beanutils.PropertyUtilsBean.invokeMethod(PropertyUtilsBean.java:1778)
(tng) (tng) (tng) (tng)org.apache.commons.beanutils.PropertyUtilsBean.setSimpleProperty(PropertyUtilsBean.java:1759)
(tng) (tng) (tng) (tng)org.apache.commons.beanutils.PropertyUtilsBean.setNestedProperty(PropertyUtilsBean.java:1648)
(tng) (tng) (tng) (tng)org.apache.commons.beanutils.PropertyUtilsBean.setProperty(PropertyUtilsBean.java:1677)
(tng) (tng) (tng) (tng)org.apache.commons.beanutils.BeanUtilsBean.setProperty(BeanUtilsBean.java:1022)
(tng) (tng) (tng) (tng)org.apache.commons.beanutils.BeanUtilsBean.populate(BeanUtilsBean.java:811)
(tng) (tng) (tng) (tng)org.apache.commons.beanutils.BeanUtils.populate(BeanUtils.java:298)
(tng) (tng) (tng) (tng)org.apache.struts.util.RequestUtils.populate(RequestUtils.java:493)
(tng) (tng) (tng) (tng)org.apache.struts.action.RequestProcessor.processPopulate(RequestProcessor.java:805)
(tng) (tng) (tng) (tng)org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:203)
(tng) (tng) (tng) (tng)org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
(tng) (tng) (tng) (tng)org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
(tng) (tng) (tng) (tng)javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
(tng) (tng) (tng) (tng)javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
// (tng)Process (tng)any (tng)ActionForm (tng)bean (tng)related (tng)to (tng)this (tng)request
ActionForm (tng)form (tng)= (tng)processActionForm(request, (tng)response, (tng)mapping);
processPopulate(request, (tng)response, (tng)form, (tng)mapping);
1Q调用processActionForm( )Ҏ(gu)(g)查是否存在ؓ(f)ActionMapping配置的ActionForm 。如果存在,则在有效?br />域内查找是否存在该ActionForm 的实例,存在Q则复用Q不存在Q则创徏一个实例。然后将实例保存?sh)再配?br />文g中配|好的有效区?request,session,application)内,q用Action元素的name属性作实例的关键字?br />2Q调用processPopulate( )Ҏ(gu)Q如果存来存在ؓ(f)ActionMapping配置的ActionFormQ则装h对象中的数据
到ActionForm 中,在进行封装之前,先调用ActionForm 的reset( )Ҏ(gu)q行属性值的默认化?br />
Ҏ(gu)以上的分析,可得知,在调用链接前struts框架?x)自动的所有的h参数装入指定的formbean中。所以请求参数的名称应该是对应formbean的一个属性?br />
q就是struts中请求参数的处理q程。主要是我对strutsq没有完全掌握,加上Net的媄(jing)响,才花费了(jin)一圈发现这个原因?br />
]]>
查看JpetStore的Struts.xml可以发现Q它的Action只有一个,即“org.apache.stuts.beanaction.Beanaction”。通过Eclipse查看beanaction.jar的源代码Q可以发现Beanactionl承与普通ActionQ即具备普通的action的功能。那么它无具体Action的奥妙在哪,l箋研究BeanAction的代码,截取BeanAction的excuteҎ(gu)中核?j)部分代码如下?x) (tng)/**//*遍历此方法的业务逻辑可知Q?的优先最高,如果?Q则不调用Q何方法直接ForwardQ类gForwardAction*/ (tng)
private (tng)static (tng)final (tng)String (tng)NO_METHOD_CALL (tng)= (tng)"*"; (tng)
…? (tng)
/**//*所有的FormBean都承于BaseBean*/ (tng)
BaseBean (tng)bean (tng)= (tng)(BaseBean) (tng)form; (tng)
(tng) (tng) (tng) (tng) (tng) (tng)ActionContext.initCurrentContext(request, (tng)response); (tng)
(tng) (tng) (tng) (tng) (tng) (tng)if (tng)(bean (tng)!= (tng)null) (tng)
{ (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)// (tng)Explicit (tng)Method (tng)Mapping (tng)
/**//*下面是检查struts.xml配置中是否有parameter属?/span>*/ (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)Method (tng)method (tng)= (tng)null; (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)String (tng)methodName (tng)= (tng)mapping.getParameter(); (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)if (tng)(methodName (tng)!= (tng)null (tng)&& (tng)!NO_METHOD_CALL.equals(methodName)) (tng)
{ (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)try (tng)
{ (tng)
/**//*通过反射Q根据得到的Ҏ(gu)名称取得Ҏ(gu)的句?/span>*/ (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)method (tng)= (tng)bean.getClass().getMethod(methodName, (tng)null); (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)synchronized (tng)(bean) (tng)
{ (tng)
/**//*下面是关键一句,调用basebean拥有的接口ActionInterceptor的实现DefaultActionInterceptorQ来完成具体Ҏ(gu)的调?/span>*/ (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)forward (tng)= (tng)bean.getInterceptor().intercept(new (tng)ActionInvoker(bean, (tng)method)); (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)} (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)…?. (tng)
/**//*无Parameter属性,(g)查path路径的最后一?后的名称Q即用的Ҏ(gu)?/span>*/ (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)// (tng)Path (tng)Based (tng)Method (tng)Mapping (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)if (tng)(method (tng)== (tng)null (tng)&& (tng)!NO_METHOD_CALL.equals(methodName)) (tng)
{ (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)methodName (tng)= (tng)mapping.getPath(); (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)if (tng)(methodName.length() (tng)> (tng)1) (tng)
{ (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)int (tng)slash (tng)= (tng)methodName.lastIndexOf("/") (tng)+ (tng)1; (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)methodName (tng)= (tng)methodName.substring(slash); (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)if (tng)(methodName.length() (tng)> (tng)0) (tng)
{ (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)try (tng)
{ (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)method (tng)= (tng)bean.getClass().getMethod(methodName, (tng)null); (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)synchronized (tng)(bean) (tng)
{ (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)forward (tng)= (tng)bean.getInterceptor().intercept(new (tng)ActionInvoker(bean, (tng)method)); (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)} (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)…?. (tng)
/**//*Ҏ(gu)调用Ҏ(gu)q回的StringQ得到页面的转移路径*/ (tng)
return (tng)mapping.findForward(forward); (tng)
通过研究上面q段代码Q我们可知,JpetStore中没有具体Action实现的关键原因即在于下面q几?/**//*通过反射Q根据得到的Ҏ(gu)名称取得Ҏ(gu)的句?/span>*/ (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)method (tng)= (tng)bean.getClass().getMethod(methodName, (tng)null); (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)synchronized (tng)(bean) (tng)
{ (tng)
/**//*下面是关键一句,调用basebean拥有的接口ActionInterceptor的实现DefaultActionInterceptorQ来完成具体Ҏ(gu)的调?/span>*/ (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)forward (tng)= (tng)bean.getInterceptor().intercept(new (tng)ActionInvoker(bean, (tng)method)); (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)} (tng)
public (tng)String (tng)invoke() (tng)
{ (tng)
(tng) (tng) (tng) (tng)try (tng)
{ (tng)
(tng) (tng) (tng) (tng) (tng) (tng)return (tng)(String) (tng)method.invoke(bean, (tng)null); (tng)
(tng) (tng) (tng) (tng)} (tng)catch (tng)(Exception (tng)e) (tng)
{ (tng)
(tng) (tng) (tng) (tng) (tng) (tng)throw (tng)new (tng)BeanActionException("Error (tng)invoking (tng)Action. (tng) (tng)Cause: (tng)" (tng)+ (tng)e, (tng)e); (tng)
(tng) (tng) (tng) (tng)} (tng)
(tng) (tng)} (tng)
以上是整个beanaction的实现机制。个人感觉此U实现方法对于开发者而言已经cM于ASP.NET?aspx?cs开发模式了(jin)。下面是通过实例来说明一下BeanAction如何控制formbean?
(tng)
Struts-config.xml的配|里?U映方式,来告诉BeanAction把控制{到哪个form bean对象的哪个方法来处理?
Q?Qparameter=?’直接蟩转;Q?QParameter中含具体的方法名Q(3QPath中最后一?后的Ҏ(gu)?
以这个请求连接ؓ(f)例http://localhost/jpetstore4/shop/viewOrder.shtml
1. URL Pattern
(tng) (tng) (tng) <action (tng)path="/shop/viewOrder" (tng)type="com.ibatis.struts.BeanAction"
(tng) (tng) (tng) (tng)name="orderBean" (tng)scope="session"
(tng) (tng) (tng) (tng)validate="false">
(tng) (tng) (tng) (tng)<forward (tng)name="success" (tng)path="/order/ViewOrder.jsp"/>
(tng) (tng)</action>
(tng)
此种方式表示Q控制将被{发到"orderBean"q个form bean对象 ?viewOrder"Ҏ(gu)Q行为)(j)来处理。方法名?path"参数的以"/"分隔的最后一部分?
2. Method Parameter (tng)
<action (tng)path="/shop/viewOrder" (tng)type="com.ibatis.struts.BeanAction"
(tng) (tng) (tng) (tng)name="orderBean" (tng)parameter="viewOrder" (tng)scope="session"
(tng) (tng) (tng) (tng)validate="false">
(tng) (tng) (tng) (tng)<forward (tng)name="success" (tng)path="/order/ViewOrder.jsp"/>
(tng) (tng)</action>
(tng)
此种方式表示Q控制将被{发到"orderBean"q个form bean对象?viewOrder"Ҏ(gu)Q行为)(j)来处理。配|中?parameter"参数表示form beancM的方法?parameter"参数优先?path"参数?
3. No Method call
(tng)<action (tng)path="/shop/viewOrder" (tng)type="com.ibatis.struts.BeanAction"
(tng) (tng) (tng) (tng)name="orderBean" (tng)parameter="*" (tng)scope="session"
(tng) (tng) (tng) (tng)validate="false">
(tng) (tng) (tng) (tng)<forward (tng)name="success" (tng)path="/order/ViewOrder.jsp"/>
(tng) (tng)</action>
此种方式表示Qform bean上没有Q何方法被调用。如果存?name"属性,则struts把表单参数等数据填充到form bean对象后,把控制{发到"success"。否则,如果name为空Q则直接转发控制?success"?
q就相当于struts内置的org.apache.struts.actions.ForwardAction的功?
<action (tng)path="/shop/viewOrder" (tng)type="org.apache.struts.actions.ForwardAction"
(tng) (tng) (tng) (tng)parameter="/order/ViewOrder.jsp (tng)" (tng)scope="session" (tng)validate="false">
(tng)</action>
(tng)
(tng)
]]>
获得
(tng) (tng) (tng) (tng) (tng) http://ibatis.apache.org/abator.html
(tng) (tng) (tng) (tng) Eclipse可以自动的进行Update获取此PluginQ官方的安装步骤Automatic Eclipse Install
3、新Z个配|文Ӟq行修改Q根据自q实际需求进行修?br />关键点:(x)
1QjdbcconnectionQ按照一般的配置卛_Q需要说明的是它需要指定访问JdbcDriver的classPathEntryQ对于MsSqlServer而言Q要这三个jar文g均包含在内,否则?x)出现jdbc讉K错误?br />2Q配|三个Pakage
3Q配|表Q此处需说明的是对于MsSqlServer不能写TableSchemaQ我初次指定TableSchemaQ结果未扑ֈ对应的表
单的配置如下Q复杂的见配|文件的详细说明。示例配|文件如?br /><abatorConfiguration>
(tng) <abatorContext> (tng) (tng) (tng) <!-- TODO: Add Database Connection Information -->
(tng) (tng) (tng) <jdbcConnection driverClass="com.microsoft.jdbc.sqlserver.SQLServerDriver"
(tng) (tng) (tng) (tng) (tng) (tng) (tng) connectionURL="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=whm;SelectMethod=cursor"
(tng) (tng) (tng) (tng) (tng) (tng) (tng) userId="sa"
(tng) (tng) (tng) (tng) (tng) (tng) (tng) password="sa">
(tng) (tng) (tng) (tng) (tng) <classPathEntry location="C:/Program Files/Apache Software Foundation/Tomcat 5.0/common/lib/mssqlserver.jar" />
(tng) (tng) (tng) (tng) (tng) <classPathEntry location="C:/Program Files/Apache Software Foundation/Tomcat 5.0/common/lib/msutil.jar" />
(tng) (tng) (tng) (tng) (tng) <classPathEntry location="C:/Program Files/Apache Software Foundation/Tomcat 5.0/common/lib/msbase.jar" />
(tng) (tng) (tng) </jdbcConnection>
(tng) (tng) (tng) <sqlMapGenerator targetPackage="com.dwerp.itatis.persistence.xml" targetProject="BhbManage" />
(tng) (tng) (tng) <daoGenerator type="IBATIS" targetPackage="com.dwerp.itatis.persistence.sqlmapdao" targetProject="BhbManage" />
(tng) (tng) (tng) (tng)
(tng) (tng) (tng) </table>
</abatorConfiguration>
]]>
1、下载iBAITS(http://ibatis.apache.org/javadownloads.cgi)
2、下载JPetStore-5.0(http://ibatis.apache.org/javadownloads.cgi)
准备工作完成Q下面开始将CZE序转移到Eclipse?br />1、在Eclipse中新Z个空的WebProjectQ如QJPetStore
2、将下蝲的JPetStore-5.0文g夹的内容拯至JPetStoreQ其中由于Eclipse默认的Web文gҎ(gu)WebRoot所以JPetStore-5.0中的Web文g单独拯到新建的Project的Web文g夹WebRoot下。简单的是说Q就是要保证I的WebProject中的所拥有文g模型不动Q将下蝲的内Ҏ(gu)贝到相应的文件夹?br />3、刷新EclipseQ此时会(x)看到src下显CZؓ(f)错误Q错误的原因是此时对应的包未引入Q由于Eclipse默认的是WebRoot/lib下的包文Ӟ所以将ȝ录下即JPetStore/devlib与JPetStore/lib引入到项目中
有两U方法:(x)直接此两个文g夹下的内容直接拷贝到JPetStore/WebRoot/lib下,或者,通过Import命o(h)引入
4、至此就已经完成目q移工作Q下面就?br />1Q徏数据库,鄙h用的是MsSqlServerQ在JPetStore/src/ddl中有各种数据库的sql文g
2Q修改iBATIS的database.propertisQ见上篇拙作
3Q在Eclipse通过Tomcat部v
卛_看到PetShop的网站了(jin)
http://127.0.0.1:8083/JPetStore
希望对和我一L(fng)初学者有所帮助
]]>
1、在http://ibatis.apache.org/javadownloads.cgi下蝲ibatisQ我下蝲的是2.2.0Q由于还没有看SpringQ所以下载此版本Q带 iBATIS DAO 框架。以后版本都不再含有此框架。见|站说明Q?br />Note: iBATIS 2.2.0 is the last release that includes the iBATIS DAO framework. After 2.2.0, the DAO iBATIS framework is removed from the downloads. We suggest converting iBATIS framework DAOs to the Spring Framework.
2、下载后lib文g夹下的三个jar文g加入机器的Classpath?br />此时QiBATIS 的框架已l搭建好
下面介绍一下如何访问MsSqlServer?br />1、机器已l下载了(jin)Jdbc for MSsqlServer的jar文gQ共三个文gQ微软网站有下蝲?br />2、可以通过Eclipse自带的DataBase Explorer试是否能访问MsSqlServer
此时Q通过iBATIS讉KMsSqlServer的前期条件均已经准备好,下面q行配置
1、配|sql-map-config.xml文gQ核?j)部分如?br /><sqlMapConfig>
(tng) <properties resource="com/zyque/struts/database.properties"/>
(tng) <transactionManager type="JDBC">
(tng) (tng) (tng) <dataSource type="SIMPLE">
(tng) (tng) (tng) (tng) (tng) <property value="${driver}" name="JDBC.Driver"/>
(tng) (tng) (tng) (tng) (tng) <property value="${url}" name="JDBC.ConnectionURL"/>
(tng) (tng) (tng) (tng) (tng) <property value="${username}" name="JDBC.Username"/>
(tng) (tng) (tng) (tng) (tng) <property value="${password}" name="JDBC.Password"/>
(tng) (tng) (tng) (tng) (tng) <property name="JDBC.DefaultAutoCommit" value="true" />
(tng) (tng) (tng) </dataSource>
(tng) </transactionManager>
(tng) <sqlMap resource="com/zyque/ibatis/BhbGl.xml"/>
(tng)
</sqlMapConfig>
2、从上可以看出数据库d的是database.propertiesQ此配置如下
driver=com.microsoft.jdbc.sqlserver.SQLServerDriver
url=jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=whm;SelectMethod=cursor
username=sa
password=sa
此处注意的是在访问MsSqlServer时候,需SelectMethod=cursorQ原因见上篇博客
通过q两步就可以通过ibatis讉KMsSqlServer?br />讉KCZ代码Q参考的ibatis的入门指南,ibatis官方|站有下载)(j)Q此处未对代码进行功能隔d装,便于向嬖Z的初学者学?br />Bhbm elm = null;
String p_mc = "FM_BHJLDW";
String resource = "com/zyque/ibatis/sql-map-config.xml";
(tng)Reader reader = Resources.getResourceAsReader(resource);
sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
elm = (Bhbm) sqlMap.queryForObject ("getBhbByName", p_mc);
上面演示的一个简单查询,其余的示例可以看入门指南。ƈ非本文的重点?br />
(tng) (tng) (tng) (tng) (tng)