使用Mybatis-Plus实现对象属性自动填充功能

简介: 使用Mybatis-Plus实现对象属性自动填充功能

   案例场景:在设计一张数据库表的时候,通常会包含下列信息: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  */@ComponentpublicclassDbrgMetaObjectHandlerimplementsMetaObjectHandler{
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) */@OverridepublicvoidinsertFill(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) */@OverridepublicvoidupdateFill(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  */@Setter@Getter@NoArgsConstructor@AllArgsConstructorpublicclassMpBaseEntityimplementsSerializable{
privatestaticfinallongserialVersionUID=2234596156219712753L;
/*** 创建人*/@TableField(value="create_by",fill=FieldFill.INSERT)
privateLongcreateBy;
/** 创建时间 */@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
@TableField(value="create_time",fill=FieldFill.INSERT)
privateDatecreateTime;
/*** 更新人*/@TableField(value="update_by",fill=FieldFill.INSERT_UPDATE)
privateLongupdateBy;
/*** 更新时间*/@TableField(value="update_time",fill=FieldFill.INSERT_UPDATE)
@JsonFormat(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@qq.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@qq.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@baomidou.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@baomidou.com(String), test(String), 1(Long)
c.b.s.m.mapper.UserMapper.updateById: <==Updates: 1

5、总结

使用mybatis-plus可以方便快速的进行属性自动填充,最大量的减轻大家的工作量,在你的项目中大胆采用吧,提升开发效率。

目录
相关文章
|
1月前
|
SQL Java 数据库连接
深入 MyBatis-Plus 插件:解锁高级数据库功能
Mybatis-Plus 提供了丰富的插件机制,这些插件可以帮助开发者更方便地扩展 Mybatis 的功能,提升开发效率、优化性能和实现一些常用的功能。
164 26
深入 MyBatis-Plus 插件:解锁高级数据库功能
|
23天前
|
SQL Java 数据库连接
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
MyBatis-Plus是一个MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。本文讲解了最新版MP的使用教程,包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段等核心功能。
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
|
2月前
|
Java 数据库连接 容器
Mybatis-Plus核心功能
Mybatis-Plus核心功能
|
3月前
|
SQL 存储 Java
原生JDBC简单实现Mybatis核心功能
本文介绍了在Vertx项目中使用Tdengine时,因缺乏异步JDBC驱动而采用同步驱动结合`vertx.executeBlocking`实现异步查询的方法。文中详细描述了自行开发的一个简易JDBC工具,该工具实现了SQL参数绑定与返回值映射至实体类的功能,简化了原生JDBC的繁琐操作。通过具体示例展示了其实现过程及代码细节,并与原生JDBC进行了对比,突显了其便捷性和实用性。
|
4月前
|
供应链 前端开发 Java
服装库存管理系统 Mybatis+Layui+MVC+JSP【完整功能介绍+实现详情+源码】
该博客文章介绍了一个使用Mybatis、Layui、MVC和JSP技术栈开发的服装库存管理系统,包括注册登录、权限管理、用户和货号管理、库存管理等功能,并提供了源码下载链接。
服装库存管理系统 Mybatis+Layui+MVC+JSP【完整功能介绍+实现详情+源码】
|
4月前
|
druid Java 数据库连接
SpringBoot项目整合MybatisPlus持久层框架+Druid数据库连接池,以及实现增删改查功能
SpringBoot项目整合MybatisPlus和Druid数据库连接池,实现基本的增删改查功能。
377 0
|
6月前
|
数据库
MyBatis-Plus如何自动填充数据表的创建时间和更新时间
MyBatis-Plus如何自动填充数据表的创建时间和更新时间
260 1
|
6月前
|
缓存 NoSQL Java
在 SSM 架构(Spring + SpringMVC + MyBatis)中,可以通过 Spring 的注解式缓存来实现 Redis 缓存功能
【6月更文挑战第18天】在SSM(Spring+SpringMVC+MyBatis)中集成Redis缓存,涉及以下步骤:添加Spring Boot的`spring-boot-starter-data-redis`依赖;配置Redis连接池(如JedisPoolConfig)和连接工厂;在Service层使用`@Cacheable`注解标记缓存方法,指定缓存名和键生成策略;最后,在主配置类启用缓存注解。通过这些步骤,可以利用Spring的注解实现Redis缓存。
80 2
|
6月前
|
Java 数据库连接 mybatis
MyBatisPlus分页功能制作未完
MyBatisPlus分页功能制作未完
|
6月前
|
SQL Java 数据库连接
MyBatis插件深度解析:功能、原理、使用、应用场景与最佳实践
MyBatis插件深度解析:功能、原理、使用、应用场景与最佳实践