easymybatis中字段自動填充

假設數據庫表裏面有兩個時間字段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類中有三個重寫方法:源碼

  • getColumnName() : 指定表字段名
  • getFillType() : 填充方式,FillType.INSERT:僅insert時填充;FillType.INSERT:insert,update時填充
  • getFillValue(String defaultValue) :返回填充內容。

而後在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>源碼。

相關文章
相關標籤/搜索