案例场景:在设计一张数据库表的时候,通常会包含下列信息:createBy(创建人)、createTime(创建时间)、updateBy(修改人)、updateTime(修改时间)、otherinfo(其它属性信息)。
在一般的业务逻辑编写过程中,绝大多数的开发工程师都选择根据操作类型(insert/update)来依次调用对应的setXXX方法来设置值。使用setXXX并不是不能达到预期,只是代码实现起来不叫臃肿,而这些字段几乎是通用的字段,是否有统一的方式进行设置呢?
下面以实例的方式告诉大家,如何基于Mybatis-Plus实现固定列自动填充,让你的工作效率提升。
1、引用Mybatis-plus
<dependencies><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.0.6</version></dependency><dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><scope>runtime</scope></dependency></dependencies>
2、自定义自己的原对象属性填充器
自定义类实现MetaObjectHandler,关键代码如下:
/** * Copyright © 2019 DBRG. All rights reserved.* * @Title: DbrgMetaObjectHandler.java * @Prject: syswms* @Package: com.dbrg.project.handler * @version: V1.0 */packagecom.dbrg.project.handler; importorg.apache.ibatis.reflection.MetaObject; importorg.springframework.stereotype.Component; importcom.baomidou.mybatisplus.core.handlers.MetaObjectHandler; importcom.dbrg.common.utils.DateUtils; importcom.dbrg.common.utils.security.ShiroUtils; /** * @ClassName: DbrgMetaObjectHandler * @Description:元对象自动填充处理器* @author: yelangking* @date: 2019年3月4日 上午9:14:18 */publicclassDbrgMetaObjectHandlerimplementsMetaObjectHandler{ privatestaticfinalStringCREATE_BY_FIELD_NAME="createBy"; privatestaticfinalStringCREATE_TIME_FIELD_NAME="createTime"; privatestaticfinalStringUPDATE_BY_FIELD_NAME="updateBy"; privatestaticfinalStringUPDATE_TIME_FIELD_NAME="updateTime"; /* (non Javadoc) * @Title: insertFill* @Description: {简单描述}* @param arg0 * @see com.baomidou.mybatisplus.core.handlers.MetaObjectHandler#insertFill(org.apache.ibatis.reflection.MetaObject) */publicvoidinsertFill(MetaObjectmetaObject) { //1、自动设置创建人信息,当外部接口调用时,用户可能为空if(null!=ShiroUtils.getSysUser()){ this.setFieldValByName(CREATE_BY_FIELD_NAME,ShiroUtils.getUserId(),metaObject); } //2、自动设置创建时间this.setFieldValByName(CREATE_TIME_FIELD_NAME, DateUtils.getNowDate(), metaObject); //3、自动设置更新人信息,当外部接口调用时,用户可能为空if(null!=ShiroUtils.getSysUser()){ this.setFieldValByName(UPDATE_BY_FIELD_NAME,ShiroUtils.getUserId(),metaObject); } //4、自动设置更新时间this.setFieldValByName(UPDATE_TIME_FIELD_NAME, DateUtils.getNowDate(), metaObject); } /* (non Javadoc) * @Title: updateFill* @Description: {简单描述}* @param arg0 * @see com.baomidou.mybatisplus.core.handlers.MetaObjectHandler#updateFill(org.apache.ibatis.reflection.MetaObject) */publicvoidupdateFill(MetaObjectmetaObject) { //1、自动设置更新人信息,当外部接口调用时,用户可能为空if(null!=ShiroUtils.getSysUser()){ this.setFieldValByName(UPDATE_BY_FIELD_NAME,ShiroUtils.getUserId(),metaObject); } //2、自动设置更新时间this.setFieldValByName(UPDATE_TIME_FIELD_NAME, DateUtils.getNowDate(), metaObject); } }
以上代码实现了自定义的设置入口,分别定义了在insert和update时设置哪些属性的值,程序实际运行时会根据不同的操作类型设置相应的值。
3、在实体类上注入设置填充规则
关键代码如下:
/** * Copyright © 2019 DBRG. All rights reserved.* * @Title: MpBaseEntity.java * @Prject: syswms* @Package: com.dbrg.framework.web.domain * @version: V1.0 */packagecom.dbrg.framework.web.domain; importjava.io.Serializable; importjava.util.Date; importcom.baomidou.mybatisplus.annotation.FieldFill; importcom.baomidou.mybatisplus.annotation.TableField; importcom.fasterxml.jackson.annotation.JsonFormat; importlombok.AllArgsConstructor; importlombok.Getter; importlombok.NoArgsConstructor; importlombok.Setter; /** * @ClassName: MpBaseEntity * @Description:mybatis plus 自动注入基类,结合FieledFill策略类一起使用,* 默认包含创建人、创建时间、更新人、更新时间信息,业务表单中包含此字段的集成本类即可。如无明确要求,可不做任何处理。* @author: yelangking* @date: 2019年3月4日 上午9:03:12 */publicclassMpBaseEntityimplementsSerializable{ privatestaticfinallongserialVersionUID=2234596156219712753L; /*** 创建人*/value="create_by",fill=FieldFill.INSERT) (privateLongcreateBy; /** 创建时间 */pattern="yyyy-MM-dd HH:mm:ss") (value="create_time",fill=FieldFill.INSERT) (privateDatecreateTime; /*** 更新人*/value="update_by",fill=FieldFill.INSERT_UPDATE) (privateLongupdateBy; /*** 更新时间*/value="update_time",fill=FieldFill.INSERT_UPDATE) (pattern="yyyy-MM-dd HH:mm:ss") (privateDateupdateTime; }
关键代码:
@TableField(value="update_time",fill=FieldFill.INSERT_UPDATE),在对象的属性上设置填充规则即可。
4、运行效果
参考官网运行结果。
c.b.samples.metainfo.AutoFillTest : StartedAutoFillTestin9.239seconds (JVMrunningfor17.064) c.b.s.m.handler.MyMetaObjectHandler: startinsertfill .... c.b.s.metainfo.mapper.UserMapper.insert: ==>Preparing: INSERTINTOuser ( ID, NAME, AGE, EMAIL, OPERATOR ) VALUES ( ?, ?, ?, ?, ? ) c.b.s.metainfo.mapper.UserMapper.insert: ==>Parameters: 1381223322590720001(Long), Tom(String), 1(Integer), tom .com(String), Jetty(String) c.b.s.metainfo.mapper.UserMapper.insert: <==Updates: 1c.b.s.m.mapper.UserMapper.selectById: ==>Preparing: SELECTID,NAME,AGE,EMAIL,OPERATORFROMuserWHEREID=?c.b.s.m.mapper.UserMapper.selectById: ==>Parameters: 1381223322590720001(Long) c.b.s.m.mapper.UserMapper.selectById: <==Total: 1c.b.samples.metainfo.AutoFillTest: queryuser:User(id=1381223322590720001, name=Tom, age=1, email=tom .com, operator=Jetty) c.b.s.m.mapper.UserMapper.selectById: ==>Preparing: SELECTID,NAME,AGE,EMAIL,OPERATORFROMuserWHEREID=?c.b.s.m.mapper.UserMapper.selectById: ==>Parameters: 1(Long) c.b.s.m.mapper.UserMapper.selectById: <==Total: 1c.b.samples.metainfo.AutoFillTest: beforeuser:User(id=1, name=Jone, age=18, email=test1 .com, operator=test) c.b.s.m.handler.MyMetaObjectHandler : startupdatefill .... c.b.s.m.mapper.UserMapper.updateById: ==>Preparing: UPDATEuserSETNAME=?, AGE=?, EMAIL=?, OPERATOR=?WHEREID=?c.b.s.m.mapper.UserMapper.updateById: ==>Parameters: Jone(String), 12(Integer), test1 .com(String), test(String), 1(Long) c.b.s.m.mapper.UserMapper.updateById: <==Updates: 1
5、总结
使用mybatis-plus可以方便快速的进行属性自动填充,最大量的减轻大家的工作量,在你的项目中大胆采用吧,提升开发效率。