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

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

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

    翻譯:iBATIS 3.0 草案——使用標注進行配置

    Posted on 2007-06-29 13:35 Tommy Jian 閱讀(1304) 評論(1)  編輯  收藏 所屬分類: iBATIS

    使用標注進行配置

       標注現在已經很流行了,許多人選擇它作為XML的替代來進行元數據編程。標注中不應該包含配置信息,而iBATIS通過XML來進行的工作也不光是配置。

       那么什么是配置,什么又不是呢?目前,iBATIS的XML文件包含了三方面:

    • 配置信息
    • 元數據信息
    • 代碼

       當您把環境設置改變后,您同時也需要更改配置,例如數據庫連接配置、事務管理配置等等。當您將應用分發到不同的數據庫,而且也使用了一些專有的SQL語句后,配置中可能還要包含SQL方言的一些配置信息。在iBATIS 3.0中我們可以將這些信息包含進去,因此,您需要針對多種方言進行編碼(當然這是手工的),為它們命名,并將它們配置到適當的位置。配置信息不應該被包含在Java源文件中。

       元數據信息包括諸如結果映射、參數映射和緩存模型之類的信息。這些信息控制iBATIS如何映射您的數據以及這些映射的具體表現。

       編碼包括SQL以及動態的SQL語句。

       那么標注應該承擔什么樣的職責呢?

       一般情況下,只有元數據信息比較適合使用標注來描述。配置應該通過屬性文件或者XML文件來實現。編碼也只能通過Java文件或者XML文件來實現。更進一步看,標注只能用來描述相對較簡單的元數據信息。有時,標注(特別是在Java中)也會使事情變得更加復雜,使代碼更加晦澀難懂。

       因為上面的原因,所以我推薦只將標注作為約定配置的替代配置。這就是說,使用這種配置方式可以達到一定的效果,但是也僅僅限于此。

       再一次強調,C#的Attribute在某些方面要強于Java的標注:

    • 支持多行字符串,這使得內嵌SQL編碼令人感到愉快
    • 支持使用同一標注多次,而在Java中則需要通過集合標注來實現
    • 支持順序和命名參數,這使得代碼變得更加簡明扼要

       下面這個例子展示了如何使用Java中的標注來完成配置:

    //
    // Simple select, string concatenation, inline results(!) and inline parameters
    //
    @Select("SELECT #id(EMP_ID:NUMERIC), #firstName(FIRST_NAME:VARCHAR), #lastName(LAST_NAME:VARCHAR) " +
    "FROM EMPLOYEE")
    List selectAllEmployees();
    //
    // Alternative syntax using an array of strings instead of string concatenation...can be "smarter" than concatenation
    //
    @Select({"SELECT #id(EMP_ID:NUMERIC), #firstName(FIRST_NAME:VARCHAR), #lastName(LAST_NAME:VARCHAR) ",
    "FROM EMPLOYEE",
    "WHERE EMP_ID = @id"})
    Employee selectEmployee(int id);
    //
    // Inserts look as you might expect. We can use getGeneratedKeys to get autogen key values, selectkey still supported
    //
    @Insert({"INSERT INTO EMPLOYEE (EMP_ID, FIRST_NAME, LAST_NAME)",
    "VALUES (@id, @firstName, @lastName)"})
    void insertEmployee(Employee emp);
    //
    // Nothing special about update
    //
    @Update({"UPDATE EMPLOYEE SET",
    "EMP_ID=@id(NUMERIC:IN), FIRST_NAME=@firstName(VARCHAR:IN), LAST_NAME=@lastName(VARCHAR:IN)"})
    void updateEmployee(Employee emp);
    //
    // Delete is obvious.
    //
    @Delete("DELETE EMPLOYEE WHERE EMP_ID = @id")
    void deleteEmployee(int id);

       下面這個例子要更加復雜一些,像這種使用了如此多的標注的情況就應該考慮使用XML文件來進行配置。這種情況下,我想象標注能夠提供一切功能,即XML中實現的功能通過標注也能完成。然而,我們還是建議您在面對復雜的情況時使用XML來進行配置。或許某些人不是特別在意使用XML配置,所以我們為他們提供了標注配置方式。

    //
    // complex stuff
    //
    @ResultClass (Company.class)
    @ConstructorResults({
    @Result(property="id", column="C.COMP_ID"),
    @Result(property="name", column="C.NAME")
    })
    @PropertyResults({
    @Result(property="departments.id", column="D.DEPT_ID"),
    @Result(property="departments.name", column="D.NAME"),
    @Result(property="departments.employee.id", column="E.EMP_ID"),
    @Result(property="departments.employee.firstName", column="E.FIRST_NAME"),
    @Result(property="departments.employee.lastName", column="E.LAST_NAME")
    })
    @Collections ({
    @Collection(type=Department.class, property="departments", groupBy="id"),
    @Collection(type=Employee.class, property="departments.employees", groupBy="departments.id")
    })
    @Select("SELECT #id, #name, " +
    "#departments.id, #departments.name, " +
    "#departments.employees.id, #departments.employees.firstName, " +
    "#departments.employees.lastName " +
    "FROM COMPANY C, DEPARTMENT D, EMPLOYEE E " +
    "WHERE D.DEPT_ID = E.DEPT_ID " +
    "AND C.COMP_ID = D.COMP_ID")
    List selectAllCompaniesWithJoin();
    /*
    * NESTED QUERIES
    */
    @ResultClass (Company.class)
    @FieldResults({
    @Result(property="id", column="COMP_ID"),
    @Result(property="name", column="NAME")
    })
    @PropertyResults({
    @Result(property="departments",
    nestedQuery=@QueryMethod(type=CompanyMapper.class, methodName="getDepartmentsForCompany", parameters="id"))
    })
    @Select("SELECT #id, #name FROM COMPANY C ")
    List selectAllCompaniesWithNestedQueries();
    @ResultClass (Department.class)
    @PropertyResults({
    @Result(property="id", column="DEPT_ID"),
    @Result(property="name", column="NAME"),
    @Result(property="employees",
    nestedQuery=@QueryMethod(type=CompanyMapper.class, methodName="getEmployeesForDeparment", parameters="id"))
    })
    @Select("SELECT #id, #name FROM DEPARTMENT WHERE COMP_ID = @id ")
    List getDepartmentsForCompany(int id);
    @ResultClass (Employee.class)
    @PropertyResults({
    @Result(property="id", column="EMP_ID"),
    @Result(property="firstName", column="FIRST_NAME"),
    @Result(property="lastName", column="LAST_NAME")
    })
    @Select("SELECT #id, #firstName, #lastName FROM EMPLOYEE WHERE EMP_ID = @id ")
    List getEmployeesForDepartment(int id);

    Feedback

    # re: 翻譯:iBATIS 3.0 草案——使用標注進行配置  回復  更多評論   

    2007-06-30 08:06 by alfaromeo
    看上去和workshop的DB控件很像啊
    主站蜘蛛池模板: 午夜亚洲av永久无码精品| 免费人成视频在线| 国产91精品一区二区麻豆亚洲| 亚洲欧美精品午睡沙发| 免费可以在线看A∨网站| 亚洲国产成人无码av在线播放| 久久A级毛片免费观看| 亚洲国产女人aaa毛片在线| 久久国产乱子伦精品免费不卡| 亚洲国产精品无码久久SM| 手机看片国产免费永久| 亚洲AV无码乱码国产麻豆| 久久这里只精品99re免费| 亚洲免费在线播放| 免费无码黄十八禁网站在线观看 | 久久午夜伦鲁片免费无码| 日本亚洲成高清一区二区三区| 中文在线观看免费网站| 亚洲成色999久久网站| 日韩精品无码免费一区二区三区 | 亚洲黄色在线电影| 91成年人免费视频| 久久无码av亚洲精品色午夜| 亚洲日韩中文字幕日韩在线 | 搜日本一区二区三区免费高清视频 | 精品久久洲久久久久护士免费| 国产精品亚洲专区一区| 国产aⅴ无码专区亚洲av麻豆 | 亚洲人成电影网站免费| 免费观看日本污污ww网站一区| 亚洲免费在线观看| 91情国产l精品国产亚洲区| 插B内射18免费视频| 四虎国产精品成人免费久久| 亚洲av永久无码精品秋霞电影影院| 永久在线观看www免费视频| 自拍偷自拍亚洲精品偷一| 国产成人精品亚洲精品| 精品国产污污免费网站aⅴ| 国产亚洲漂亮白嫩美女在线 | 亚洲中文字幕无码久久精品1|