<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆:93 文章:11 評論:22 引用:0
    首頁 發新隨筆
    發新文章 聯系 聚合管理

                                                                                              作者hitlermen
    有時候,我們可能想要構造一個很抽象的父類對象,它可能僅僅代表一個分類或抽象概念,它的實例沒有任何意義,因此不希望它能被實例化。例如:有一個父類“ 水果(Fruit)”,它有幾個子類“蘋果(Apple)”、“橘子(Orange)”、“香蕉(Banana)”等。水果在這里僅僅只是作為一個分類,顯然水果的實例沒有什么意義(就好像一個人如果告訴你他買了一些水果但是卻不告訴你是蘋果還是橘子,你很難想象他到底買的是什么。)。而水果類又要能被子類化,這就要求我們使用抽象類(abstract class)來解決這個問題。
    在java中,通過在class關鍵字前增加abstract修飾符,就可以將一個類定義成抽象類。抽象類不能被實例化。例如:
              定義抽象類水果(Fruit)
              public abstract class Fruit {
                      ……
              }
               如果我們試圖用以下語句來獲得一個實例,將無法編譯成功。
               Fruit fruit = new Fruit();
    而我們仍然可以構造水果類的子類,如:
              子類“蘋果(Apple)”
               public class Apple extends Fruit {
                       ……
               }
              子類“橘子(Orange)”
               public class Orange extends Fruit {
                       ……
               }
    這樣就達到我們的目的了。
    抽象類除了能象普通類一樣可以擁有一般的屬性和方法,也可以擁有抽象方法(abstract method)。例如:
               抽象類“形狀(Shape)”擁有抽象方法draw()。
               public abstract class Shape {
                      ……
                      public abstract void draw();
                      ……
               }
    抽象方法與抽象的行為相對應,通常是這個行為對父對象沒有意義,而子對象有具體動作。例如方法draw()對于類Shape沒有意義,而類Shape的子類矩形(Rectangle)的方法draw()可以有實際的動作(根據矩形的四個頂點畫出矩形的四個邊),子類圓(Circle)的方法draw()也可以有實際的動作(根據圓心和半徑畫出圓周)。
    抽象類可以有抽象方法也可以沒有抽象方法;但是如果一個類有抽象方法,那這個類只能定義為抽象類。
               如果按照以下代碼類“形狀(Shape)”仍然擁有抽象方法draw(),但沒有定義為抽象類,將會編譯失敗。
               public class Shape {
                      ……
                      public abstract void draw();
                      ……
               }
    抽象方法還有一個特點是,它強迫子類要么仍然保持抽象性(即不具體實現該方法并仍然定義為抽象類),要么具體表現出這個方法的行為(實現具體的動作或者通過拋出UnsupportedOperationException異常來表明不支持該行為)。這樣也可以強化多態性。
    上面簡要分析了抽象類,下面談談接口(interface)。java語言使用關鍵字interface定義一個接口。接口也是抽象對象,它甚至比抽象類更抽象。接口中的方法都是抽象方法。
    一個接口可以繼承其他接口;一個類通過關鍵字implements聲明要實現一個接口,并具體實現接口的方法。
               例如:有一個接口InterfaceA,

    Java代碼
    1. public   interface  InterfaceA {   
    2.          void  methodA();   
    3. }  
     

               類ClassA實現接口InterfaceA。

    Java代碼
    1. public   class  ClassA implements InterfaceA {   
    2.           public   void  methodA() {   
    3.                System.out.println( "methodA of ClassA implements InterfaceA" );   
    4.          }   
    5. }  
     

    如果是抽象類實現一個接口,那么抽象類中可以不具體實現接口的方法(保持其抽象性),而由其子類去實現。
               抽象類ClassB實現接口InterfaceA,但是沒有具體實現方法methodA(),

    Java代碼
    1. public   abstract   class  ClassB  {           }  
     

               子類ClassBSub實現接口InterfaceA,但是沒有具體實現方法methodA(),

    Java代碼
    1. public   class  ClassBSub {   
    2.          public   void  methodA() {   
    3.               System.out.println( "methodA of ClassBSub the subclass of ClassB" );   
    4.         }   
    5. }  
     

    接口和抽象類顯著的共同點是接口和抽象類都可以有抽象方法。
    接口和抽象類的不同點有:
               (1)抽象類可以有實例變量,而接口不能擁有實例變量,接口中的變量都是靜態(static)的常量(final)。
               (2)抽象類可以有非抽象方法,而接口只能有抽象方法。
    java中,類與類之間是不能多繼承的。java之所以禁止類與類之間的多繼承是因為多繼承有很大的缺點。
    多繼承雖然能使子類同時擁有多個父類的特征,但是其缺點也是很顯著的,主要有兩方面:
    (1)如果在一個子類繼承的多個父類中擁有相同名字的實例變量,子類在引用該變量時將產生歧義,無法判斷應該使用哪個父類的變量。例如:
               類ClassA:

    Java代碼
    1. public   class  ClassA {   
    2.         protected   int  varSame =  0 ;   
    3. }  
     

               類ClassB:

    Java代碼
    1. public   class  ClassB {   
    2.          protected   int  varSame =  1 ;   
    3. }  
     

               子類ClassC:(假設允許類與類之間多繼承)

    Java代碼
    1. public   class  ClassC  extends  ClassA, ClassB {   
    2.          public   void  printOut() {   
    3.                 System.out.println( super .varSame);   
    4.         }   
    5.          public   static   void  main(String[] args) {   
    6.                 ClassC classC =  new  ClassC();   
    7.                 classC.printOut();   
    8.         }   
    9. }  
     


               上面程序的運行結果會是什么呢?輸出0還是1?
    (2)如果在一個子類繼承的多個父類中擁有相同方法,子類中有沒有覆蓋該方法,那么調用該方法時將產生歧義,無法判斷應該調用哪個父類的方法。例如:
               類ClassA:

    Java代碼
    1. public   class  ClassA {   
    2.          public   void  printOut() {   
    3.                 System.out.println( 0 );   
    4.         }   
    5. }  

     

               類ClassB:

     

    Java代碼
    1. public   class  ClassB {   
    2.          public   void  printOut() {   
    3.                 System.out.println( 1 );   
    4.         }   
    5. }  
     

               子類ClassC:(假設允許類與類之間多繼承)

    Java代碼
    1. public   class  ClassC  extends  ClassA, ClassB {   
    2.                     public   static   void  main(String[] args) {   
    3.                            ClassA classA =  new  ClassC();   
    4.                            classA.printOut();       // -------------------------  A行   
    5.                            ClassB classB =  new  ClassC();   
    6.                            classB.printOut();       // -------------------------  B行   
    7.                            ClassC classC =  new  ClassC();   
    8.                            classC.printOut();        //-------------------------  C行   
    9.                    }   
    10.            }  
     

               上面程序的運行結果會是什么呢?A、B、C三行的輸出是0還是1?
    正因為有以上的致命缺點,所以java中禁止一個類繼承多個父類;但是幸運的是java提供了接口,并能通過接口的功能獲得多繼承的許多優點而又摒棄了類與類多繼承的缺點。
    java允許一個接口繼承多個父接口,也允許一個類實現多個接口,而這樣的多繼承有上面提到的缺點馬?
    答案是沒有,這是由接口的抽象性決定的。
    正如前面介紹的,在接口中不能有實例變量,只能有靜態的常量,不能有具體的方法(包含方法體),只能有抽象方法,因此也就摒棄了多繼承的缺點。
    對于一個類實現多個接口的情況,因為接口只有抽象方法,具體方法只能由實現接口的類實現,在調用的時候始終只會調用實現類的方法(不存在歧義),因此不存在多繼承的第二個缺點;而又因為接口只有靜態的常量,但是由于靜態變量是在編譯期決定調用關系的,即使存在一定的沖突也會在編譯時提示出錯;而引用靜態變量一般直接使用類名或接口名,從而避免產生歧義,因此也不存在多繼承的第一個缺點。
    對于一個接口繼承多個父接口的情況也一樣不存在這些缺點。
    請看以下示例。
                接口A:

    Java代碼
    1. public   interface  InterfaceA {   
    2.          int  len =  1 ;   
    3.          void  output();   
    4. }  
     

                接口B:

    Java代碼
    1. public   interface  InterfaceB {   
    2.            int  len =  2 ;   
    3.            void  output();   
    4. }  
     

                接口Sub繼承接口A和接口B:

    Java代碼
    1. public   interface  InterfaceSub  extends  InterfaceA, interfaceB {            }  
     

                類Xyz實現接口Sub:

    Java代碼
    1. public   class  Xyz  implements  InterfaceSub {   
    2.          public   void  output() {   
    3.                 System.out.println( "output in class Xyz." );   
    4.         }   
    5.           public   void  outputLen( int  type) {   
    6.                   switch (type) {   
    7.                           case  InterfaceA.len:   
    8.                                  System.out.println( "len of InterfaceA=." +type);   
    9.                                   break ;   
    10.                           case  InterfaceB.len:   
    11.                                  System.out.println( "len of InterfaceB=." +type);   
    12.                                   break ;   
    13.                  }   
    14.         }   
    15.         public   static   void  main(String[] args) {   
    16.                Xyz xyz=  new  Xyz ();   
    17.                xyz .output();   
    18.                xyz .outputLen();   
    19.        }   
     


               以上代碼不存在什么問題,但是如果試圖編寫以下存在沖突的代碼,則會編譯失敗。

    Java代碼
    1. Xyz xyz =  new  Xyz();   
    2. int  len = xyz.len;   
    3. System.out.println(len);  
     


    由于引入了接口,java顯得非常靈活,也使得java中的多態性更加富有魔力。

    posted @ 2008-12-15 10:36 redcoatjk 閱讀(235) | 評論 (0)編輯 收藏
     
    accesskey 屬性 -- 代表鏈接的快捷鍵訪問方式
    • 定義了accesskey的鏈接可以使用快捷鍵(ALT+字母)訪問.
    • 主菜單與導航菜單使用accesskey,通常是不錯的選擇.
    • 取值:
      • 字母
    • 引用網址:http://www.dreamdu.com/xhtml/attribute_accesskey/

    示例

    <a href="http://www.dreamdu.com/xhtml/" accesskey="h">
    (按住Alt鍵)點擊鍵盤上的h按鈕就可以直接鏈接到HTML教程.
    </a>
    
    posted @ 2008-11-28 10:00 redcoatjk 閱讀(159) | 評論 (0)編輯 收藏
     

     

     
    1、什么是iBATIS
    1.1作者
           Clinton Begin,很牛X的名字
    1.2背景故事
        Clinton Begin于2001年啟動iBATIS項目,最先的焦點是發展密碼軟件解決方案。第一個iBATIS產品是Secrets,是一個象PGP的個人數據加密器和簽名工具。Secrets完全用Java編寫并在一個開源許可下發布。
        在發布Secrets Java版后不久,iBATIS項目陷入困境轉而關注Web和其它internet相關的技術,在接下來的一年中,兩個有趣的軟件開發完成,包括Axle web 框架,一個JSP可選工具。Lookout郵件客戶端差不多完成90%在 being set on the back burner之前,同時更多有趣的挑戰接踵而來…
    1.3加入Pet Store“基準”
        在2002年早些時候,Microsoft發布一個紙面文檔聲稱.NET有10倍于J2EE的速度和4倍多的生產效率。事實是這只是簡單的而不是典型的。iBATIS項目在2002年7月1日快速回應,JPetStore 1.0發布了。基于相同的Pet Store需求,JPetStore證明了Java不僅比.NET更有生產效率,同時比Microsoft的實現擁有更好的架構
        JPetStore利用有趣的持久層迅速地引起了開源社區的關注。在JPetStore發布不久,對SQL Maps和DAO框架的問題和要求使大家知道的iBATIS Database Layer產生了。iBATIS Database Layer包含兩個被打包在一起的框架:SQL Maps和DAO。
           如今iBATIS項目重點關注持久層框架并以SQL Maps 和 Data Access Objects (DAO)著稱。JPetStore繼續作為這些框架典型應用的官方示例程序。
    1. 4“iBATIS”是什么意思
        現在,單詞“ibatis”和SQL Maps 與 DAO 框架同義――就象“xerox”『施樂復印機(商標名稱),譯者著』和“photocopy” 『影印,譯者著』同義。
        回想起iBATIS來源于密碼系統軟件。iBATIS實際上用兩個單詞的組合來命名:“internet” 和 “abatis”。
    Reference.com 如此定義 abatis:
    ab-a-tis
    n. pl. ab-a-tis (-tz) or ab-a-tis-es (-t-sz)
    將伐倒的樹木樹枝相互交叉,放置,有時削尖,面對敵人一種防御障礙物。
    將“Internet”中象征性的“i”和abatis中的“batis”組合所以暗示了抵御Internet的意思。-in the case of iBATIS它是Secrets提供的關于密碼防御的東西。
    所以iBATIS正確的寫法應該是:iBATIS
    1.5 iBATIS怎么念?
        因為我們發明了這個單詞,我們以自己喜歡的讀音念它
        我們這樣讀:eye-BAT-iss
    但是按照傳統,它可能應該被讀作:eye-BATE-iss,但就象我們說的,我們創造了它。
    1.6許可(License)
    iBATIS的源碼和文檔在Apache License 2.0許可下發布。
     
    以上部分文字翻譯自http://ibatis.apache.org,不妥之處,請指正。
    1.7版本情況
    iBATIS有for Java,for .NET,for Ruby三個語言的版本,以下主要討論for Java版,也是最重要的版本。
          
           關于版本,看下面一段英文:
     
    iBATIS 3.0 Whiteboard
     
    January 11th, 2007 marks the 3rd Anniversary(周年紀念) of the iBATIS 2.0. It has served the community well for three years, but times change. The year 2006 was full of innovation(改革、創新) and shifts in technology and mindset. The impact(沖擊,碰撞) of frameworks like Ruby on Rails cannot be ignored. The industry has noticed and finally invested in lightweight frameworks, agile principles and simple solutions first.
     
    最新版本:iBATIS2.3.0 build667,非常穩定。
     
    1.8 典型用戶
           MySpace.com - A place for friends
           …
     
    2、當前Java平臺下的一些DAO框架
    2.1Hibernate
           應該是最好的ORM框架,ORM:Object Relation Mapping,即對象關系映射。
    了解不是很多,不多作評價。不過應該是很好的框架,EJB3里的JPA所說差不多就是簡化版的Hibernate,側重于對象模型設計,系統設計中數據庫設計讓位于對象模型設計。
    2.2 Apache JDO
           Apache組織的一個比較早的開源框架,影響力不大。
    2.3 Spring DAO(Template)
           Spring DAO對JDBC進行了封裝
           用得最多的還是各種Template:
    JdbcTemplate
           HibernateTemplate
           SqlMapTemplate
           JdoTemplate
           JpaTemplate
    2.4 JDBC
           對數據庫操作最原始的辦法,也是根本,無所不能的。
    2.5 iBATIS
           又稱為SQL Map或 Data Map(2.0以后)
           SQL Mapping framework 更準確地說是 SQL Mapping tool,是一個SQL語句映射的框架(工具)
    2.5.1介紹(Introduction)
    The iBATIS Data Mapper framework will help you to significantly(意味深長地,值得注目地) reduce the amount of Java code that you normally need to access a relational database. iBATIS simply maps(此處應譯作映射) JavaBeans to SQL statements using a very simple XML descriptor. Simplicity(簡單) is the key advantage(優勢,有利條件) of iBATIS over other frameworks and object relational mapping tools. To use the iBATIS Data Mapper you need only be familiar with JavaBeans, XML and SQL. There is very little else to learn. There is no complex scheme required to join tables or execute complex queries. Using Data Mapper you have the full power of real SQL at your fingertips.
    2.5.2 概念(Concept)
    The iBATIS Data Mapper API allows programmers to easily map JavaBeans objects to PreparedStatement parameters and ResultSets. The philosophy behind Data Mapper is simple: provide a simple framework to provide 80% of JDBC functionality using only 20% of the code.
     
    3、學習iBATIS
    3.1 一個簡單的iBATIS原型
           SELECT COUNT(*) FORM USER
           討論:
    一、用JDBC直接在頁面中如何寫程序
    二、多個JSP文件同時出現此功能時
    三、出現不同的版本,SELECT COUNT(*) FORM USER WHERE USER_TYPE=1 AND IS_DEL=0…
    四、討論各個版本的輸入輸出參數
    3.2 iBATIS 藏寶圖
    討論:iBATIS各種輸入輸出參數
    3.3 iBATIS API(Spring SqlMapClientTemplate API)
    第一個參數statementName都是必須的,其它參數都是可選的
    增、刪、改
    public Object insert(String statementName, Object parameterObject)
    public int update(String statementName, Object parameterObject)
    public int delete(String statementName, Object parameterObject)
     
    查詢
    public Object queryForObject(String statementName, Object parameterObject)
    public List queryForList(String statementName, Object parameterObject)
    void queryWithRowHandler (String statementName, Object parameterObject, RowHandler rowHandler) 不常用
    public PaginatedList queryForPaginatedList(String statementName, Object parameterObject, int pageSize) 性能問題,已經被廢棄(deprecated)
    public Map queryForMap (String statementName, Object parameterObject, String keyProperty, String valueProperty)
    沒有了…
     
    4.使用iBATIS的好處
           4.1簡單,學習曲線低
           4.2使用公司投資回報率提高,一般是5到8倍
           4.3喝著Java(咖啡)寫Java代碼,節省大量編碼維護時間
           4.4提高員工土氣
           4.5性能好,靈活性強
           4.6集中管理后,DAO的實現簡單,使用開發人員更專心于業務邏輯的處理。修改時不用修改Java代碼。
           4.7使用preparedStatement,性能,安全性提高,代碼簡潔。
           4.8配置log4j在調試時輸出SQL語句和返回記錄集,漫天飛舞的System.out.print不見了。
           4.9不用擔心,連接、記錄集的關閉
           4.10緩存,討論:很小變動的基礎數據。
           4.11寫程序時很自然地優化SQL,減少數據庫的連接次數和操作次數
           討論:
           一級分類1
                  二級分類1.1 二級分類1.2
           一級分類2
                  二級分類2.1 二級分類2.2
           一級分類3
                  二級分類3.1 二級分類3.2
           討論遺漏的好處。
           討論缺點
    5.iBATIS的配置文件
    有兩種:
    5.1 sqlMapConfig文件
           只有一個,集中管理配置文件的“中央文件”
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE sqlMapConfig
           PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
           "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
     
    <sqlMapConfig>
        <settings cacheModelsEnabled="true"
                  enhancementEnabled="true"
                  lazyLoadingEnabled="true"
    useStatementNamespaces="false"
    statementCachingEnabled="true"
                 classInfoCacheEnabled="true" />
        <sqlMap resource="com/ahtec/ssi/dao/ibatis/maps/SysModule.xml" />
        <sqlMap resource="com/ahtec/ssi/dao/ibatis/maps/EudProject.xml" />
    </sqlMapConfig>
     
    5.1 各個SQL Map 文件
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">
     
    <sqlMap namespace="dv_bbslink">
    <typeAlias alias="link" type="com.ahtec.ssi.domain.Link" />
     
    <cacheModel id="oneDayCache" type="OSCACHE">
    <flushInterval hours="24" />
    <flushOnExecute statement="insertLink" />
    <flushOnExecute statement="updateLinkByPrimaryKey" />
    <flushOnExecute statement="updateLinkByPrimaryKeySelective" />
    <flushOnExecute statement="deleteLinkByPrimaryKey" />
    <flushOnExecute statement="deleteLink" />
    </cacheModel>
     
    <resultMap class="com.ahtec.ssi.domain.Link" id="LinkResult">
    <result column="id" jdbcType="INTEGER" property="id" />
    <result column="boardname" jdbcType="VARCHAR" property="boardname" />
    <result column="readme" jdbcType="VARCHAR" property="readme" />
    <result column="url" jdbcType="VARCHAR" property="url" />
    <result column="logo" jdbcType="VARCHAR" property="logo" />
    <result column="islogo" jdbcType="INTEGER" property="islogo" />
    </resultMap>
     
    <sql id="whereClause">
    <isNotNull property="map.boardname"> and boardname like #map.boardname#</isNotNull>
    <isNotNull property="islogo"> and islogo=#islogo#</isNotNull>
    </sql>
     
    <select id="selectLinkByPrimaryKey" parameterClass="link" resultMap="LinkResult" cacheModel="oneDayCache">
    select id, boardname, readme, url, logo, islogo from dv_bbslink where id = #id:INTEGER#
    </select>
     
    <select id="selectLinkList" parameterClass="link" resultMap="LinkResult">
    select id, boardname, readme, url, logo, islogo from dv_bbslink where 1=1
    <isParameterPresent>
    <include refid="whereClause" />
    </isParameterPresent>
    <isNotNull property="row.count">limit 0, #row.count#</isNotNull>
    </select>
     
    <select id="selectLinkCount" parameterClass="link" resultClass="int">
    select count(*) from dv_bbslink where 1=1
    <isParameterPresent>
    <include refid="whereClause" />
    </isParameterPresent>
    </select>
     
    <select id="selectLinkPaginatedList" parameterClass="link" resultMap="LinkResult">
    select id, boardname, readme, url, logo, islogo from dv_bbslink where 1=1
    <isParameterPresent>
    <include refid="whereClause" />
    </isParameterPresent>
    <isNotNull property="row.count">limit #row.first#, #row.count#</isNotNull>
    </select>
     
    <insert id="insertLink" parameterClass="link">
    insert into dv_bbslink (boardname, readme, url, logo, islogo) values (
    #boardname#,
    #readme#,
    #url#,
    #logo#,
    #islogo#)
    <selectKey keyProperty="id" resultClass="java.lang.Integer">
    SELECT LAST_INSERT_ID()
    </selectKey>
    </insert>
     
    <update id="updateLinkByPrimaryKey" parameterClass="link">
    update dv_bbslink set
    boardname = #boardname#,
    readme = #readme#,
    url = #url#,
    logo =#logo#,
    islogo = #islogo#
    where id = #id:INTEGER#
    </update>
     
    <update id="updateLinkByPrimaryKeySelective" parameterClass="link">
    </update>
     
    <delete id="deleteLinkByPrimaryKey" parameterClass="link">
    delete from dv_bbslink where id = #id#
    </delete>
     
    <delete id="deleteLink" parameterClass="link">
    delete from dv_bbslink
    <include refid="whereClause" />
    </delete>
     
    </sqlMap>
     
    6、實例(MySQL)
    一個論壇鏈接的表,分為LOGO鏈接,文字鏈接,有如下字段
    6.1 數據庫表(dv_bbslink
    Id                  自增ID(INTEGER
    Boardname     論壇名稱(VARCHAR
    Readme          說明(VARCHAR
    url                 鏈接地址(VARCHAR
    logo               LOGO圖片地址(VARCHAR
    islogo             是否是LOGO鏈接(INTEGER
     
    6.2 寫一個Domain(POJO,Model)
    Link.java
        private Integer id;
        private String boardname;
        private String readme;
        private String url;
        private String logo;
        private Integer islogo;
       //getters and setters
     
    6.3 寫接口(LinkDao)
           常用接口
           根據業務邏輯生成特定的接口
     
    LinkDao.java
    publicinterface LinkDao {
        Integer insertLink(Link link);
        int updateLinkByPrimaryKey(Link link);
        int updateLinkByPrimaryKeySelective(Link link);
        int deleteLink(Link link);
        int deleteLinkByPrimaryKey(Integer id);
        List selectLinkList(Link link);
        List selectLinkPaginatedList(Link link);
        Link selectLinkByPrimaryKey(Integer id);
        Integer selectLinkCount(Link link);
    }
    6.4 寫實現(LinkDaoSqlMapImpl)
    public class LinkDaoSqlMapImpl extends SqlMapClientDaoSupport implements LinkDao {
     
    public int deleteLink(Link link) {
    int rows = super.getSqlMapClientTemplate().delete("deleteLink", link);
    return rows;
    }
     
    public Integer insertLink(Link link) {
    Object newKey = super.getSqlMapClientTemplate().insert("insertLink", link);
    return (Integer) newKey;
    }
     
    public Link selectLinkByPrimaryKey(Integer id) {
    Link key = new Link();
    key.setId(id);
    Link record = (Link) super.getSqlMapClientTemplate().queryForObject("selectLinkByPrimaryKey", key);
    return record;
    }
     
    public Integer selectLinkCount(Link link) {
    return (Integer) super.getSqlMapClientTemplate().queryForObject("selectLinkCount", link);
    }
     
    public List selectLinkList(Link link) {
    return (List) super.getSqlMapClientTemplate().queryForList("selectLinkList", link);
    }
     
    public List selectLinkPaginatedList(Link link) {
    return (List) super.getSqlMapClientTemplate().queryForList("selectLinkPaginatedList", link);
    }
     
    public int updateLinkByPrimaryKey(Link link) {
    int rows = getSqlMapClientTemplate().update("updateLinkByPrimaryKey", link);
    return rows;
    }
     
    public int updateLinkByPrimaryKeySelective(Link link) {
    int rows = getSqlMapClientTemplate().update("updateLinkByPrimaryKeySelective", link);
    return rows;
    }
     
    public int deleteLinkByPrimaryKey(Integer id) {
    int rows = super.getSqlMapClientTemplate().delete("deleteLinkByPrimaryKey", id);
    return rows;
    }
    }
     
    6.5配置SQL Map
           分析SQL Map 文件
    6.7 配置 Spring Struts,寫Action, View,OK。
           此討論在本文范圍外
     
    7.其它
    7.1 學習資源
           wiki
           faq
           maillist
           jpetstore 5.0
           Spring包里也有個JPetStore 建議學習
     
    7.2 自動化工具
           Abatorhttp://ibatis.apache.org
           容易使用,三步:
           一、下載eclipse plug in
           二、新建并配置一個abatorConfig.xml
           三、生成model,sqlmap, dao和daoImpl
           最后一步,加工它生成的代碼。
           再一步,喝咖啡
     
    8 名人名言
    if you are starting a new project and you&apos;re in full control of your object model and database design, Hibernate is a good choice of O/R tool.
    Clinton Begin
     
    if you are accessing any 3rd party databases (e.g. vendor supplied), or you&apos;re working with a legacy database, or even just a really poorly designed database, then an O/R mapper might not be capable of handling the situation. That&apos;s were  an SQL Mapper comes in handy
    Clinton Begin
     
    In the end the choice is yours and nobody can tell you what the right one is, Trust only yourself, draw your own conclusions and do lots of testing!
    posted @ 2008-11-17 16:20 redcoatjk 閱讀(2049) | 評論 (0)編輯 收藏
     

    statement中的參數簡介:
    1. parameterClass
    parameterClass 屬性的值是Java類的全限定名(即包括類的包名)。parameterClass屬性是可選的,目的是限制輸入參數的類型為指定的Java 類。雖然Parameter-class屬性是可選的,建議你為每一個SQL都指定parameterClass。如果不指定parameterClass 參數,任何帶有合適屬性(get/set 方法)的Java Bean 都可以作為輸入參數。如果你使用了parameterMap, 那么你就不需要再使用parameterClass屬性了。
    下面是例子:
    例1:
    <insert id="insertAuthor2" parameterClass="Author">
           INSERT INTO author (auth_name,auth_age,auth_tel,auth_address) VALUES (#name#,#age#,#telephone#,#address#)
    </insert>
     
    在上面的語句中,你指定的parameterClass=Author,那么在你的Author類中要有name,age,telephone和address屬性,并且要有相應的get和set方法
    例2:
    你可以使用基本類型作為parameterClass,如:
    <delete id="deleteAuthor" parameterClass="int">
           delete from author WHERE auth_id = #id#
    </delete>
    例3:
    你可以使用HashMap作為parameterClass,如:
    <insert id="insertAuthor3" parameterClass="java.util.HashMap">
           INSERT INTO author (auth_name,auth_age,auth_tel,auth_address) VALUES (#name#,#age#,#telephone#,#address#)
    </insert>
    這時候,在你調用insertAuthor3的時候,你首先應該給傳入的Map對象賦值,調用代碼如下:
           HashMap paramMap = new HashMap();
           paramMap.put("name", "作者三");
           paramMap.put("age",new Integer(31));
           paramMap.put("address","南京");
           paramMap.put("telephone","025-987654321");
           sqlMapClient.insert("insertAuthor3", paramMap);
    2. parameterMap
    parameterMap 定義一系列有次序的參數用于匹配PreparedStatement 的JDBC值符號。
    parameterMap屬性很少使用,parameterMap 屬性的值等于指定的parameterMap元素的name屬性值。通常(和缺省的)的方法是使用inline parameters。
     
    注意!動態mapped statement 只支持inline parameter,不支持parameter map。關于動態mapped statement,將在后文中介紹。
     
    例如:
    <parameterMap id="authorParameter" class="Author">
           <parameter property="name" jdbcType="VARCHAR" javaType="java.lang.String" mode="INOUT"/>
           <parameter property="age" jdbcType="INTEGER" javaType="java.lang.Integer" mode="INOUT"/>
           <parameter property="telephone" jdbcType="VARCHAR" javaType="java.lang.String" mode="INOUT"/>
           <parameter property="address" jdbcType="VARCHAR" javaType="java.lang.String" mode="INOUT"/>
    </parameterMap>
    <insert id="insertAuthor1" parameterMap="authorParameter">
           INSERT INTO author (auth_name,auth_age,auth_tel,auth_address) VALUES (?,?,?,?)
    </insert>
     
    上面的例子中,parameterMap的參數按次序匹配SQL語句中的值符號(?)。因此,第一個"?"號將被"name"屬性的值替換,而第二個"?"號將被"age"屬性的值替換,依此類推。
     
    記住:使用parameterMap的時候,SQL中的參數用"?"來代替,并且每個"?"的順序要與parameterMap中的定義完全匹配;如果使用parameterClass,那么SQL中的參數用"#parameterName#"來代替,如果傳入的參數類為Bean,那么要有get和set這個參數名的方法。
    3. resultClass
    resultClass 屬性可以讓您指定一個Java 類,根據ResultSetMetaData 將其自動映射到JDBC ResultSet。只要是JavaBean 的屬性、方法名稱和ResultSet的列名匹配,屬性自動賦值列值。
     
    例1:
    <select id="getAuthor1" parameterClass="int" resultClass="Author">
           SELECT auth_id as id,auth_name as name,auth_age as age,auth_tel as telephone,auth_address as address FROM author WHERE auth_id = #id#
    </select>
    在上面的語句中,你指定的resultClass=Author,那么在你的Author類中要有id,name,age,telephone和address屬性,并且要有相應的get和set方法。
    如果你寫成:
    <select id="getAuthor1" parameterClass="int" resultClass="Author">
           SELECT auth_id,auth_name,auth_age,auth_tel,auth_address FROM author WHERE auth_id = #id#
    </select>
    那么在你的Author類中,要有auth_id,auth_name,auth_age,auth_tel,auth_address屬性,并且要有相應的get和set方法。
    例2:
    你還可以使用基本類型作為resultClass,如:
    <statement id="getAuthorNumber" resultClass="int">
           <![CDATA[SELECT count(auth_id) as totalAuthor FROM author]]>
    </statement>
    例3:
    你還可以使用HashMap作為resultClass,如:
    <select id="getAuthor4" resultClass="java.util.HashMap">
           SELECT a.auth_id as authorid,a.auth_name as authname,a.auth_age as authage,a.auth_tel as authtel,a.auth_address as authaddress,b.art_title as arttitle FROM author a, article b WHERE a.auth_id=b.art_author
    </select>
    下面是調用代碼:
    List authorList = (List)sqlMapClient.queryForList("getAuthor4",null);
    showMethod("getAllAuthor");
    for(int i=0;i<authorList.size();i++)
    {
           HashMap authMap = (HashMap)authorList.get(i);
           System.out.println("auth_id="+authMap.get("authid")+"; auth_name="+authMap.get("authname")+"; auth_age="+authMap.get("authage")+"; auth_tel="+authMap.get("authtel")+"; auth_address="+authMap.get("authaddress")+";auth_article="+authMap.get("arttitle"));
    }
     
    但是,使用resultClass 的自動映射存在一些限制,無法指定輸出字段的數據類型,無法自動裝入相關的數據(復雜屬性),并且因為需要ResultSetMetaData的信息,會對性能有輕微的不利影響。但使用resultMap,這些限制都可以很容易解決。
    4. resultMap
    使用resultMap 屬性可以控制數據如何從結果集中取出,以及哪一個屬性匹配哪一個字段。不象上面使用resultClass 屬性的自動映射方法,resultMap屬性可以允許指定字段的數據類型,NULL 的替代值。
    例如:
    <resultMap id="authorResult" class="Author">
           <result property="id" column="auth_id"/>   
           <result property="age" column="auth_age"/>
           <result property="name" column="auth_name"/>
           <result property="telephone" column="auth_tel"/>
           <result property="address" column="auth_address"/>
    </resultMap>
     
    <select id="getAuthor3" resultMap="authorResult">
           SELECT auth_id,auth_name,auth_age,auth_tel,auth_address FROM author WHERE auth_address like #%address%#
    </select>

    <statement id="getAllAuthor" resultMap="authorResult">
           SELECT * FROM author
    </statement>
     
    在上面的語句中,你指定的resultClass=Author,那么在你的Author類中要有id,name,age,telephone和address屬性,并且要有相應的get和set方法。
     
    通過resultMap 的定義,查詢語句得到的ResultSet 被映射成Author對象。resultMap定義"id"屬性值將賦予"auth_id"字段值,而"telephone"屬性值將賦予"auth_tel"字段值,依次類推。
     
    注意:在resultMap中所指定的字段必須是下面的select中的子集。
    也就是說,你不能寫成
    <select id="getAuthor3" resultMap="authorResult">
           SELECT auth_address FROM author WHERE auth_address like #%address%#
    </select>
    但是你可以在resultMap中去掉<result property="id" column="auth_id"/>這行,仍然可以執行下面的語句:
    <select id="getAuthor3" resultMap="authorResult">
           SELECT auth_id,auth_name,auth_age,auth_tel,auth_address FROM author WHERE auth_address like #%address%#
    </select>
    這樣的話,你就無法取得auth_id的值。
    5. cacheModel
    定義查詢mapped statement 的緩存。每一個查詢mapped statement 可以使用不同或相同的cacheModel。
    <cacheModel id="author-cache" imlementation="LRU">
           <flushInterval hours="24"/>
           <flushOnExecute statement="insertProduct"/>
           <flushOnExecute statement="updateProduct"/>
           <flushOnExecute statement="deleteProduct"/>
           <property name="size" value="1000" />
    </cacheModel>
    <select id="getAuthor3" resultMap="authorResult" cacheModel="author-cache">
           SELECT auth_id,auth_name,auth_age,auth_tel,auth_address FROM author WHERE auth_address like #%address%#
    </select>
     
    上面的配置說明:"getAuthor3"的緩存使用WEAK引用類型,當你通過調用"getAuthor3"的時候,Ibatis將會把結果緩存起來。每24 小時緩存刷新一次,或當更新的操作(即上面配置的insertProduct、updateProduct或deleteProduct)發生時刷新。
     
    當你對某些表中的記錄操作頻繁時,可以考慮使用緩沖,但是如果數據量過大的話,最好另想辦法。
    6. xmlResultName
    當映射結果指向一個XML文檔的時候,xmlResultName的值是指那個XML文檔的root標簽的名字。例如:
    <select id="getAuthor1" parameterClass="int" resultClass="Author" xmlResultName="author">
           SELECT auth_id as id,auth_name as name,auth_age as age,auth_tel as telephone,auth_address as address FROM author WHERE auth_id = #id#
    </select>
    上面的select將產生如下的XML對象:
    <author>
           <id>1</id>
           <name>作者三</name>
           <age>31</age>
           <telephone>025-987654321</telephone>
           <address>南京</address>
    </author>

    本篇文章來源于 新技術天空 原文鏈接:http://203.208.35.101/search?q=cache:VGS9aOGcGUkJ:www.ntsky.com/tech/java/opensource/ibatis/2007-06-29/7acdecd3b19824d6.html+parameterMap+%E7%94%A8%E6%B3%95&hl=zh-CN&ct=clnk&cd=5&gl=cn&lr=lang_zh-CN|lang_zh-TW&st_usg=ALhdy28HV28RUvZvcFSoHJtrbuRTGrXRLg

    posted @ 2008-11-17 14:51 redcoatjk 閱讀(169) | 評論 (0)編輯 收藏
    僅列出標題
    共8頁: 上一頁 1 2 3 4 5 6 7 8 
    CALENDER
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    常用鏈接

    留言簿(3)

    隨筆分類(22)

    隨筆檔案(76)

    文章分類(12)

    文章檔案(17)

    搜索

    •  

    積分與排名

    • 積分 - 250519
    • 排名 - 227

    最新評論

    評論排行榜


    Powered By: 博客園
    模板提供滬江博客

    主站蜘蛛池模板: 成人片黄网站色大片免费| 亚洲美女在线国产| 亚洲精品无码专区| 亚洲日韩中文字幕在线播放| 99久热只有精品视频免费看 | 久久99国产乱子伦精品免费| 国产精品亚洲四区在线观看| 亚洲国产精品丝袜在线观看| 一级毛片在线免费看| 亚洲精品人成网在线播放影院| 午夜亚洲av永久无码精品| 亚洲电影免费在线观看| 国产成人精品久久亚洲高清不卡 | 国产在线观看片a免费观看| 免费看一级毛片在线观看精品视频| 亚洲AV午夜成人片| 成人永久免费福利视频网站| 国产成人免费AV在线播放| 亚洲第一成年网站视频| 亚洲成在人线av| 免费国产不卡午夜福在线| 精品成在人线AV无码免费看| 污视频网站在线观看免费| 亚洲精品免费在线视频| 亚洲一区二区三区乱码A| 最近中文字幕无吗免费高清| 在线人成免费视频69国产| 羞羞网站免费观看| 亚洲一级毛片免观看| 久久久久亚洲精品成人网小说 | 成人午夜免费福利| 99热在线观看免费| 中国一级毛片免费看视频| 日日摸日日碰夜夜爽亚洲| 亚洲福利一区二区| 国产亚洲精品xxx| 亚洲精品第一国产综合精品99| 国内自产拍自a免费毛片| 91九色老熟女免费资源站| 国产成年无码久久久免费| 永久免费观看黄网站|