使用Mybatis-Plus實(shí)現(xiàn)對象屬性自動填充功能
案例場景:在設(shè)計一張數(shù)據(jù)庫表的時候,通常會包含下列信息:createBy(創(chuàng)建人)、createTime(創(chuàng)建時間)、updateBy(修改人)、updateTime(修改時間)、otherinfo(其它屬性信息)。
在一般的業(yè)務(wù)邏輯編寫過程中,絕大多數(shù)的開發(fā)工程師都選擇根據(jù)操作類型(insert/update)來依次調(diào)用對應(yīng)的setXXX方法來設(shè)置值。使用setXXX并不是不能達(dá)到預(yù)期,只是代碼實(shí)現(xiàn)起來不叫臃腫,而這些字段幾乎是通用的字段,是否有統(tǒng)一的方式進(jìn)行設(shè)置呢?
下面以實(shí)例的方式告訴大家,如何基于Mybatis-Plus實(shí)現(xiàn)固定列自動填充,讓你的工作效率提升。
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、自定義自己的原對象屬性填充器,自定義類實(shí)現(xiàn)MetaObjectHandler,代碼如下:
/**
* Copyright ? 2019 DBRG. All rights reserved.
*
* @Title: DbrgMetaObjectHandler.java
* @Prject: syswms
* @Package: com.dbrg.project.handler
* @version: V1.0
*/
package com.dbrg.project.handler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.dbrg.common.utils.DateUtils;
import com.dbrg.common.utils.security.ShiroUtils;
/**
* @ClassName: DbrgMetaObjectHandler
* @Description:元對象自動填充處理器
* @author: yelangking
* @date: 2019年3月4日 上午9:14:18
*/
@Component
public class DbrgMetaObjectHandler implements MetaObjectHandler{
private static final String CREATE_BY_FIELD_NAME = "createBy";
private static final String CREATE_TIME_FIELD_NAME = "createTime";
private static final String UPDATE_BY_FIELD_NAME = "updateBy";
private static final String UPDATE_TIME_FIELD_NAME = "updateTime";
/* (non Javadoc)
* @Title: insertFill
* @Description: {簡單描述}
* @param arg0
* @see com.baomidou.mybatisplus.core.handlers.MetaObjectHandler#insertFill(org.apache.ibatis.reflection.MetaObject)
*/
@Override
public void insertFill(MetaObject metaObject) {
//1、自動設(shè)置創(chuàng)建人信息,當(dāng)外部接口調(diào)用時,用戶可能為空
if(null != ShiroUtils.getSysUser()){
this.setFieldValByName(CREATE_BY_FIELD_NAME,ShiroUtils.getUserId(),metaObject);
}
//2、自動設(shè)置創(chuàng)建時間
this.setFieldValByName(CREATE_TIME_FIELD_NAME, DateUtils.getNowDate(), metaObject);
//3、自動設(shè)置更新人信息,當(dāng)外部接口調(diào)用時,用戶可能為空
if(null != ShiroUtils.getSysUser()){
this.setFieldValByName(UPDATE_BY_FIELD_NAME,ShiroUtils.getUserId(),metaObject);
}
//4、自動設(shè)置更新時間
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)
*/
@Override
public void updateFill(MetaObject metaObject) {
//1、自動設(shè)置更新人信息,當(dāng)外部接口調(diào)用時,用戶可能為空
if(null != ShiroUtils.getSysUser()){
this.setFieldValByName(UPDATE_BY_FIELD_NAME,ShiroUtils.getUserId(),metaObject);
}
//2、自動設(shè)置更新時間
this.setFieldValByName(UPDATE_TIME_FIELD_NAME, DateUtils.getNowDate(), metaObject);
}
}以上代碼實(shí)現(xiàn)了自定義的設(shè)置入口,分別定義了在insert和update時設(shè)置哪些屬性的值,程序?qū)嶋H運(yùn)行時會根據(jù)不同的操作類型設(shè)置相應(yīng)的值。
3、在實(shí)體類上注入設(shè)置填充規(guī)則,代碼如下:
/**
* Copyright ? 2019 DBRG. All rights reserved.
*
* @Title: MpBaseEntity.java
* @Prject: syswms
* @Package: com.dbrg.framework.web.domain
* @version: V1.0
*/
package com.dbrg.framework.web.domain;
import java.io.Serializable;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
/**
* @ClassName: MpBaseEntity
* @Description:mybatis plus 自動注入基類,結(jié)合FieledFill策略類一起使用,
* 默認(rèn)包含創(chuàng)建人、創(chuàng)建時間、更新人、更新時間信息,業(yè)務(wù)表單中包含此字段的集成本類即可。如無明確要求,可不做任何處理。
* @author: yelangking
* @date: 2019年3月4日 上午9:03:12
*/
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class MpBaseEntity implements Serializable{
private static final long serialVersionUID = 2234596156219712753L;
/**
* 創(chuàng)建人
*/
@TableField(value="create_by",fill=FieldFill.INSERT)
private Long createBy;
/** 創(chuàng)建時間 */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@TableField(value="create_time",fill=FieldFill.INSERT)
private Date createTime;
/**
* 更新人
*/
@TableField(value="update_by",fill=FieldFill.INSERT_UPDATE)
private Long updateBy;
/**
* 更新時間
*/
@TableField(value="update_time",fill=FieldFill.INSERT_UPDATE)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
}關(guān)鍵代碼:
@TableField(value="update_time",fill=FieldFill.INSERT_UPDATE),在對象的屬性上設(shè)置填充規(guī)則即可。
4、運(yùn)行效果,參考官網(wǎng)運(yùn)行結(jié)果。
c.b.samples.metainfo.AutoFillTest : Started AutoFillTest in 9.239 seconds (JVM running for 17.064) c.b.s.m.handler.MyMetaObjectHandler: start insert fill .... c.b.s.metainfo.mapper.UserMapper.insert: ==> Preparing: INSERT INTO user ( 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: 1 c.b.s.m.mapper.UserMapper.selectById: ==> Preparing: SELECT ID,NAME,AGE,EMAIL,OPERATOR FROM user WHERE ID=? c.b.s.m.mapper.UserMapper.selectById: ==> Parameters: 1381223322590720001(Long) c.b.s.m.mapper.UserMapper.selectById: <== Total: 1 c.b.samples.metainfo.AutoFillTest: query user:User(id=1381223322590720001, name=Tom, age=1, email=tom@qq.com, operator=Jetty) c.b.s.m.mapper.UserMapper.selectById: ==> Preparing: SELECT ID,NAME,AGE,EMAIL,OPERATOR FROM user WHERE ID=? c.b.s.m.mapper.UserMapper.selectById: ==> Parameters: 1(Long) c.b.s.m.mapper.UserMapper.selectById: <== Total: 1 c.b.samples.metainfo.AutoFillTest: before user:User(id=1, name=Jone, age=18, email=test1@baomidou.com, operator=test) c.b.s.m.handler.MyMetaObjectHandler : start update fill .... c.b.s.m.mapper.UserMapper.updateById: ==> Preparing: UPDATE user SET NAME=?, AGE=?, EMAIL=?, OPERATOR=? WHERE ID=? 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可以方便快速的進(jìn)行屬性自動填充,最大量的減輕大家的工作量,在你的項目中大膽采用吧,提升開發(fā)效率。歡迎添加公眾號交流。
以上就是使用Mybatis-Plus實(shí)現(xiàn)對象屬性自動填充功能的詳細(xì)內(nèi)容,更多關(guān)于Mybatis-Plus對象屬性自動填充的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
mybatis-plus實(shí)現(xiàn)打印完整sql語句
這篇文章主要介紹了mybatis-plus實(shí)現(xiàn)打印完整sql語句方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07
在SpringBoot框架下實(shí)現(xiàn)Excel導(dǎo)入導(dǎo)出的方法詳解
SpringBoot是由Pivotal團(tuán)隊提供的全新框架,其設(shè)計目的是用來簡化新Spring應(yīng)用的初始搭建以及開發(fā)過程,今天我們就使用純前對按表格控件帶大家了解,如何在Spring Boot框架下實(shí)現(xiàn)Excel服務(wù)端導(dǎo)入導(dǎo)出,需要的朋友可以參考下2023-06-06
mybatis的動態(tài)SQL和模糊查詢實(shí)例詳解
這篇文章主要給大家介紹了關(guān)于mybatis的動態(tài)SQL和模糊查詢的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
PowerJob的IdGenerateService工作流程源碼解讀
這篇文章主要為大家介紹了PowerJob的IdGenerateService工作流程源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
Spring Boot使用Servlet及Filter過程詳解
這篇文章主要介紹了Spring Boot使用Servlet及Filter過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-07-07
Springboot定時任務(wù)Scheduled重復(fù)執(zhí)行操作
這篇文章主要介紹了Springboot定時任務(wù)Scheduled重復(fù)執(zhí)行操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09

