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

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

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

    愚人碼頭

    知恥而后勇,知不足而進(jìn)
    隨筆 - 33, 文章 - 1, 評論 - 26, 引用 - 0
    數(shù)據(jù)加載中……

    IBATIS SQLMap詳解

    TagIBATIS    SQL    Maps                                          

    iBATIS SQL Maps 的世界里也存在 one-to-manymany-to-one 的關(guān)系,想必你已經(jīng)對這些概念駕輕就熟了。好!還是每個(gè) People 對應(yīng)多條 AutoInfo 信息。

        本系列文章第一部分提到過 iBATIS SQL Maps 的映射文件個(gè)數(shù)可以人為設(shè)定,但是,把一組有共性的操作放在一起是首選策略。下面我們看看為張三首次買車所生成的映射文件是怎樣的:

     

         PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN"

        "http://www.ibatis.com/dtd/sql-map-2.dtd">

             insert into people (name, address) values (#name#, #address#)

        ]]>

                       select last_insert_id(); 

        ]]>      

         insert into auto_info (license_plate, owner_no) VALUES (#licensePlate#, #ownerNo.id#)

        ]]>  

        PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN"

        "http://www.ibatis.com/dtd/sql-map-2.dtd"> 

                insert into people (name, address) values (#name#, #address#)

        ]]>   

                  select last_insert_id();

        ]]>   

             insert into auto_info (license_plate, owner_no) VALUES (#licensePlate#, #ownerNo.id#)

        ]]> 

     

    sqlMap

    sqlMap 元素?fù)碛袑傩?/SPAN> namespace="",定義了該 XML 文件命名空間。如果你在配置文件 SqlMapConfig.xml 中指定了 settings 元素的屬性 useStatementNamespaces="true",那么就可以按照命名空間的方式訪問 Mapped statement,比如 namespace=" AutoMag",相應(yīng) Java 代碼:sqlMap.insert("AutoMag.insertPeople",people)。這樣做是為了防止不同映射文件中出現(xiàn)同名 Mapped statement 而產(chǎn)生沖突。

     

    什么是 Mapped statement

     

    Mapped statement

    iBATIS SQL Maps 的核心概念就是 Mapped statementMapped Statement 可以使用任意的 SQL 語句,利用 POJO、原始變量及其 Wrapper Class 作為輸入(parameter class)和輸出(result class)。

    Mapped Statement 包含以下幾種類型:

    insert 對應(yīng)數(shù)據(jù)庫的 insert 操作,該操作返回本次操作插入記錄的主鍵值。

    select 對應(yīng)數(shù)據(jù)庫的 select 操作,該操作返回特定的 POJO 對象。

    update 對應(yīng)數(shù)據(jù)庫的 update 操作,該操作返回被更新的記錄個(gè)數(shù)。

    delete 對應(yīng)數(shù)據(jù)庫的 delete 操作,該操作返回被刪除的記錄個(gè)數(shù)。

    procedure 對應(yīng)數(shù)據(jù)庫存儲過程。

    statement 類型最為通用,可以代替以上所有的類型。但由于缺乏操作直觀性故不推薦。

    insert id="insertPeople" parameterClass="bo.People"

    定義了 insert 類型的 Mapped Statement。屬性 id="insertPeople" 定義操作名稱,parameterClass="bo.People" 定義傳入?yún)?shù)為 People 對象實(shí)例,框架可確保其屬性持久化到數(shù)據(jù)庫相應(yīng)字段中。由于 SQL 語句會包含“<>”這樣的符號,容易和 XML 產(chǎn)生沖突,放進(jìn) ……]]> 區(qū)域就可避免。insert into people (name, address) values (#name#, #address#),是一條普通的 SQL 語句,“#name##address#”利用 Java 反射機(jī)制訪問 People 對象實(shí)例的相應(yīng)屬性。

    selectKey resultClass="java.lang.Integer" keyProperty="id"

    iBATIS SQL Maps 通過 元素的子元素 < selectKey> 來支持主鍵自動生成。 resultClass="java.lang.Integer" 定義返回對象為 int Wrapper ClasskeyProperty="id" 定義了主鍵名稱。本例是 MySQL 主鍵生成方式,參考官方文檔,MySQL 的主鍵生成無需人為來控制,也就是說可不使用 而由數(shù)據(jù)庫自動處理。但我測試發(fā)現(xiàn),在執(zhí)行 insert 操作以后,程序沒有返回本次操作插入記錄的主鍵值。在官方論壇上也有很多用戶提出這樣的疑惑,作者的答復(fù)是:這和 JDBC Driver 有關(guān)系。不可能把驅(qū)動一一測試吧?一勞永逸的辦法是使用 元素。

     

    以下是 Oracle SQL Server 主鍵生成方法:

     

    < !- Oracle ->

    <insert id="insertProduct-ORACLE"  parameterClass="com.domain.Product">

      <selectKey  resultClass="int"  keyProperty="id" >

        SELECT  STOCKIDSEQUENCE.NEXTVAL  AS  ID

    FROM   DUAL

      </selectKey>

      INSERT INTO PRODUCT (PRD_ID,PRD_DESCRIPTION) values (#id#,#description#)

    </insert>

     

    Microsoft SQL Server ->

    <insert id="insertProduct-MS-SQL" parameterClass="com.domain.Product">

      insert into PRODUCT (PRD_DESCRIPTION) values (#description#)

      <selectKey resultClass="int" keyProperty="id" >

      SELECT  @@IDENTITY  AS  ID

      </selectKey>

    </insert>

     

    < !- Oracle ->

    <insert id="insertProduct-ORACLE" parameterClass="com.domain.Product">

      <selectKey resultClass="int" keyProperty="id" >

        SELECT  STOCKIDSEQUENCE.NEXTVAL   AS  ID

     FROM   DUAL

      </selectKey>

      insert into PRODUCT (PRD_ID,PRD_DESCRIPTION) values (#id#,#description#)

    </insert>

     

    Microsoft SQL Server ->

    <insert id="insertProduct-MS-SQL" parameterClass="com.domain.Product">

      insert into PRODUCT (PRD_DESCRIPTION) values (#description#)

      <selectKey resultClass="int" keyProperty="id" >

      SELECT @@IDENTITY AS ID

      </selectKey>

    </insert>

    insert into auto_info (license_plate, owner_no) VALUES (#licensePlate#, #ownerNo.id#)

     

    在插入了 people 記錄后,要為 auto_info 插入記錄。基本原則和之前遇到過的一樣,只是”owner_no”這個(gè)字段值由 AutoInfo 對象屬性”ownerNo”獲得,該屬性類型為 People。這是由于我沿用了 Hibernate 產(chǎn)生的 POJO,如果你愿意,完全可以把”ownerNo”替換為 Integer 類型。

     

    編程中幾個(gè)關(guān)鍵對象:

    1.        com.ibatis.common.resources.Resources 對象負(fù)責(zé)從 XML 得到 java.io.Reader 抽象類的實(shí)例,供工廠方法調(diào)用。

    2.        com.ibatis.sqlmap.client.SqlMapClientBuilder 構(gòu)造 SqlMapClient 實(shí)例。

    3.        com.ibatis.sqlmap.client.SqlMapClient iBATIS SQL Maps 核心組件,可以說我們的編程工作都是圍繞著它展開。

    形成的 one-to-many 保存如下:

    package test;

    import java.io.Reader;

    import com.ibatis.sqlmap.client.*;

    import com.ibatis.common.resources.*;

    import bo.*;

    public class AutoMag {

     private Reader reader;

     private SqlMapClient sqlMap;

     private String resource = "SqlMapConfig.xml";

     public void insertPeople() throws Exception{

      try{

       reader = Resources.getResourceAsReader(resource);

          sqlMap=SqlMapClientBuilder.buildSqlMapClient(reader);

          sqlMap.startTransaction();

          People people=new People();

          people.setName("張三");

          people.setAddress("中國");

                sqlMap.insert("insertPeople",people);

                AutoInfo autoInfo=new AutoInfo();

                autoInfo.setLicensePlate("A00001");

                autoInfo.setOwnerNo(people);           

          sqlMap.insert("insertAutoInfo",autoInfo);

          sqlMap.commitTransaction();

      }finally{

       sqlMap.endTransaction();

      }

     }

    }

    package test;

    import java.io.Reader;

    import com.ibatis.sqlmap.client.*;

    import com.ibatis.common.resources.*;

    import bo.*;

    public class AutoMag {

     private Reader reader;

     private SqlMapClient sqlMap;

     private String resource = "SqlMapConfig.xml";

    public void insertPeople() throws Exception{

      try{

       reader = Resources.getResourceAsReader(resource);

          sqlMap=SqlMapClientBuilder.buildSqlMapClient(reader);

          sqlMap.startTransaction(); 

          People people=new People();

          people.setName("張三");

          people.setAddress("中國");

                sqlMap.insert("insertPeople",people);

                AutoInfo autoInfo=new AutoInfo();

                autoInfo.setLicensePlate("A00001");

                autoInfo.setOwnerNo(people);           

          sqlMap.insert("insertAutoInfo",autoInfo);

    sqlMap.commitTransaction();

      }finally{

       sqlMap.endTransaction();

      }

     }

    }

     

    程序和 Hibernate 寫法差不多,我感覺甚至比 Hibernate 更簡單。我可以顯示的進(jìn)行 insert 操作,符合傳統(tǒng) JDBC 編程習(xí)慣。iBATIS SQL Maps 支持自動事務(wù)處理,可以不用寫明 startTransactioncommitTransaction。但如果 People insert 操作成功,而 AutoInfo insert 操作失敗,就破壞了兩次 insert 操作的原子性。最后 endTransaction 包含異常情況下的回滾事務(wù)和關(guān)閉連接池連接兩種功能。

    posted on 2005-11-09 19:17 船夫 閱讀(9923) 評論(6)  編輯  收藏 所屬分類: java技術(shù)

    評論

    # re: IBATIS SQLMap詳解[未登錄]  回復(fù)  更多評論   

    sqlmap中的ID是什么意思啊?
    2008-04-11 18:19 | 新手

    # re: IBATIS SQLMap詳解  回復(fù)  更多評論   

    代碼區(qū)的配色不是一般的難看呀
    2008-04-25 11:05 | fwe

    # re: IBATIS SQLMap詳解[未登錄]  回復(fù)  更多評論   

    是相當(dāng)難看
    2008-06-20 15:12 | aa

    # re: IBATIS SQLMap詳解  回復(fù)  更多評論   

    寫一個(gè)示例讓我們看看!
    2009-02-26 13:43 | jache

    # re: IBATIS SQLMap詳解  回復(fù)  更多評論   

    這顏色 超難看 看著別扭
    2011-07-03 22:25 | 捷克斯洛伐克

    # re: IBATIS SQLMap詳解[未登錄]  回復(fù)  更多評論   

    新手,講的還是有點(diǎn)聽不懂
    2011-12-08 14:24 | a
    主站蜘蛛池模板: 在线看片人成视频免费无遮挡| 久久亚洲精品高潮综合色a片| 国产精一品亚洲二区在线播放 | 亚洲精品无码久久久久久| 亚洲免费视频观看| 国产成人精品日本亚洲专| 亚洲高清有码中文字| 中文字幕乱码亚洲精品一区| 久久亚洲精品国产亚洲老地址| 国产午夜亚洲精品| 亚洲欧洲AV无码专区| 国产大陆亚洲精品国产| 美女又黄又免费的视频| 一级免费黄色毛片| 91福利免费网站在线观看| 日本在线免费播放| www视频免费看| 成年午夜视频免费观看视频| 成人爱做日本视频免费| 亚洲国产精品激情在线观看| 奇米影视亚洲春色| 亚洲综合久久综合激情久久| 亚洲色图.com| 亚洲jizzjizz少妇| 一级日本高清视频免费观看| a级毛片免费在线观看| 99久热只有精品视频免费看| 91视频国产免费| 又黄又爽无遮挡免费视频| 亚洲夜夜欢A∨一区二区三区 | 最新69国产成人精品免费视频动漫| 在线观着免费观看国产黄| 久久久久亚洲AV无码专区网站| 久久国产亚洲电影天堂| 国产精品久久亚洲不卡动漫| 爱情岛论坛亚洲品质自拍视频网站| 久久不见久久见免费影院www日本| 99久久精品免费精品国产| 日本免费人成黄页在线观看视频 | 亚洲成aⅴ人片久青草影院| 亚洲国产精品无码中文字|