假设数据库表里面有两个时间字段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>源码。