假設數據庫表裏面有兩個時間字段gmt_create,gmt_update。數據庫
當進行insert操做時gmt_create,gmt_update字段須要更新。當update時,gmt_update字段須要更新。mybatis
一般的作法是經過Entity手動設置:ide
User user = new User(); user.setGmtCreate(new Date()); user.setGmtUpdate(new Date());
由於表設計的時候大部分都有這兩個字段,因此對每張表都進行手動設置的話很容易錯加、漏加。 easymybatis提供了兩個輔助類DateFillInsert和DateFillUpdate,用來處理添加修改時的時間字段自動填充。配置了這兩個類以後,時間字段將會自動設置。設計
配置方式以下:code
EasymybatisConfig config = new EasymybatisConfig(); config.setFills(Arrays.asList( new DateFillInsert() ,new DateFillUpdate() ));
若是要指定字段名,能夠寫成:繼承
new DateFillInsert("add_time")
除了使用easymybatis默認提供的填充以外,咱們還能夠自定義填充。ci
自定義填充類要繼承FillHandler<T>類。 <T> 表示填充字段類型,如Date,String,BigDecimal,Boolean。rem
如今有個remark字段,須要在insert時初始化爲「備註默認內容」,新建一個StringRemarkFill類以下:get
public class StringRemarkFill extends FillHandler<String> { @Override public String getColumnName() { return "remark"; } @Override public FillType getFillType() { return FillType.INSERT; } @Override protected Object getFillValue(String defaultValue) { return "備註默認內容"; } }
StringRemarkFill類中有三個重寫方法:源碼
而後在easymybatisConfig中添加
config.setFills(Arrays.asList( new DateFillInsert() ,new DateFillUpdate() ,new StringRemarkFill() ));
這樣就配置完畢了,調用dao.save(user);時會自動填充remark字段。
上面說到StringRemarkFill填充器,它做用在全部實體類上,也就是說實體類若是有remark字段都會自動填充。這樣顯然是不合理的,解決辦法是指定特定的實體類。只要重寫FillHandler類的getTargetEntityClasses()方法便可。
@Override public Class<?>[] getTargetEntityClasses() { return new Class<?>[] { TUser.class }; }
這樣就表示做用在TUser類上,多個類能夠追加。最終代碼以下:
public class StringRemarkFill extends FillHandler<String> { @Override public String getColumnName() { return "remark"; } @Override public Class<?>[] getTargetEntityClasses() { return new Class<?>[] { TUser.class }; // 只做用在TUser類上 } @Override public FillType getFillType() { return FillType.INSERT; } @Override protected Object getFillValue(String defaultValue) { return "備註默認內容"; // insert時填充的內容 } }
關於自動填充的原理是基於mybatis的TypeHandler實現的,這裏就很少作介紹了。感興趣的同窗能夠查看FillHandler<T>源碼。