數(shù)據(jù)庫字段修改日志工具類

經(jīng)常會遇到一些管理后臺,需要詳細的記錄每次操作更新的內(nèi)容,具體到字段扇丛,以及修改前修改后的內(nèi)容;

利用反射寫了一個通用工具類

定義一個簡單的PO:

@Data
@NoArgsConstructor
public class SimplePO {

    @Record(name = "唯一鍵")
    private Integer id;

    @Record(name = "名字")
    private String name;

    @Record(isRecord = false)
    private String desc;
}

字段注解尉辑,能夠有針對性的記錄字段內(nèi)容:

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Record {

    boolean isRecord() default true;
    String name() default "";
}

工具類:

public class RecordUtil<T> {

    public String record(Class<T> clazz,T newObj,T oldObj) throws IllegalAccessException {

        if(oldObj.equals(newObj)){
            return "";

        }
        StringBuffer sb = new StringBuffer();

        Field[] fields = clazz.getDeclaredFields();

        for(Field field : fields){
            field.setAccessible(true);
            boolean isHasAnnotation = field.isAnnotationPresent(Record.class);
            if( !isHasAnnotation ){
                continue;
            }
            Record  record =  field.getAnnotation(Record.class);
            if(!record.isRecord()){
              continue;
            }
            if(field.get(oldObj) == field.get(newObj)){
                continue;
            }

            if(field.get(oldObj) != null){
                String oldValue = String.valueOf(field.get(oldObj));
                String newValue = String.valueOf(field.get(newObj));

                String name = record.name();
                String fieldName = field.getName();

                if( !oldValue.equalsIgnoreCase(newValue)){
                    sb.append(name).append("(").append(fieldName).append(")").append("修改前:").append(oldValue).
                            append(" 修改后:").append(newValue).append("\n");
                }
            }else {
                String newValue = String.valueOf(field.get(newObj));

                String name = record.name();
                String fieldName = field.getName();

                sb.append(name).append("(").append(fieldName).append(")").append("修改前:").append("null").
                        append(" 修改后:").append(newValue).append("\n");

            }
        }

        System.out.printf(sb.toString());

        return sb.toString();
    }

測試用例:

 public static void main(String[] args) {
        try {
            SimplePO newPO = new SimplePO();
            newPO.setId(1);
            newPO.setName("測試");
            newPO.setDesc("星期一");

            SimplePO oldPO = new SimplePO();
            oldPO.setId(2);
            oldPO.setName("上線");
            oldPO.setDesc("星期二");
            System.out.printf("test");
            RecordUtil<SimplePO> recordUtil = new RecordUtil<>();

            recordUtil.record(SimplePO.class,newPO,oldPO);
            System.out.printf("執(zhí)行到這了");
        } catch (Exception e) {
            e.printStackTrace();
        }


    }

測試結(jié)果:

唯一鍵(id)修改前:2 修改后:1
名字(name)修改前:上線 修改后:測試
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末帆精,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子隧魄,更是在濱河造成了極大的恐慌卓练,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件购啄,死亡現(xiàn)場離奇詭異襟企,居然都是意外死亡,警方通過查閱死者的電腦和手機狮含,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門顽悼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來爪幻,“玉大人桩警,你說我怎么就攤上這事崇摄〗跻啵” “怎么了疲陕?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵阅悍,是天一觀的道長翻具。 經(jīng)常有香客問我峰锁,道長解孙,這世上最難降的妖魔是什么坑填? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任抛人,我火速辦了婚禮,結(jié)果婚禮上脐瑰,老公的妹妹穿的比我還像新娘函匕。我一直安慰自己,他們只是感情好蚪黑,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布盅惜。 她就那樣靜靜地躺著,像睡著了一般忌穿。 火紅的嫁衣襯著肌膚如雪抒寂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天掠剑,我揣著相機與錄音屈芜,去河邊找鬼。 笑死朴译,一個胖子當著我的面吹牛井佑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播眠寿,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼躬翁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了盯拱?” 一聲冷哼從身側(cè)響起盒发,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎狡逢,沒想到半個月后宁舰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡奢浑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年蛮艰,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雀彼。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡壤蚜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出详羡,到底是詐尸還是另有隱情仍律,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布实柠,位于F島的核電站,受9級特大地震影響善涨,放射性物質(zhì)發(fā)生泄漏窒盐。R本人自食惡果不足惜草则,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蟹漓。 院中可真熱鬧炕横,春花似錦、人聲如沸葡粒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嗽交。三九已至卿嘲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間夫壁,已是汗流浹背拾枣。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留盒让,地道東北人梅肤。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像邑茄,于是被迫代替她去往敵國和親姨蝴。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 在一個方法內(nèi)部定義的變量都存儲在棧中肺缕,當這個函數(shù)運行結(jié)束后似扔,其對應(yīng)的棧就會被回收,此時搓谆,在其方法體中定義的變量將不...
    Y了個J閱讀 4,413評論 1 14
  • 面向?qū)ο缶幊蹋∣OP) 在前面的章節(jié)中泉手,我們學習了Kotlin的語言基礎(chǔ)知識黔寇、類型系統(tǒng)、集合類以及泛型相關(guān)的知識斩萌。...
    Tenderness4閱讀 4,419評論 1 6
  • 一 林小詩又開始習慣性失眠缝裤,這種情況是從她有了新的男朋友開始。 她的新男友是個警察颊郎,上電視要打馬賽克的那種憋飞,所以林...
    墨跡不是磨嘰閱讀 332評論 0 1