XDoclet实现基本原理是,通过在Java代码加入特定的JavaDoc tag,从而为其添加特定的附加语义,之后通过XDoclet工具对代码中JavaDoc Tag进行分析,自动生成与代码对应的配置文件,在Ejb、hibernate、struts中使用得比较广泛了,ibatis比较草根,没有这个棉袄穿,怎么办呢,大过年的,为了让ibatis也有新衣服穿,我只好弄一个了。如果你不了解xDoclet,推荐阅读一下此文:   http://www-900.ibm.com/developerWorks/cn/java/j-xdoclet/index.shtml?ca=dwcn-newsletter-java            我的思路是力求简单,原先想写一个xdt模板文件,订制一些标签在POJO中使用,我偷个赖,看见hibernate的衣服出自名设计师,很是羡慕,我来个仿版(所谓的A货),借用它的标签,另一个重要原因是,很多IDE已经支持hibernate标签的编辑工作了。 
我只借用4个标签,其中2和4要作少量扩展(后面实例说明): 
1 @hibernate.class  2 @hibernate.discriminator   3 @hibernate.property  - 简单属性,对应数据表字段 4 @hibernate.component - 复杂属性,ibatis中对应另一个select子句 
现在请出例子猫豆MM,User.java: 
 package org.chage.pojo; import java.util.List; /**  * @hibernate.class table="D_USER"  * @hibernate.discriminator column="USERID" property="id type="long"  */ public class User {  private Long id;  private String username;  private List roles;    /***   * @hibernate.property column="USER_ID"    */  public Long getId() { return id; }  /***   * @hibernate.property column="USER_NAME"    */  public Long getUsername() { return username; }  /***   * @hibernate.component column="USER_ID" select="selectRoles"   */  public List getRoles(){ return roles; }  //以下省略了setter方法  ...... }  
 蓝色标记的两处为新增标签,从字面意思大家就可以理解了吧,前面的那个是为了指明主键字段及对应属性的,(上帝保佑,你采取唯一主键最好业务无关) 后一个是为了标明update时需要参与更新的字段。 
下面是build.xml中相关部分: 
 <target name="init">   <path id="xdoclet.path">    <fileset dir="${xdocletlib}">     <include name="*.jar" />    </fileset>   </path>   <taskdef classname="xdoclet.DocletTask" classpathref="xdoclet.path" name="doclet" />  </target>  <target name="sqlmap" depends="init">   <doclet destdir="${sqlmap.dir}" excludedtags="@version,@author,@todo" force="true" verbose="true">    <fileset dir="${src.dir}">     <include name="**/${pojo.java}.java" />    </fileset>    <template destinationFile="{0}.xml" templateFile="${template.dir}/gensqlmap.xdt" subTaskName="Generate SqlMap xml...">    </template>   </doclet>  </target>  
   最后,给出这个xdt模板: 
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://www.ibatis.com/dtd/sql-map-2.dtd"> 
<sqlMap namespace="<XDtClass:className/>"> 
  <typeAlias alias="<XDtClass:className/>" type="<XDtClass:fullClassName/>"/> 
  <resultMap id="<XDtClass:className/>Result" class="<XDtClass:className/>">      <XDtMethod:forAllClassMethods>        <XDtMethod:ifIsGetter>          <XDtMethod:ifHasMethodTag tagName="hibernate.property" >             <result property="<XDtMethod:propertyName/>" column="<XDtMethod:methodTagValue tagName="hibernate.property" paramName="column"/>"/>          </XDtMethod:ifHasMethodTag>          <XDtMethod:ifHasMethodTag tagName="hibernate.component">             <result property="<XDtMethod:propertyName/>" column="<XDtMethod:methodTagValue tagName="hibernate.component" paramName="column"/>" select="<XDtMethod:methodTagValue tagName="hibernate.component" paramName="select"/>"/>                     </XDtMethod:ifHasMethodTag>        </XDtMethod:ifIsGetter>      </XDtMethod:forAllClassMethods>     </resultMap> 
  <select id="get<XDtClass:className/>" resultMap="<XDtClass:className/>Result" parameterClass="<XDtClass:classTagValue tagName='hibernate.discriminator' paramName='type'/>">      select        <XDtMethod:forAllClassMethods>         <XDtMethod:ifIsGetter>           <XDtMethod:ifHasMethodTag tagName="hibernate.property" >             <XDtMethod:methodTagValue tagName="hibernate.property" paramName="column"/>,             </XDtMethod:ifHasMethodTag>         </XDtMethod:ifIsGetter>       </XDtMethod:forAllClassMethods>         from <XDtClass:classTagValue tagName='hibernate.class' paramName='table'/>      where <XDtClass:classTagValue tagName='hibernate.discriminator' paramName='column'/> = #value#   </select> 
  <update id="insert<XDtClass:className/>" parameterClass="<XDtClass:className/>">      insert into <XDtClass:classTagValue tagName='hibernate.class' paramName='table'/>      (       <XDtMethod:forAllClassMethods>         <XDtMethod:ifIsGetter>           <XDtMethod:ifHasMethodTag tagName="hibernate.property" >              <XDtMethod:methodTagValue tagName="hibernate.property" paramName="column"/>,           </XDtMethod:ifHasMethodTag>         </XDtMethod:ifIsGetter>       </XDtMethod:forAllClassMethods>        )values(       <XDtMethod:forAllClassMethods>         <XDtMethod:ifIsGetter>           <XDtMethod:ifHasMethodTag tagName="hibernate.property" >              #<XDtMethod:propertyName/>#,           </XDtMethod:ifHasMethodTag>         </XDtMethod:ifIsGetter>       </XDtMethod:forAllClassMethods>            )                </update>       <update id="update<XDtClass:className/>" parameterClass="<XDtClass:className/>">      update <XDtClass:classTagValue tagName='hibernate.class' paramName='table'/> set       <XDtMethod:forAllClassMethods>         <XDtMethod:ifIsGetter>           <XDtMethod:ifHasMethodTag tagName="hibernate.property" >              <XDtMethod:ifMethodTagValueEquals tagName="hibernate.property" paramName="update" value="true">                <XDtMethod:methodTagValue tagName="hibernate.property" paramName="column"/> = #<XDtMethod:propertyName/>#,              </XDtMethod:ifMethodTagValueEquals>           </XDtMethod:ifHasMethodTag>         </XDtMethod:ifIsGetter>       </XDtMethod:forAllClassMethods>              where <XDtClass:classTagValue tagName='hibernate.discriminator' paramName='column'/> = #<XDtClass:classTagValue tagName='hibernate.discriminator' paramName='property'/>#   </update> 
  <update id="del<XDtClass:className/>" parameterClass="<XDtClass:classTagValue tagName='hibernate.discriminator' paramName='type'/>">      delete from <XDtClass:classTagValue tagName='hibernate.class' paramName='table'/>       where <XDtClass:classTagValue tagName='hibernate.discriminator' paramName='column'/> = #value#   </update> </sqlMap>  
有一个郁闷之处是,在insert和update子句中,字段列表最后面多了一个逗号,有空了再说吧,快过年了,人心散了,队伍......   
 
  |