<iframe align="center" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog336280.html" frameborder="0" width="336" scrolling="no" height="280"></iframe>
转EasyJF团队stef_wu的一篇文章!
在最近的一个项目中,使用了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 <packagename></packagename>.<classname></classname>;
public interface <classname></classname>DAO {
//
添加
boolean add(<classname></classname> instance);
<ifhasclasstag tagname="hasRef"></ifhasclasstag>
//
添加
boolean add(<classname></classname> instance,<forallfields><ifhasfieldtag tagname="ref.model" paramname="name"> String <fieldtagvalue tagname="ref.model" paramname="name"></fieldtagvalue>pkid</ifhasfieldtag></forallfields>);
//
删除
boolean del(String pkid);
//
更新
boolean update(<classname></classname> instance);
//
列出所有
List list();
List list(boolean withDr);
//
得到一个对象
<classname></classname> get(String pkid);
}
这个是
interface
的模版,其中的模版标签都很简单易懂;
<tagdef namespace="Primitive" handler="com.my.xdoclet.customTags.UpperName"></tagdef>
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 <classname></classname>DAOImpl implements <classname></classname>DAO{
private MHibernateTemplate template;
<forallfields></forallfields>
<ifhasfieldtag tagname="ref.model" paramname="name"></ifhasfieldtag>
private final <fieldtype></fieldtype>DAO <fieldtagvalue tagname="ref.model" paramname="name"></fieldtagvalue>dao = new <fieldtype></fieldtype>DAOImpl();
public <classname></classname>DAOImpl(){
this.template=new MHibernateTemplate(HibernateUtil.getSessionFactory());
}
public boolean add(<classname></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);
}
<ifhasclasstag tagname="hasRef"></ifhasclasstag>
public boolean add(<classname></classname> instance, <forallfields><ifhasfieldtag tagname="ref.model" paramname="name"> String <fieldtagvalue tagname="ref.model" paramname="name"></fieldtagvalue>pkid</ifhasfieldtag></forallfields>) {
// TODO Auto-generated method stub
<forallfields></forallfields>
<ifhasfieldtag tagname="ref.model" paramname="name"></ifhasfieldtag>
<fieldtype></fieldtype><fieldtagvalue tagname="ref.model" paramname="name"></fieldtagvalue>=this.<fieldtagvalue tagname="ref.model" paramname="name"></fieldtagvalue>dao.get(<fieldtagvalue tagname="ref.model" paramname="name"></fieldtagvalue>pkid);
if(<fieldtagvalue tagname="ref.model" paramname="name"></fieldtagvalue>==null){
return false;
}
instance.set<uppername value='<XDtField:fieldTagValue tagName="ref.model" paramName="name" />'></uppername>(<fieldtagvalue tagname="ref.model" paramname="name"></fieldtagvalue>);
return this.add(instance);
}
public boolean del(String pkid) {
// TODO Auto-generated method stub
<classname></classname> instance =this.get(pkid);
if(instance==null||instance.get<forallfields><ifhasfieldtag tagname="pkid"><uppername value="<XDtField:fieldName />"></uppername></ifhasfieldtag></forallfields>==null){
return false;
}
instance.set<forallfields><ifhasfieldtag tagname="del"><uppername value="<XDtField:fieldName />"></uppername></ifhasfieldtag></forallfields>(Constant.MODEL_DEL);
return this.template.update(instance);
}
public <classname></classname> get(String pkid) {
// TODO Auto-generated method stub
return (<classname></classname>)this.template.get(<classname></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("<classname></classname>","<forallfields><ifhasfieldtag tagname="del"><fieldname></fieldname></ifhasfieldtag></forallfields>" );
}else{
return this.template.getAll(<classname></classname>.class);
}
}
public boolean update(<classname></classname> instance) {
// TODO Auto-generated method stub
<ifhasclasstag tagname="hasRef"></ifhasclasstag>
<classname></classname> temp=this.get(instance.get<forallfields><ifhasfieldtag tagname="pkid"><uppername value="<XDtField:fieldName />"></uppername></ifhasfieldtag></forallfields>());
<forallfields></forallfields>
<ifhasfieldtag tagname="ref.model" paramname="name"></ifhasfieldtag>
if(instance.get<uppername value='<XDtField:fieldTagValue tagName="ref.model" paramName="name" />'></uppername>()==null){
instance.set<uppername value='<XDtField:fieldTagValue tagName="ref.model" paramName="name" />'></uppername>(temp.get<uppername value='<XDtField:fieldTagValue tagName="ref.model" paramName="name" />'></uppername>());
}
return this.template.update(instance);
}
}
这是个比较复杂的模版了,是
DAO
的具体实现,
在写这个模版的时候,我遇到了几个问题,
1
就是标签的嵌套,比如
<uppername value='<XDtField:fieldTagValue tagName="ref.model" paramName="name" />'></uppername>
,开始内部标签都使用转义符,结果搞不定,网上找没有任何相关的内容,后来直接在外层使用
’
(就象
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);
}
}
并在模版文件中使用
<tagdef namespace="Primitive" handler="com.my.xdoclet.customTags.UpperName"></tagdef>
来应用就直接能在模版文件中使用
<uppername></uppername>
来使用了,
下面是
bulid.xml
文件:
<?xml version="1.0" encoding="UTF-8"?>
<project><span style="FONT-SIZE: 10pt; COLOR: navy">name=</span><span style="FONT-SIZE: 10pt; COLOR: green">"xdocletExample"</span><span style="FONT-SIZE: 10pt; COLOR: navy">default=</span><span style="FONT-SIZE: 10pt; COLOR: green">"doall"</span><span style="FONT-SIZE: 10pt; COLOR: navy">basedir=</span><span style="FONT-SIZE: 10pt; COLOR: green">"."</span><span style="FONT-SIZE: 10pt; COLOR: navy">></span></project>
<property><span style="FONT-SIZE: 10pt; COLOR: navy">name=</span><span style="FONT-SIZE: 10pt; COLOR: green">"xdoclet.lib.dir"</span><span style="FONT-SIZE: 10pt; COLOR: navy">location=</span><span style="FONT-SIZE: 10pt; COLOR: green">"${basedir}/lib"</span><span style="FONT-SIZE: 10pt; COLOR: navy">/></span></property>
<property><span style="FONT-SIZE: 10pt; COLOR: navy">name=</span><span style="FONT-SIZE: 10pt; COLOR: green">"gen.src.dir"</span><span style="FONT-SIZE: 10pt; COLOR: navy">location=</span><span style="FONT-SIZE: 10pt; COLOR: green">"${basedir}/target"</span><span style="FONT-SIZE: 10pt; COLOR: navy">/></span></property>
<property><span style="FONT-SIZE: 10pt; COLOR: navy">name=</span><span style="FONT-SIZE: 10pt; COLOR: green">"src.dir"</span><span style="FONT-SIZE: 10pt; COLOR: navy">location=</span><span style="FONT-SIZE: 10pt; COLOR: green">"${basedir}/src"</span><span style="FONT-SIZE: 10pt; COLOR: navy">/></span></property>
<property><span style="FONT-SIZE: 10pt; COLOR: navy">name=</span><span style="FONT-SIZE: 10pt; COLOR: green">"template.dir"</span><span style="FONT-SIZE: 10pt; COLOR: navy">location=</span><span style="FONT-SIZE: 10pt; COLOR: green">"${basedir}/template"</span><span style="FONT-SIZE: 10pt; COLOR: navy">/></span></property>
<property><span style="FONT-SIZE: 10pt; COLOR: navy">name=</span><span style="FONT-SIZE: 10pt; COLOR: green">"customtag.dir"</span><span style="FONT-SIZE: 10pt; COLOR: navy">location=</span><span style="FONT-SIZE: 10pt; COLOR: green">"${basedir}/bin"</span><span style="FONT-SIZE: 10pt; COLOR: navy">/></span></property>
id="xdoclet.lib.path">
<fileset><span style="FONT-SIZE: 10pt; COLOR: navy">dir=</span><span style="FONT-SIZE: 10pt; COLOR: green">"${xdoclet.lib.dir}"</span><span style="FONT-SIZE: 10pt; COLOR: navy">includes=</span><span style="FONT-SIZE: 10pt; COLOR: green">"*.jar"</span><span style="FONT-SIZE: 10pt; COLOR: navy">/></span></fileset>
<taskdef><span style="FONT-SIZE: 10pt; COLOR: navy">name=</span><span style="FONT-SIZE: 10pt; COLOR: green">"xdoclet"</span><span style="FONT-SIZE: 10pt; COLOR: navy">classname=</span><span style="FONT-SIZE: 10pt; COLOR: green">"xdoclet.DocletTask"</span><span style="FONT-SIZE: 10pt; COLOR: navy">classpathref=</span><span style="FONT-SIZE: 10pt; COLOR: green">"xdoclet.lib.path"</span><span style="FONT-SIZE: 10pt; COLOR: navy">/></span><span style="FONT-SIZE: 10pt; COLOR: black"> </span></taskdef>
<target><span style="FONT-SIZE: 10pt; COLOR: navy">name=</span><span style="FONT-SIZE: 10pt; COLOR: green">"init"</span><span style="FONT-SIZE: 10pt; COLOR: navy">/></span></target>
<target><span style="FONT-SIZE: 10pt; COLOR: navy">name=</span><span style="FONT-SIZE: 10pt; COLOR: green">"daogener"</span><span style="FONT-SIZE: 10pt; COLOR: navy">depends=</span><span style="FONT-SIZE: 10pt; COLOR: green">"init"</span><span style="FONT-SIZE: 10pt; COLOR: navy">></span></target>
<xdoclet><span style="FONT-SIZE: 10pt; COLOR: navy">destdir=</span><span style="FONT-SIZE: 10pt; COLOR: green">"${gen.src.dir}"</span><span style="FONT-SIZE: 10pt; COLOR: navy">></span></xdoclet>
<fileset><span style="FONT-SIZE: 10pt; COLOR: navy">dir=</span><span style="FONT-SIZE: 10pt; COLOR: green">"${src.dir}"</span><span style="FONT-SIZE: 10pt; COLOR: navy">includes=</span><span style="FONT-SIZE: 10pt; COLOR: green">"**/*.java"</span><span style="FONT-SIZE: 10pt; COLOR: navy">/></span></fileset>
<template><span style="FONT-SIZE: 10pt; COLOR: navy">templateFile=</span><span style="FONT-SIZE: 10pt; COLOR: green">"${template.dir}/daointerface.xdt"</span><span style="FONT-SIZE: 10pt; COLOR: navy">acceptInterfaces=</span><span style="FONT-SIZE: 10pt; COLOR: green">"false"</span><span style="FONT-SIZE: 10pt; COLOR: navy">acceptAbstractClasses=</span><span style="FONT-SIZE: 10pt; COLOR: green">"false"</span><span style="FONT-SIZE: 10pt; COLOR: navy">destinationfile=</span><span style="FONT-SIZE: 10pt; COLOR: green">"{0}DAO.java"</span><span style="FONT-SIZE: 10pt; COLOR: navy">/></span></template>
<target><span style="FONT-SIZE: 10pt; COLOR: navy">name=</span><span style="FONT-SIZE: 10pt; COLOR: green">"daoimplgener"</span><span style="FONT-SIZE: 10pt; COLOR: navy">depends=</span><span style="FONT-SIZE: 10pt; COLOR: green">"init"</span><span style="FONT-SIZE: 10pt; COLOR: navy">></span></target>
<xdoclet><span style="FONT-SIZE: 10pt; COLOR: navy">destdir=</span><span style="FONT-SIZE: 10pt; COLOR: green">"${gen.src.dir}"</span><span style="FONT-SIZE: 10pt; COLOR: navy">></span></xdoclet>
<fileset><span style="FONT-SIZE: 10pt; COLOR: navy">dir=</span><span style="FONT-SIZE: 10pt; COLOR: green">"${src.dir}"</span><span style="FONT-SIZE: 10pt; COLOR: navy">includes=</span><span style="FONT-SIZE: 10pt; COLOR: green">"**/*.java"</span><span style="FONT-SIZE: 10pt; COLOR: navy">/></span></fileset>
<template><span style="FONT-SIZE: 10pt; COLOR: navy">templateFile=</span><span style="FONT-SIZE: 10pt; COLOR: green">"${template.dir}/daoimpl.xdt"</span><span style="FONT-SIZE: 10pt; COLOR: navy">acceptInterfaces=</span><span style="FONT-SIZE: 10pt; COLOR: green">"false"</span><span style="FONT-SIZE: 10pt; COLOR: navy">acceptAbstractClasses=</span><span style="FONT-SIZE: 10pt; COLOR: green">"false"</span><span style="FONT-SIZE: 10pt; COLOR: navy">destinationfile=</span><span style="FONT-SIZE: 10pt; COLOR: green">"{0}DAOImpl.java"</span><span style="FONT-SIZE: 10pt; COLOR: navy">/></span></template>
<target><span style="FONT-SIZE: 10pt; COLOR: navy">name=</span><span style="FONT-SIZE: 10pt; COLOR: green">"doall"</span><span style="FONT-SIZE: 10pt; COLOR: navy">depends=</span><span style="FONT-SIZE: 10pt; COLOR: green">"daogener,daoimplgener"</span><span style="FONT-SIZE: 10pt; COLOR: navy">/></span></target>
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,转载请保留作者声明!)
转EasyJF团队stef_wu的一篇文章!
在最近的一个项目中,使用了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 <packagename></packagename>.<classname></classname>;
public interface <classname></classname>DAO {
//
添加
boolean add(<classname></classname> instance);
<ifhasclasstag tagname="hasRef"></ifhasclasstag>
//
添加
boolean add(<classname></classname> instance,<forallfields><ifhasfieldtag tagname="ref.model" paramname="name"> String <fieldtagvalue tagname="ref.model" paramname="name"></fieldtagvalue>pkid</ifhasfieldtag></forallfields>);
//
删除
boolean del(String pkid);
//
更新
boolean update(<classname></classname> instance);
//
列出所有
List list();
List list(boolean withDr);
//
得到一个对象
<classname></classname> get(String pkid);
}
这个是
interface
的模版,其中的模版标签都很简单易懂;
<tagdef namespace="Primitive" handler="com.my.xdoclet.customTags.UpperName"></tagdef>
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 <classname></classname>DAOImpl implements <classname></classname>DAO{
private MHibernateTemplate template;
<forallfields></forallfields>
<ifhasfieldtag tagname="ref.model" paramname="name"></ifhasfieldtag>
private final <fieldtype></fieldtype>DAO <fieldtagvalue tagname="ref.model" paramname="name"></fieldtagvalue>dao = new <fieldtype></fieldtype>DAOImpl();
public <classname></classname>DAOImpl(){
this.template=new MHibernateTemplate(HibernateUtil.getSessionFactory());
}
public boolean add(<classname></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);
}
<ifhasclasstag tagname="hasRef"></ifhasclasstag>
public boolean add(<classname></classname> instance, <forallfields><ifhasfieldtag tagname="ref.model" paramname="name"> String <fieldtagvalue tagname="ref.model" paramname="name"></fieldtagvalue>pkid</ifhasfieldtag></forallfields>) {
// TODO Auto-generated method stub
<forallfields></forallfields>
<ifhasfieldtag tagname="ref.model" paramname="name"></ifhasfieldtag>
<fieldtype></fieldtype><fieldtagvalue tagname="ref.model" paramname="name"></fieldtagvalue>=this.<fieldtagvalue tagname="ref.model" paramname="name"></fieldtagvalue>dao.get(<fieldtagvalue tagname="ref.model" paramname="name"></fieldtagvalue>pkid);
if(<fieldtagvalue tagname="ref.model" paramname="name"></fieldtagvalue>==null){
return false;
}
instance.set<uppername value='<XDtField:fieldTagValue tagName="ref.model" paramName="name" />'></uppername>(<fieldtagvalue tagname="ref.model" paramname="name"></fieldtagvalue>);
return this.add(instance);
}
public boolean del(String pkid) {
// TODO Auto-generated method stub
<classname></classname> instance =this.get(pkid);
if(instance==null||instance.get<forallfields><ifhasfieldtag tagname="pkid"><uppername value="<XDtField:fieldName />"></uppername></ifhasfieldtag></forallfields>==null){
return false;
}
instance.set<forallfields><ifhasfieldtag tagname="del"><uppername value="<XDtField:fieldName />"></uppername></ifhasfieldtag></forallfields>(Constant.MODEL_DEL);
return this.template.update(instance);
}
public <classname></classname> get(String pkid) {
// TODO Auto-generated method stub
return (<classname></classname>)this.template.get(<classname></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("<classname></classname>","<forallfields><ifhasfieldtag tagname="del"><fieldname></fieldname></ifhasfieldtag></forallfields>" );
}else{
return this.template.getAll(<classname></classname>.class);
}
}
public boolean update(<classname></classname> instance) {
// TODO Auto-generated method stub
<ifhasclasstag tagname="hasRef"></ifhasclasstag>
<classname></classname> temp=this.get(instance.get<forallfields><ifhasfieldtag tagname="pkid"><uppername value="<XDtField:fieldName />"></uppername></ifhasfieldtag></forallfields>());
<forallfields></forallfields>
<ifhasfieldtag tagname="ref.model" paramname="name"></ifhasfieldtag>
if(instance.get<uppername value='<XDtField:fieldTagValue tagName="ref.model" paramName="name" />'></uppername>()==null){
instance.set<uppername value='<XDtField:fieldTagValue tagName="ref.model" paramName="name" />'></uppername>(temp.get<uppername value='<XDtField:fieldTagValue tagName="ref.model" paramName="name" />'></uppername>());
}
return this.template.update(instance);
}
}
这是个比较复杂的模版了,是
DAO
的具体实现,
在写这个模版的时候,我遇到了几个问题,
1
就是标签的嵌套,比如
<uppername value='<XDtField:fieldTagValue tagName="ref.model" paramName="name" />'></uppername>
,开始内部标签都使用转义符,结果搞不定,网上找没有任何相关的内容,后来直接在外层使用
’
(就象
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);
}
}
并在模版文件中使用
<tagdef namespace="Primitive" handler="com.my.xdoclet.customTags.UpperName"></tagdef>
来应用就直接能在模版文件中使用
<uppername></uppername>
来使用了,
下面是
bulid.xml
文件:
<?xml version="1.0" encoding="UTF-8"?>
<project><span style="FONT-SIZE: 10pt; COLOR: navy">name=</span><span style="FONT-SIZE: 10pt; COLOR: green">"xdocletExample"</span><span style="FONT-SIZE: 10pt; COLOR: navy">default=</span><span style="FONT-SIZE: 10pt; COLOR: green">"doall"</span><span style="FONT-SIZE: 10pt; COLOR: navy">basedir=</span><span style="FONT-SIZE: 10pt; COLOR: green">"."</span><span style="FONT-SIZE: 10pt; COLOR: navy">></span></project>
<property><span style="FONT-SIZE: 10pt; COLOR: navy">name=</span><span style="FONT-SIZE: 10pt; COLOR: green">"xdoclet.lib.dir"</span><span style="FONT-SIZE: 10pt; COLOR: navy">location=</span><span style="FONT-SIZE: 10pt; COLOR: green">"${basedir}/lib"</span><span style="FONT-SIZE: 10pt; COLOR: navy">/></span></property>
<property><span style="FONT-SIZE: 10pt; COLOR: navy">name=</span><span style="FONT-SIZE: 10pt; COLOR: green">"gen.src.dir"</span><span style="FONT-SIZE: 10pt; COLOR: navy">location=</span><span style="FONT-SIZE: 10pt; COLOR: green">"${basedir}/target"</span><span style="FONT-SIZE: 10pt; COLOR: navy">/></span></property>
<property><span style="FONT-SIZE: 10pt; COLOR: navy">name=</span><span style="FONT-SIZE: 10pt; COLOR: green">"src.dir"</span><span style="FONT-SIZE: 10pt; COLOR: navy">location=</span><span style="FONT-SIZE: 10pt; COLOR: green">"${basedir}/src"</span><span style="FONT-SIZE: 10pt; COLOR: navy">/></span></property>
<property><span style="FONT-SIZE: 10pt; COLOR: navy">name=</span><span style="FONT-SIZE: 10pt; COLOR: green">"template.dir"</span><span style="FONT-SIZE: 10pt; COLOR: navy">location=</span><span style="FONT-SIZE: 10pt; COLOR: green">"${basedir}/template"</span><span style="FONT-SIZE: 10pt; COLOR: navy">/></span></property>
<property><span style="FONT-SIZE: 10pt; COLOR: navy">name=</span><span style="FONT-SIZE: 10pt; COLOR: green">"customtag.dir"</span><span style="FONT-SIZE: 10pt; COLOR: navy">location=</span><span style="FONT-SIZE: 10pt; COLOR: green">"${basedir}/bin"</span><span style="FONT-SIZE: 10pt; COLOR: navy">/></span></property>
id="xdoclet.lib.path">
<fileset><span style="FONT-SIZE: 10pt; COLOR: navy">dir=</span><span style="FONT-SIZE: 10pt; COLOR: green">"${xdoclet.lib.dir}"</span><span style="FONT-SIZE: 10pt; COLOR: navy">includes=</span><span style="FONT-SIZE: 10pt; COLOR: green">"*.jar"</span><span style="FONT-SIZE: 10pt; COLOR: navy">/></span></fileset>
<taskdef><span style="FONT-SIZE: 10pt; COLOR: navy">name=</span><span style="FONT-SIZE: 10pt; COLOR: green">"xdoclet"</span><span style="FONT-SIZE: 10pt; COLOR: navy">classname=</span><span style="FONT-SIZE: 10pt; COLOR: green">"xdoclet.DocletTask"</span><span style="FONT-SIZE: 10pt; COLOR: navy">classpathref=</span><span style="FONT-SIZE: 10pt; COLOR: green">"xdoclet.lib.path"</span><span style="FONT-SIZE: 10pt; COLOR: navy">/></span><span style="FONT-SIZE: 10pt; COLOR: black"> </span></taskdef>
<target><span style="FONT-SIZE: 10pt; COLOR: navy">name=</span><span style="FONT-SIZE: 10pt; COLOR: green">"init"</span><span style="FONT-SIZE: 10pt; COLOR: navy">/></span></target>
<target><span style="FONT-SIZE: 10pt; COLOR: navy">name=</span><span style="FONT-SIZE: 10pt; COLOR: green">"daogener"</span><span style="FONT-SIZE: 10pt; COLOR: navy">depends=</span><span style="FONT-SIZE: 10pt; COLOR: green">"init"</span><span style="FONT-SIZE: 10pt; COLOR: navy">></span></target>
<xdoclet><span style="FONT-SIZE: 10pt; COLOR: navy">destdir=</span><span style="FONT-SIZE: 10pt; COLOR: green">"${gen.src.dir}"</span><span style="FONT-SIZE: 10pt; COLOR: navy">></span></xdoclet>
<fileset><span style="FONT-SIZE: 10pt; COLOR: navy">dir=</span><span style="FONT-SIZE: 10pt; COLOR: green">"${src.dir}"</span><span style="FONT-SIZE: 10pt; COLOR: navy">includes=</span><span style="FONT-SIZE: 10pt; COLOR: green">"**/*.java"</span><span style="FONT-SIZE: 10pt; COLOR: navy">/></span></fileset>
<template><span style="FONT-SIZE: 10pt; COLOR: navy">templateFile=</span><span style="FONT-SIZE: 10pt; COLOR: green">"${template.dir}/daointerface.xdt"</span><span style="FONT-SIZE: 10pt; COLOR: navy">acceptInterfaces=</span><span style="FONT-SIZE: 10pt; COLOR: green">"false"</span><span style="FONT-SIZE: 10pt; COLOR: navy">acceptAbstractClasses=</span><span style="FONT-SIZE: 10pt; COLOR: green">"false"</span><span style="FONT-SIZE: 10pt; COLOR: navy">destinationfile=</span><span style="FONT-SIZE: 10pt; COLOR: green">"{0}DAO.java"</span><span style="FONT-SIZE: 10pt; COLOR: navy">/></span></template>
<target><span style="FONT-SIZE: 10pt; COLOR: navy">name=</span><span style="FONT-SIZE: 10pt; COLOR: green">"daoimplgener"</span><span style="FONT-SIZE: 10pt; COLOR: navy">depends=</span><span style="FONT-SIZE: 10pt; COLOR: green">"init"</span><span style="FONT-SIZE: 10pt; COLOR: navy">></span></target>
<xdoclet><span style="FONT-SIZE: 10pt; COLOR: navy">destdir=</span><span style="FONT-SIZE: 10pt; COLOR: green">"${gen.src.dir}"</span><span style="FONT-SIZE: 10pt; COLOR: navy">></span></xdoclet>
<fileset><span style="FONT-SIZE: 10pt; COLOR: navy">dir=</span><span style="FONT-SIZE: 10pt; COLOR: green">"${src.dir}"</span><span style="FONT-SIZE: 10pt; COLOR: navy">includes=</span><span style="FONT-SIZE: 10pt; COLOR: green">"**/*.java"</span><span style="FONT-SIZE: 10pt; COLOR: navy">/></span></fileset>
<template><span style="FONT-SIZE: 10pt; COLOR: navy">templateFile=</span><span style="FONT-SIZE: 10pt; COLOR: green">"${template.dir}/daoimpl.xdt"</span><span style="FONT-SIZE: 10pt; COLOR: navy">acceptInterfaces=</span><span style="FONT-SIZE: 10pt; COLOR: green">"false"</span><span style="FONT-SIZE: 10pt; COLOR: navy">acceptAbstractClasses=</span><span style="FONT-SIZE: 10pt; COLOR: green">"false"</span><span style="FONT-SIZE: 10pt; COLOR: navy">destinationfile=</span><span style="FONT-SIZE: 10pt; COLOR: green">"{0}DAOImpl.java"</span><span style="FONT-SIZE: 10pt; COLOR: navy">/></span></template>
<target><span style="FONT-SIZE: 10pt; COLOR: navy">name=</span><span style="FONT-SIZE: 10pt; COLOR: green">"doall"</span><span style="FONT-SIZE: 10pt; COLOR: navy">depends=</span><span style="FONT-SIZE: 10pt; COLOR: green">"daogener,daoimplgener"</span><span style="FONT-SIZE: 10pt; COLOR: navy">/></span></target>
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,转载请保留作者声明!)