オブジェクト変更ログ

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でなければなりません.
<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);
}
}
}
}