前言
我们会发现CRUD操作中,我们有大量的公共字段需要去更新,例如createTime、createUser等这些字段,在上一篇文章介绍中MybatisPlus(一):注解实现update,insert,delete操作自动填充createTime等字段(有需要的可以参考下),我们通过官方提供的方式来实现了CRUD的时候一些公共值的自动填充,这样会有一个麻烦之处就是每次创建实例的时候我们都需要加上相应的注解,略有繁琐。这里我们通过自定义一个IService来继承MybatisPlus的基类来实现CRUD的时候值填充。
一、IService
我们通过观察IService会发现里面提供了大量的CRUD等操作来方便我们的一些基本开发操作,这里以Save操作为例,有兴趣的可以自行去研究源码。
public interface IService<T> {
/**
* 默认批次提交数量
*/
int DEFAULT_BATCH_SIZE = 1000;
/**
* 插入一条记录(选择字段,策略插入)
*
* @param entity 实体对象
*/
default boolean save(T entity) {
return SqlHelper.retBool(getBaseMapper().insert(entity));
}
........................................
二、自定义BaseService
自定BaseService继承IService接口,在这里需要注意:我们需要让泛型 继承 Object类(这里代指需要更新公共字段类)用来约束泛型一定是Object或者Object的子类。在重写的方法中进行公共字段的填充。如下:
public interface BaseService<T extends BaseEntity> extends IService<T> {
@Override
default boolean save(T entity) {
entity.setCreateUser("测试");
entity.setCreateTime(new Date());
return IService.super.save(entity);
}
}
三、创建BaseEntity
这里只有两个字段用作记录,可根据需求自行定义。
@Data
public class BaseEntity{
private Date createTime;
private String createUser;
}
四、实体类继承BasseEntity
public class Test extends BaseEntity{
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
private String username;
private Integer age;
}
到此处完成,我们来进行测试一下
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2022bd2f] was not registered for synchronization because synchronization is not active
JDBC Connection [HikariProxyConnection@786777947 wrapping com.mysql.cj.jdbc.ConnectionImpl@374a9d71] will not be managed by Spring
==> Preparing: INSERT INTO csdn_test ( username, age, create_time, create_user ) VALUES ( ?, ?, ?, ? )
==> Parameters: 张san(String), 18(Integer), 2021-04-09 17:13:06.645(Timestamp), 测试(String)
<== Updates: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2022bd2f]
我们再来看一下数据库信息
到这里,基本实现已经完成,如果您发现有更好的方式或错误还恳请指正,再次感谢!