オブジェクト変更ログ
9134 ワード
回転:
http://hi.baidu.com/419848854/blog/item/4aef20de4464785a95ee37de.html
1.金融業務システムでは、現在のユーザーがどのフィールドを修正したか、修正前の値と修正後の値を記録する必要があります.業務要求が高い会社には非常に必要です.ここでは主に以下の解決策を説明します.
私が使っているフレームはSPRING 2+Struts 2+IBATISです.主にIBATISを選択してHIBERNATEを選択しない原因です.SQLを最適化しやすく、開発者が使いやすいです.SQLの配置が便利です.主にやはり詳しいログ記録解決案を更新します.
前期準備:
1.詳細ログを更新するIBATIS操作に対しては、IBATISが着信するパラメータはJava Beanでなければなりません.
ビーン類の注釈
まず、着信が必要なJavaBeanパラメータについて注釈情報を加える:
Dao層の添削操作を統一して一つの方法にします.
http://hi.baidu.com/419848854/blog/item/4aef20de4464785a95ee37de.html
1.金融業務システムでは、現在のユーザーがどのフィールドを修正したか、修正前の値と修正後の値を記録する必要があります.業務要求が高い会社には非常に必要です.ここでは主に以下の解決策を説明します.
私が使っているフレームはSPRING 2+Struts 2+IBATISです.主にIBATISを選択してHIBERNATEを選択しない原因です.SQLを最適化しやすく、開発者が使いやすいです.SQLの配置が便利です.主にやはり詳しいログ記録解決案を更新します.
前期準備:
1.詳細ログを更新するIBATIS操作に対しては、IBATISが着信するパラメータはJava Beanでなければなりません.
<statement id="updateRkItemTotal" parameterClass="com.datadriver.risk.po.RkItemTotal">
update s_baseinfo set fcode=#fcode#,
ITCODE=#itcode#,
ITSHORTNAME=#itshortname#
where S_ID=#sid#
</statement>
2.カスタムコメント:ビーン類の注釈
/**
* @author: zhengjianbo/Ram
* @Email: [email protected]
* @Company: DataDriver©2010/www.datadriver.com.cn
* @Action:
* @DATE: 2010-9-14- 07:47:46
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface BeanAnnotation
{
/**
* , Bean
*
* @return
*/
public String msg();
/**
*
*
* @return ibatis statement
*/
public String ps();
/**
* @return
*/
public String table();
}
Bean類元素の注釈/**
* @author: zhengjianbo/Ram
* @Email: [email protected]
* @Company: DataDriver©2010/www.datadriver.com.cn
* @Action: Bean
* @DATE: 2010-9-14- 07:53:10
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface FieldAnnotation
{
/**
*
*
* @return
*/
public String name();
/**
* @return
*/
public String column();
}
例えば、プロジェクト名の更新操作について詳しいログを記録したいなら、次のような仕事が必要です.まず、着信が必要なJavaBeanパラメータについて注釈情報を加える:
/**
* @author: zhengjianbo/Ram
* @Email:[email protected]
* @Company:DataDriver
* @Action:
* @DATE: 2010-4-3- 03:43:25
*/
@BeanAnnotation(msg=" ", table="S_BASEINFO", ps="common.getRkItemTotalToLog")
public class RkItemTotal implements java.io.Serializable
{
@FieldAnnotation(name=" ", column="ITCODE")
private String itcode;
@FieldAnnotation(name=" ", column="ITSHORTNAME")
private String itshortname;
private String orderstr;//
@FieldAnnotation(name=" ", column="FCODE")
private String fcode;
private long sid;//id
private long fcodel;
private int actiontype; // , , Bean
この中で主に記入する必要があるのは、ps(このパラメータは対応するIBATIS xmlファイルのstatement IDを記入する必要があります.このIDを通じてBeanエンティティに伝えられます.(Beanは修正後IBATISに渡すパラメータですが、その中のいずれかのキー要素はPSのstatementからこのデータを取得することができます.修正前の状態).<statement id="getRkItemTotalLog"
parameterClass="java.lang.Long" -- : java.lang.Long com.datadriver.risk.po.RkItemTotal, , Java Bean
resultClass="com.datadriver.risk.po.RkItemTotal">
SELECT fcode,fname as itshortname
from s_baseinfo
where fcode=#sid#
</statement>
準備が終わったら、私達はDao層の中で統一的に判断する必要があります.Dao層の添削操作を統一して一つの方法にします.
/**
*
*
* @param obj statement parameterClass
* @param action xml statement id
*
*/
void updateAttributeByPoJo(Object obj, String action){
getSqlMapClientTemplate().update(action, obj);//
}
サービス層では、実際の業務ニーズに応じて異なる操作方法を呼び出します.
/**
* @param obj
*/
void updateRkItemTotal(RkItemTotal obj){
commonDao.updateAttributeByPoJo(obj, "common.updateRkItemTotal");
}
私達の添削の方法があります.このようにすべての操作の種類に対して拡張しやすくなります.すべてを拡張することはできませんが、Java Beanに参加するactionyPoJoのように、Dao法では反射によってJava beanの元素値を取得できます. public void updateAttributeByPoJo(Object obj, String action)
{
int actionFlag=0;
if(obj!=null)
{
actionFlag=AnnotationUpdateType.getAction(obj);
}else
{
actionFlag=0;
}
DataDriverLog.log.info("actionFlag:"+actionFlag);
actiontype , Bean ,
/** , */
if(actionFlag==Configer.UPDATE)
{
//annotationLog=new AnnotationUpdateLogImpl();
// annotationLog.log(getSqlMapClientTemplate(), obj); , S_BASEINFO S_TYPE , 1 2.
getSqlMapClientTemplate().update(action, obj);//
return;
}
具体的には、Obj(更新するJavaBean)に基づいて更新前のデータを検索し、このBeanと比較し、主に反射機構によりBean及び要素情報を取得し、必要なフィールド情報、テーブル情報及びps(未更新前のデータを取得するIBATIS statemenID)を注釈方式で取得して比較する.主なクラスは以下の通りです/**
* @author: zhengjianbo/Ram
* @Email: [email protected]
* @Company: DataDriver©2010/www.datadriver.com.cn
* @Action: , ( )
* @DATE: 2010-9-25- 09:48:05
*/
public class AnnotationDataer
{
private Object t;
private Field[] fields;//
private Fielder[] fielders;//
private Class clazz;//
public Fielder[] getFielders()
{
this.fields=this.getFieldByObj();
this.fielders=new Fielder[this.fields.length];
for(int i=0; i<fields.length; i++)
{
this.fielders[i]=new Fielder();
this.fielders[i].setField(fields[i]);
this.fielders[i].setFieldname(this.fields[i].getName());
this.fielders[i].setObj(this.getFieldData(fields[i]));
}
return fielders;
}
public Field[] getFieldByObj()
{
return t.getClass().getDeclaredFields();//
}
/**
* @param field
* @return
* @throws Exception
*/
public Object getFieldData(Field field)
{
return this.getFieldDataByName(field.getName());
}
/**
* @param fieldName
* @return
*/
public Object getFieldDataByName(String fieldName){
try
{
PropertyDescriptor pd=new PropertyDescriptor(fieldName, this.getClazz());
Method getMethod=pd.getReadMethod();// get
Object o=getMethod.invoke(t);// get Object
DataDriverLog.log.debug(" "+fieldName+" :"+o+", :");
return o;
}catch(Exception e)
{
e.printStackTrace();
return null;
}
}
/**
* @return
*/
public BeanAnnotation getBeanAnnotation()
{
return t.getClass().getAnnotation(BeanAnnotation.class);
}
public Object getT()
{
return t;
}
public void setT(Object t)
{
this.t=t;
}
public Field[] getFields()
{
return fields;
}
public void setFields(Field[] fields)
{
this.fields=fields;
}
public Class getClazz()
{
clazz=this.getT().getClass();
return clazz;
}
public void setClazz(Class clazz)
{
this.clazz=clazz;
}
public void setFielders(Fielder[] fielders)
{
this.fielders=fielders;
}
}
public void log(SqlMapClientTemplate template, Object obj)
{
List<Loger> logList=new ArrayList<Loger>();
AnnotationDataer annotationDataer=new AnnotationDataer();
annotationDataer.setT(obj);
BeanAnnotation beanAnnotation=annotationDataer.getBeanAnnotation();
String table=beanAnnotation.table();//
Object oldObj=template.queryForObject(beanAnnotation.ps(), obj);//
AnnotationDataer oldAnnotationDataer=new AnnotationDataer();
oldAnnotationDataer.setT(oldObj);
Fielder[] fielders=annotationDataer.getFielders();
/*****************************************
*
****************************************/
for(Fielder fielder : fielders)
{
String fieldname=fielder.getFieldname();// ( )
FieldAnnotation fieldAnnotation=fielder.getFieldAnnotation(fielder
.getField());
Object dataObj=fielder.getObj();
if(fieldAnnotation!=null)
{
Object oldDataObj=oldAnnotationDataer
.getFieldDataByName(fieldname);//
/** * */
if(dataObj!=null)
{
if(!(dataObj+"").equals(oldDataObj+""))
{
Loger loger=new Loger();
loger.setTable(table);
loger.setColumn(fieldAnnotation.column());
loger.setSold(oldDataObj+"");
loger.setSnew(dataObj+"");
// loger.setTuser(UserSession.get("").toString());
logList.add(loger);
}
}
}
}