1. 程式人生 > >ibatis程式碼自動生成工具ibator修改備忘

ibatis程式碼自動生成工具ibator修改備忘

由於對ibator瞭解的不夠深入,毅然決然的開始了修改ibator外掛的過程,修改的過程收穫很大,瞭解了這個外掛的諸多使用技巧。

1.自動生成的程式碼中的討厭的Example怎麼改名?

   這個也是驅動我去修改ibator plugin的原動力,因為我懶,不想每次生成程式碼以後再去替換Example單詞,使用UltraEditor自動把Ibator源程式中的所有Example都替換了,替換完以後才發現,ibator外掛可以自動幫我們替換,配置一個引數就可以了,汗啊。替換內容如下:

 <!--
      id  這個id可以在使用命令列執行Abator時指定,以單獨處理某一個ibatorContext
      targetRuntime   Ibatis2Java5 生成適合JDK5.0的類,另一個選項是 Ibatis2Java2,生成適合Java2的類。
    -->
    
        <ibatorPlugin type="org.apache.ibatis.ibator.plugins.RenameExampleClassPlugin">
            <property name="searchString" value="Example$" />
            <property name="replaceString" value="Criteria" />
        </ibatorPlugin>
        
        <!--
          ibatorPlugin 繼承自IbatorPluginAdapter,包名必須是 org.apache.ibatis.ibator.plugins,具體實現可以參考官方文件
            必須有替換和被替換字元屬性。
        -->

2.既然動手改了,就把看著不順眼的地方統統的改掉吧,以下是便於日後再想改的時候要看的內容:

   程式碼註釋在org.apache.ibatis.ibator.internal這個package下的DefaultCommentGenerator.java中,可以把英文的註釋改成中文的,但是sqlmap中的註釋不能直接改中文,因為sqlmap.xml檔案時utf-8編碼的,直接寫入中文註釋會出現亂碼的情況。

  在org.apache.ibatis.ibator.config這個package下的MergeConstants.java中包含有程式碼註解中的某些單詞,可以考慮修改。

3.下面是從別人的部落格轉過來的內容:

1、Abator生成Java類檔案時,根據註釋區分屬性和方法是系統生成或使用者自定義,以此決定保留或者覆寫.
 
2、Abator生成SQLMap的xml檔案時,根據元素id是否包含字首 ibatorgenerated_ 區分元素是系統
      生成或使用者自定義,以此決定保留或者覆寫.。
 
3、注意ibatorConfig.xm 檔案中節點的順序
 
4、生成的資料物件
 
    Primary Key Class 主鍵的所有組成欄位在一個類中
    
    Record Class 非主鍵欄位非BLOB欄位組成的類,繼承於Primary Key Class
    
    Record With BLOBs Class 所有BLOB欄位組成的類,繼承於Record Class (如不存在),就會繼承Primary Key Class
                            不支援只包含BLOB欄位的表。
    
    Example Class    用於生成動態where條件的類
 
5、example Class 使用(可以使用邏輯運算的結合律簡化where條件)
 
程式碼:
  TestTableExample example = new TestTableExample();
  example.createCriteria().andField1EqualTo(5);
 
產生條件:
 
  where field1 = 5
 
程式碼:
 
  TestTableExample example = new TestTableExample();
 
  example.createCriteria()
    .andField1EqualTo(5)
    .andField2IsNull();
 
  example.or(example.createCriteria()
    .andField3NotEqualTo(9)
    .andField4IsNotNull());
 
  List<Integer> field5Values = new ArrayList<Integer>();
  field5Values.add(8);
  field5Values.add(11);
  field5Values.add(14);
  field5Values.add(22);
 
  example.or(example.createCriteria()
    .andField5In(field5Values));
 
  example.or(example.createCriteria()
    .andField6Between(3, 7));
 
 
產生條件:
 
  where (field1 = 5 and field2 is null)
     or (field3 <> 9 and field4 is not null)
     or (field5 in (8, 11, 14, 22))
     or (field6 between 3 and 7)
    
 
6、ibatorConfig.xm 檔案分析
 
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE ibatorConfiguration PUBLIC "-//Apache Software Foundation//DTD Apache iBATIS Ibator Configuration 1.0//EN" "

http://ibatis.apache.org/dtd/ibator-config_1_0.dtd" >
<ibatorConfiguration>
 
    <properties url="file:/home/guo/workspace_google/iBATIS/config/config.properties"/>
    
    <!--
      url     指定屬性檔案絕對路徑。注意與指定資料庫jdbc驅動jar包路徑的區別哈。
                    可以使用${property}的格式引用屬性檔案中的屬性值。
    -->
    
    <classPathEntry location="/home/guo/java/workspace/newbee/lib/ibatis/postgresql-8.3-604.jdbc3.jar" />
    
    <!--
      classPathEntry 指定資料庫jdbc驅動jar包的絕對路徑。
    -->
    
    <ibatorContext id="context1" targetRuntime="Ibatis2Java5">
    
    <!--
      id                 這個id可以在使用命令列執行Abator時指定,以單獨處理某一個ibatorContext
      targetRuntime        Ibatis2Java5 生成適合JDK5.0的類,另一個選項是 Ibatis2Java2,生成適合Java2的類。
    -->
    
        <ibatorPlugin type="org.apache.ibatis.ibator.plugins.RenameExampleClassPlugin">
            <property name="searchString" value="Example$" />
            <property name="replaceString" value="Criteria" />
        </ibatorPlugin>
        
        <!--
          ibatorPlugin 繼承自IbatorPluginAdapter,包名必須是 org.apache.ibatis.ibator.plugins,具體實現可以參考官方文件
            必須有替換和被替換字元屬性。
        -->
    
        <jdbcConnection driverClass="org.postgresql.Driver" connectionURL="jdbc:postgresql://192.168.1.2:5432/newbee" userId="sa" password="esoon" />
        
        <!--
          driverClass        資料庫驅動類
          connectionURL        資料庫連線地址
          userId            使用者
          password            密碼
          
                還可以使用以下格式新增資料庫的其他連線屬性
          <property name="" value=""/>
        -->
        
        <javaTypeResolver >
        
          <property name="forceBigDecimals" value="false" />
          
          <!--
                  預設false,把JDBC DECIMAL 和 NUMERIC 型別解析為 Integer
                  true,把JDBC DECIMAL 和 NUMERIC 型別解析為java.math.BigDecimal
        -->
          
        </javaTypeResolver>
            
        <javaModelGenerator targetPackage="com.newbee.bean" targetProject="newbee/src" />
        
        <!--
          targetProject        生成的Java Bean放置在哪個專案的哪個目錄下
          targetPackage        生成的Java Bean的包名
                 一個有用的屬性
          <property name="trimStrings" value="true" />
                  從資料庫返回的值被清理前後的空格
          <property name="enableSubPackages" value="false" />
                  是否在包名後加上scheme名稱
        -->
            
        <sqlMapGenerator targetPackage="com.newbee.xml" targetProject="newbee/src" />
        
        <!--
          targetProject        生成的 SqlMap.xml 檔案放置在哪個專案的哪個目錄下
          targetPackage        生成的 SqlMap.xml 檔案的包名
          <property name="enableSubPackages" value="false" />
                  是否在包名後加上scheme名稱
        -->
            
        <daoGenerator targetPackage="com.newbee.dao" targetProject="newbee/src" type="GENERIC-CI" />
        
        <!--
          targetProject        生成的 dao類檔案放置在哪個專案的哪個目錄下
          targetPackage        生成的 dao類檔案的包名
          <property name="enableSubPackages" value="false" />
                  是否在包名後加上scheme名稱
          type        生成dao檔案的型別,可選擇IBATIS、SPRING、GENERIC-CI、GENERIC-SI。預設使用GENERIC-CI
                      dao類在構造器中獲取 SqlMapClient。
                  
        -->
            
        <table tableName="ALLTYPES" domainObjectName="Customer" >
        
        <!--
          tableName 資料庫表明,據說可以包含SQL萬用字元%和_。
          domainObjectName 資料庫表對應的資料物件名稱,預設使用表名作為物件名稱。
        -->
        
          <property name="useActualColumnNames" value="true"/>
          
          <!--
                  物件的屬性名是否使用欄位名稱
          -->
          
          <generatedKey column="ID" sqlStatement="DB2" identity="true" />
          
          <!--
              column    自增長或使用sequence生成的欄位名
              sqlStatement 生成欄位的sql片段或其簡稱(參考官方文件)
              identity    true表示後生成,false表示預生成
              
                  例如:
                  
                  postgresql:<generatedKey 
                      column="lid" 
                      sqlStatement="select nextval('tb000000producttype_lid_seq')" 
                      identity="false" />
                      
                  sqlserver:<generatedKey 
                      column="lid" 
                      sqlStatement="SqlServer" 
                      identity="true" />
                      
                  oracle:<generatedKey 
                      column="lid" 
                      sqlStatement="select tb000000producttype_lid_seq.nextval from dual" 
                      identity="false" />
              
          -->
          
          <columnOverride column="DATE_FIELD" property="startDate" />
          
              <!--
                  column  欄位名
                  property 欄位對應的屬性名。(預設使用欄位名的)
                  javaType 對應的Java型別
                  jdbcType 對應的jdbc型別
                  
                      這裡的設定覆寫javaTypeResolver中的指定
              -->
          
          <ignoreColumn column="FRED" />
          
          <!--
              column    需要忽略的資料庫欄位
          -->
          
          <columnRenamingRule searchString="^CUST_" replaceString="" />
          
          <!--
                  資料庫欄位名稱到物件屬性名稱的影射關係。就是一個替換處理。
          -->
          
        </table>
        
    </ibatorContext>
    
</ibatorConfiguration>