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

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

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

    隨筆 - 115  文章 - 481  trackbacks - 0
    <2006年11月>
    2930311234
    567891011
    12131415161718
    19202122232425
    262728293012
    3456789

    常用鏈接

    留言簿(19)

    隨筆檔案(115)

    文章檔案(4)

    新聞檔案(1)

    成員連接

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    在最近的一個項目中,使用了 hibernate+struts ,由于中間沒有使用 spring 來管理 bean ,所以我使用了 DAO+Service 來做持久層和業務層。受 spring hibernate template 的封裝的影響,我自己實現了一個簡單的 hibernateTemplate —— MHibernateTemplate 和調用接口 MHibernateCallback 。在其中包裝了錯誤攔截等動作。所以我的 DAO 就不能直接從 Myecipse 生成了。但由于 Domain bean 太多,而且 DAO 中又是簡單的代碼重復,所以想到了使用代碼生成。剛開始想直接在 Myeclipse 中生成 DAO 的時候使用自己的模版就可以了,但是在網上找了半天都沒有相關的信息。后來模仿 easyjtools 使用 velocity 自己做代碼生成,但感覺時間不夠,所以,就選擇了 XDoclet

    ?????? 網上相關的內容不是很多,所以就只有啃 En 版的 XDoclet in Action 。由于我的需求很簡單,所以只使用了簡單的 template (就是 .xdt )來生成代碼,搞了兩天,效果還不錯。

    ?????? 比如一個 model :(這個項目的需求比較奇怪,由于要同步,所以每個對象都必須有一個 pkid (包括中間表), 2 就是每個對象有個 dr 標志,表示刪除(而不是真正的刪除))。

    ?????? package com.my.xdoclet;

    /**

    ? * PubCompproper generated by MyEclipse - Hibernate Tools

    ? * @hasRef

    ? * 公司性質

    ? */

    ?

    public class PubCompproper extends BaseDomain implements java.io.Serializable {

    ?

    ??? // Fields

    ??? /**

    ??? ? * @pkid

    ??? ? */

    ??? private String cproPkid ;

    ??? // 系統類型信息

    ??? /**

    ??? ? * @ref .model name="sytp"

    ??? ? */

    ??? private PubSystype sytp ;

    ??? // 公司性質編碼

    ??? private String cproCode ;

    ??? // 公司性質名稱

    ??? private String cproName ;

    ??? // 刪除表示

    ??? /**

    ??? ? * @del

    ??? ? */

    ??? private String cproDr ;

    ??? // Constructors

    ?

    ??? /** default constructor */

    ??? public PubCompproper() {

    ?????? this .setCproDr( "0" );

    ??? }

    ?

    ??? // Property accessors

    ?

    ??? public String getCproPkid() {

    ?????? return this . cproPkid ;

    ??? }

    ?

    ??? public void setCproPkid(String cproPkid ) {

    ?????? this . cproPkid = cproPkid ;

    ??? }

    ?

    ??? public String getCproCode() {

    ?????? return this . cproCode ;

    ??? }

    ?

    ??? public void setCproCode(String cproCode ) {

    ?????? this . cproCode = cproCode ;

    ??? }

    ?

    ??? public String getCproName() {

    ?????? return this . cproName ;

    ??? }

    ?

    ??? public void setCproName(String cproName ) {

    ?????? this . cproName = cproName ;

    ??? }

    ?

    ??? /**

    ??? ? * @return the sytp

    ??? ? */

    ??? public PubSystype getSytp() {

    ?????? return sytp ;

    ??? }

    ?

    ??? /**

    ??? ? * @param sytp the sytp to set

    ??? ? */

    ??? public void setSytp(PubSystype sytp ) {

    ?????? this . sytp = sytp ;

    ??? }

    ?

    ??? /**

    ??? ? * @return the cproDr

    ??? ? */

    ??? public String getCproDr() {

    ?????? return cproDr ;

    ??? }

    ?

    ??? /**

    ??? ? * @param cproDr the cproDr to set

    ??? ? */

    ??? public void setCproDr(String cproDr ) {

    ?????? this . cproDr = cproDr ;

    ??? }

    }

    ?

    其中有一些相關的對象,在 DAO 中要使用到。

    看看模版文件

    package com.hycs.bs.client.itf;

    ?

    import java.util.List;

    ?

    import <XDtPackage:packageName />.<XDtClass:className />;

    ?

    public interface <XDtClass:className />DAO {

    ??? // 添加

    ??? boolean add(<XDtClass:className /> instance);

    ???

    ??? <XDtClass:ifHasClassTag tagName="hasRef">

    ??? // 添加

    ??? boolean add(<XDtClass:className /> instance,<XDtField:forAllFields><XDtField:ifHasFieldTag tagName="ref.model" paramName="name"> String <XDtField:fieldTagValue tagName="ref.model" paramName="name" />pkid</XDtField:ifHasFieldTag></XDtField:forAllFields>);??

    ??? </XDtClass:ifHasClassTag>

    ???

    ??? // 刪除

    ??? boolean del(String pkid);

    ???

    ??? // 更新

    ??? boolean update(<XDtClass:className /> instance);

    ???

    ??? // 列出所有

    ??? List list();

    ???

    ??? List list(boolean withDr);

    ???

    ??? // 得到一個對象

    ??? <XDtClass:className /> get(String pkid);

    }

    這個是 interface 的模版,其中的模版標簽都很簡單易懂;

    <XDtTagDef:tagDef namespace="Primitive" handler="com.my.xdoclet.customTags.UpperName" />

    ?

    package com.hycs.bs.client.call;

    ?

    import com.hycs.bs.sys.MHibernateTemplate;

    import com.hycs.util.Constant;

    import com.hycs.util.OidHelper;

    import com.hycs.bs.sys.HibernateCodeUtil;

    import com.hycs.bs.sys.HibernateUtil;

    ?

    public class <XDtClass:className/>DAOImpl implements <XDtClass:className/>DAO{

    ??? private MHibernateTemplate template;

    ??? <XDtField:forAllFields>

    ?????? <XDtField:ifHasFieldTag tagName="ref.model" paramName="name">

    ?????????? private final <XDtField:fieldType/>DAO <XDtField:fieldTagValue tagName="ref.model" paramName="name"/>dao = new <XDtField:fieldType/>DAOImpl();

    ?????? </XDtField:ifHasFieldTag>

    ??? </XDtField:forAllFields>

    ???

    ??? public <XDtClass:className/>DAOImpl(){

    ?????? this.template=new MHibernateTemplate(HibernateUtil.getSessionFactory());

    ??? }

    ???

    ??? public boolean add(<XDtClass:className/> instance) {

    ?????? // TODO Auto-generated method stub

    ?????? // add your code and pkid generhere;

    ?????? //instance.setCproCode(HibernateCodeUtil.getLastCode("PubCompproper", "cproCode", "cproPkid"));

    ?????? //instance.setCproPkid(OidHelper.oidSingle());

    ??????

    ?????? return this.template.save(instance);

    ??? }

    ???

    ??? <XDtClass:ifHasClassTag tagName="hasRef">

    ??? public boolean add(<XDtClass:className/> instance, <XDtField:forAllFields><XDtField:ifHasFieldTag tagName="ref.model" paramName="name"> String <XDtField:fieldTagValue tagName="ref.model" paramName="name" />pkid</XDtField:ifHasFieldTag></XDtField:forAllFields>) {

    ?????? // TODO Auto-generated method stub

    ?????? <XDtField:forAllFields>

    ?????????? <XDtField:ifHasFieldTag tagName="ref.model" paramName="name">

    ????????????? <XDtField:fieldType/> <XDtField:fieldTagValue tagName="ref.model" paramName="name" />=this.<XDtField:fieldTagValue tagName="ref.model" paramName="name"/>dao.get(<XDtField:fieldTagValue tagName="ref.model" paramName="name" />pkid);

    ????????????? if(<XDtField:fieldTagValue tagName="ref.model" paramName="name" />==null){

    ????????????????? return false;

    ????????????? }

    ????????????? instance.set<XDtPrimitive:upperName value='<XDtField:fieldTagValue tagName="ref.model" paramName="name" />' />(<XDtField:fieldTagValue tagName="ref.model" paramName="name" />);

    ?????????? </XDtField:ifHasFieldTag>

    ?????? </XDtField:forAllFields>

    ?????? return this.add(instance);

    ??? }

    ??? </XDtClass:ifHasClassTag>

    ???

    ??? public boolean del(String pkid) {

    ?????? // TODO Auto-generated method stub

    ?????? <XDtClass:className /> instance =this.get(pkid);

    ?????? if(instance==null||instance.get<XDtField:forAllFields><XDtField:ifHasFieldTag tagName="pkid" ><XDtPrimitive:upperName value="<XDtField:fieldName />" /></XDtField:ifHasFieldTag></XDtField:forAllFields>==null){

    ?????????? return false;

    ?????? }

    ?????? instance.set<XDtField:forAllFields><XDtField:ifHasFieldTag tagName="del" ><XDtPrimitive:upperName value="<XDtField:fieldName />" /></XDtField:ifHasFieldTag></XDtField:forAllFields>(Constant.MODEL_DEL);

    ?????? return this.template.update(instance);

    ??? }

    ???

    ??? public <XDtClass:className /> get(String pkid) {

    ?????? // TODO Auto-generated method stub

    ?????? return (<XDtClass:className />)this.template.get(<XDtClass:className />.class, pkid);

    ??? }

    ???

    ??? public List list() {

    ?????? // TODO Auto-generated method stub

    ?????? return this.list(true);

    ??? }

    ???

    ??? public List list(boolean withDr) {

    ?????? // TODO Auto-generated method stub

    ?????? if(withDr){

    ?????????? return HibernateCodeUtil.listWithDr("<XDtClass:className />","<XDtField:forAllFields><XDtField:ifHasFieldTag tagName="del"><XDtField:fieldName /></XDtField:ifHasFieldTag></XDtField:forAllFields>" );

    ?????? }else{

    ?????????? return this.template.getAll(<XDtClass:className />.class);

    ?????? }

    ??? }

    ???

    ??? public boolean update(<XDtClass:className /> instance) {

    ?????? // TODO Auto-generated method stub

    ?????? <XDtClass:ifHasClassTag tagName="hasRef">

    ?????? <XDtClass:className /> temp=this.get(instance.get<XDtField:forAllFields><XDtField:ifHasFieldTag tagName="pkid" ><XDtPrimitive:upperName value="<XDtField:fieldName />" /></XDtField:ifHasFieldTag></XDtField:forAllFields>());

    ?????? <XDtField:forAllFields>

    ?????????? <XDtField:ifHasFieldTag tagName="ref.model" paramName="name">????????

    ????????????? if(instance.get<XDtPrimitive:upperName value='<XDtField:fieldTagValue tagName="ref.model" paramName="name" />' />()==null){????????????????

    ????????????????? instance.set<XDtPrimitive:upperName value='<XDtField:fieldTagValue tagName="ref.model" paramName="name" />' />(temp.get<XDtPrimitive:upperName value='<XDtField:fieldTagValue tagName="ref.model" paramName="name" />' />());

    ????????????? }

    ?????????? </XDtField:ifHasFieldTag>

    ?????? </XDtField:forAllFields>

    ??????

    ?????? </XDtClass:ifHasClassTag>

    ?????? return this.template.update(instance);

    ??? }

    }

    這是個比較復雜的模版了,是 DAO 的具體實現,

    在寫這個模版的時候,我遇到了幾個問題,

    1 就是標簽的嵌套,比如 <XDtPrimitive:upperName value='<XDtField:fieldTagValue tagName="ref.model" paramName="name" />' /> ,開始內部標簽都使用轉義符,結果搞不定,網上找沒有任何相關的內容,后來直接在外層使用 (就象 js ),搞定。

    2 就是對于標簽的內容的首字符大寫,沒有提供這個功能的標簽,使用了自定義的:

    package com.my.xdoclet.customTags;

    ?

    import java.util.Properties;

    ?

    import xdoclet.XDocletTagSupport;

    ?

    public class UpperName extends XDocletTagSupport {

    ??? public String upperName(Properties attribute){

    ?????? String value=attribute.getProperty("value");

    ?????? String upper= upper(value);

    ?????? return upper;

    ??? }

    ???

    ??? private static String upper(String value){

    ?????? return value.toUpperCase().substring(0,1)+value.substring(1);

    ??? }

    }

    并在模版文件中使用 <XDtTagDef:tagDef namespace="Primitive" handler="com.my.xdoclet.customTags.UpperName" /> 來應用就直接能在模版文件中使用 <XDtPrimitive:upperName > 來使用了,

    下面是 bulid.xml 文件:

    <?xml version="1.0" encoding="UTF-8"?>

    ?

    <project name= "xdocletExample" default= "doall" basedir= "." >

    ??? <property name= "xdoclet.lib.dir" location= "${basedir}/lib" />

    ??? <property name= "gen.src.dir" location= "${basedir}/target" />

    ??? <property name= "src.dir" location= "${basedir}/src" />

    ??? <property name= "template.dir" location= "${basedir}/template" />

    ??? <property name= "customtag.dir" location= "${basedir}/bin" />

    ?

    ??? <path id= "xdoclet.lib.path" >

    ?????? <fileset dir= "${xdoclet.lib.dir}" includes= "*.jar" />

    ??? </path>

    ?

    ??? <taskdef name= "xdoclet" classname= "xdoclet.DocletTask" classpathref= "xdoclet.lib.path" /> ???

    ???

    ??? <target name= "init" />

    ?

    ??? <target name= "daogener" depends= "init" >

    ?????? <xdoclet destdir= "${gen.src.dir}" >

    ?????????? <fileset dir= "${src.dir}" includes= "**/*.java" />

    ?????????? <template templateFile= "${template.dir}/daointerface.xdt" acceptInterfaces= "false" acceptAbstractClasses= "false" destinationfile= "{0}DAO.java" />

    ?????? </xdoclet>

    ??? </target>

    ?

    ??? <target name= "daoimplgener" depends= "init" >

    ?????? <xdoclet destdir= "${gen.src.dir}" >

    ?????????? <fileset dir= "${src.dir}" includes= "**/*.java" />

    ?????????? <template templateFile= "${template.dir}/daoimpl.xdt" acceptInterfaces= "false" acceptAbstractClasses= "false" destinationfile= "{0}DAOImpl.java" />

    ?????? </xdoclet>

    ??? </target>

    ?

    ??? <target name= "doall" depends= "daogener,daoimplgener" />

    </project>

    ?

    build 一下:

    生成的代碼如下:

    package com.hycs.bs.client.itf;

    ?

    import java.util.List;

    ?

    import com.my.xdoclet.PubCompproper;

    ?

    public interface PubCompproperDAO {

    ??? // 添加

    ??? boolean add(PubCompproper instance);

    ??? // 添加

    ??? boolean add(PubCompproper instance, String sytppkid);??

    ??? // 刪除

    ??? boolean del(String pkid);

    ??? // 更新

    ??? boolean update(PubCompproper instance);

    ??? // 列出所有

    ??? List list();

    ??? List list(boolean withDr);

    ??? // 得到一個對象

    ??? PubCompproper get(String pkid);

    }

    這個是接口

    ?

    package com.hycs.bs.client.call;

    ?

    import com.hycs.bs.sys.MHibernateTemplate;

    import com.hycs.util.Constant;

    import com.hycs.util.OidHelper;

    import com.hycs.bs.sys.HibernateCodeUtil;

    import com.hycs.bs.sys.HibernateUtil;

    ?

    public class PubCompproperDAOImpl implements PubCompproperDAO{

    ??? private MHibernateTemplate template;

    ?????????? private final com.my.xdoclet.PubSystypeDAO sytpdao = new com.my.xdoclet.PubSystypeDAOImpl();

    ??? public PubCompproperDAOImpl(){

    ?????? this.template=new MHibernateTemplate(HibernateUtil.getSessionFactory());

    ??? }

    ??? public boolean add(PubCompproper instance) {

    ?????? // TODO Auto-generated method stub

    ?????? // add your code and pkid generhere;

    ?????? //instance.setCproCode(HibernateCodeUtil.getLastCode("PubCompproper", "cproCode", "cproPkid"));

    ?????? //instance.setCproPkid(OidHelper.oidSingle());

    ?????? return this.template.save(instance);

    ??? }

    ??? public boolean add(PubCompproper instance,? String sytppkid) {

    ?????? // TODO Auto-generated method stub

    ????????????? com.my.xdoclet.PubSystype sytp=this.sytpdao.get(sytppkid);

    ????????????? if(sytp==null){

    ????????????????? return false;

    ????????????? }

    ????????????? instance.setSytp(sytp);

    ?????? return this.add(instance);

    ??? }

    ??? public boolean del(String pkid) {

    ?????? // TODO Auto-generated method stub

    ?????? PubCompproper instance =this.get(pkid);

    ?????? if(instance==null||instance.getCproPkid==null){

    ?????????? return false;

    ?????? }

    ?????? instance.setCproDr(Constant.MODEL_DEL);

    ?????? return this.template.update(instance);

    ??? }

    ??? public PubCompproper get(String pkid) {

    ?????? // TODO Auto-generated method stub

    ?????? return (PubCompproper)this.template.get(PubCompproper.class, pkid);

    ??? }

    ??? public List list() {

    ?????? // TODO Auto-generated method stub

    ?????? return this.list(true);

    ??? }

    ??? public List list(boolean withDr) {

    ?????? // TODO Auto-generated method stub

    ?????? if(withDr){

    ?????????? return HibernateCodeUtil.listWithDr("PubCompproper","cproDr" );

    ?????? }else{

    ?????????? return this.template.getAll(PubCompproper.class);

    ?????? }

    ??? }

    ??? public boolean update(PubCompproper instance) {

    ?????? // TODO Auto-generated method stub

    ?????? PubCompproper temp=this.get(instance.getCproPkid());

    ????????????? if(instance.getSytp()==null){????????????????

    ????????????????? instance.setSytp(temp.getSytp());

    ????????????? }

    ?????? return this.template.update(instance);

    ??? }

    }

    這個是代碼。

    于是我的工作就很簡單了,適用 Myeclipse 直接從 DataExplor 中生成 Domain bean 和映射文件,改一下關聯,在 domain 中添加必要的 XDoclet 標記, build ,就可以專著于具體的業務了。

    但這個代碼還有點問題就是當遇到一個類有多個關聯對象的時候,在生成的一些方法上,要自己手動增加或者刪除一個 ”,” 。這個還要繼續學習。

    同時 XDoclet 提供了很好的擴展機制,這個也要繼續研究。

    再次就是我在想 XDoclet 中有沒有直接使用標簽來定義標簽的功能,或者在模版內定義變量??

    easyjweb 使用 XDoclet 來生成代碼也會是很簡單而且穩定的。

    (注:本文作者,EasyJF開源團隊 stef_wu,轉載請保留作者聲明!)

    posted on 2006-11-28 09:51 簡易java框架 閱讀(1908) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 四虎永久在线精品免费一区二区| 亚洲一区二区三区免费视频| 亚洲精品美女网站| 亚洲Av熟妇高潮30p| 免费看男女下面日出水视频| 99在线精品免费视频九九视| 日韩电影免费在线观看| 一级做受视频免费是看美女 | 色噜噜噜噜亚洲第一| 亚洲国产美女福利直播秀一区二区| 亚洲色婷婷一区二区三区| 国产婷婷高清在线观看免费| 在线观看特色大片免费视频| 99久久久国产精品免费牛牛四川 | 国产亚洲老熟女视频| 免费在线一级毛片| 日本无卡码免费一区二区三区| 91香蕉视频免费| 亚洲免费中文字幕| 99久久99久久免费精品小说| 日本不卡免费新一区二区三区 | 亚洲小说区图片区另类春色| 亚洲国产精品成人久久蜜臀 | 亚洲欧美日韩中文字幕一区二区三区 | 亚洲综合色丁香麻豆| 亚洲AV成人片色在线观看高潮| 中文字幕精品亚洲无线码一区| 亚洲日本中文字幕一区二区三区| 免费国产真实迷j在线观看| 日本最新免费不卡二区在线| 国产在线不卡免费播放| 午夜国产羞羞视频免费网站| 四虎影视精品永久免费网站| 四虎影视在线永久免费看黄| 免费人成在线观看网站视频| 亚洲av再在线观看| 亚洲精品白浆高清久久久久久| 不卡精品国产_亚洲人成在线| 亚洲欧洲日产国码av系列天堂| 亚洲欧洲精品无码AV| 无码乱人伦一区二区亚洲|