<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框架 閱讀(1911) 評論(0)  編輯  收藏

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


    網站導航:
     
    主站蜘蛛池模板: 亚洲av区一区二区三| 日本zzzzwww大片免费| 污污污视频在线免费观看| 亚洲精品无AMM毛片| 中文日韩亚洲欧美制服| 亚洲人成网站色在线观看| 亚洲视频无码高清在线| 亚洲婷婷第一狠人综合精品| 亚洲国产成+人+综合| 亚洲一级大黄大色毛片| 精品丝袜国产自在线拍亚洲| 在线亚洲高清揄拍自拍一品区| 亚洲中文字幕无码久久| 亚洲精品一卡2卡3卡四卡乱码| 亚洲欧美第一成人网站7777 | 国产91在线免费| 四虎永久免费影院在线| 亚洲A∨午夜成人片精品网站| 亚洲成年看片在线观看| 亚洲日韩中文在线精品第一| 亚洲综合伊人久久大杳蕉| 国产亚洲精品无码成人| 亚洲精品第一国产综合精品| 久久狠狠爱亚洲综合影院| 亚洲精品成a人在线观看夫| 免费在线观看亚洲| 一区二区三区在线观看免费| 国产在线观看xxxx免费| 96免费精品视频在线观看| 成人黄软件网18免费下载成人黄18免费视频 | 亚洲不卡中文字幕无码| 亚洲成人黄色网址| 亚洲欧美日韩中文高清www777| 美美女高清毛片视频黄的一免费 | 亚洲午夜无码久久久久小说| 国产亚洲福利精品一区二区| 男女一边桶一边摸一边脱视频免费| 老司机69精品成免费视频| 皇色在线视频免费网站| 免费人成在线观看播放国产| 亚洲成av人在线视|