mybatisplus修改某个字段_mybatis-plus 通用字段自动化(如逻辑删除和更新时间等)

本文介绍了mybatis-plus如何实现逻辑删除和通用字段自动化填充,包括配置全局逻辑删除字段,实体类添加@TableLogic注解,以及通过@TableField注解和MetaObjectHandler实现字段自动填充,简化代码开发。
摘要由CSDN通过智能技术生成

一般来说某些项目比较规范的情况下,大多数表都会有逻辑删除字段和通用字段,例如更新时间,创建时间,更新人,创建人等等,但是在代码开发上会产生很多冗余的代码,逻辑删除的话,自己写比较繁琐,而且容易有遗漏逻辑。

本来打算自己写切面去实现,偶然发现mybatis-plus已经帮封装实现了,试了一下,很好用,所以分享一下。

逻辑删除

逻辑删除的意思就是某些业务表,在用户删除某条数据的时候,不真正删除,而是将此数据某字段改成类似“已删除”,而查询语句、更新语句等会忽略此条被逻辑删除的数据。

这里就不多介绍mybatis-plus的基础使用了,没接触过的小伙伴可以去官网研究一下,都是中文,很好看懂。

贴一下我们mybatis-plus的pom依赖:

com.baomidou

mybatis-plus-boot-starter

3.4.0

com.baomidou

mybatis-plus-generator

3.4.0

org.apache.velocity

velocity-engine-core

2.1

逻辑删除比较简单,在3.3版本之后只要两步:

1.在配置文件中加入:

mybatis-plus:

global-config:

db-config:

logic-delete-field: deleted # 全局逻辑删除的实体字段名

logic-delete-value: 1 # 逻辑已删除值(默认为 1)

logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)

这里的deleted就是数据库表中表示逻辑删除与否的字段名,一般都是tinyint或者boolean,如果是boolean,logic-delete-value和logic-not-delete-value设置成true和false就行。

2.实体类字段上加上@TableLogic注解

@TableLogic

private Boolean deleted;

当然,一般自动生成的entity一般不建议做改动,因为entity和mapper经常会重新生成,这样加的代码就消失了,这里我们修改mybatis-plus代码生成器中的一个配置实现:

StrategyConfig strategy = new StrategyConfig();

// 省略命名规范、entity模式等其他配置

strategy.setLogicDeleteFieldName("deleted");

这里deleted同样是表字段名,而不是生成的类字段名。

加了这段配置后,自动生成的entity就会带有@TableLogic注解了。

在使用了封装化的逻辑删除后,mybatis-plus就能帮我们实现:

调用mapper.delete类方法后,不删除对应的记录,而是将匹配到的记录的逻辑删除字段设置为我们设定的logic-delete-value值。

调用查询语句包括selectList、selectById等语句或者更新语句时,会自动拼上逻辑删除字段的查询条件,达到不会查询出已逻辑删除的记录

通用字段自动化填充

如果说项目要求表设计上需要有一些通用字段,比如我现在做的项目每个主体表都需要有创建时间、更新时间、创建人、更新人这四个字段,mybatis-plus可以帮我们自动填充这四个字段,而不需要我们自己修改。

当然,这四个字段的获取逻辑必须是有通用方式的。

1.@TableField注解

@TableField(fill = FieldFill.INSERT)

private LocalDateTime createTime;

@TableField(fill = FieldFill.UPDATE)

private LocalDateTime updateTime;

这里只是一个例子,FieldFill.INSERT表示在执行insert类方法时会自动填充此字段,FieldFill.UPDATE是在执行update类方法时会自动填充此字段,除此之外还有FieldFill.INSERT_UPDATE表示插入和更新时都会填充。

当然,和逻辑删除一样,我们不会手动去加这个注解,还是依赖代码生成器的配置:

// 和逻辑删除一样的StrategyConfig,不要重复写

StrategyConfig strategy = new StrategyConfig();

// 省略命名规范、entity模式等其他配置

List tableFillList = new ArrayList<>();

tableFillList.add(new TableFill("create_time", FieldFill.INSERT));

tableFillList.add(new TableFill("create_user", FieldFill.INSERT));

tableFillList.add(new TableFill("update_time", FieldFill.UPDATE));

tableFillList.add(new TableFill("update_user", FieldFill.UPDATE));

strategy.setTableFillList(tableFillList);

这里的create_time、create_user等是表里的字段名,当mybatis-plus检测到表里有这些字段时,生成的entity会自动加上对应的@TableField注解。

2.自动填充处理类

@Component

public class MybatisPlusMetaFillHandler implements MetaObjectHandler {

@Override

public void insertFill(MetaObject metaObject) {

this.strictInsertFill(metaObject, "createTime", LocalDateTime::now, LocalDateTime.class);

this.strictInsertFill(metaObject,"createUser",

()-> {

try{

//这里是我自己项目获取当前session用户id的方法

return Long.parseLong(UserContext.getUserInfo().get().getUserId());

}catch(Exception ignored){

}

return null;

}, Long.class);

}

@Override

public void updateFill(MetaObject metaObject) {

this.strictUpdateFill(metaObject, "updateTime", LocalDateTime::now, LocalDateTime.class);

this.strictUpdateFill(metaObject,"updateUser",

()-> {

try{

//这里是我自己项目获取当前session用户id的方法

return Long.parseLong(UserContext.getUserInfo().get().getUserId());

}catch(Exception ignored){

}

return null;

}, Long.class);

}

}

自定义bean实现MetaObjectHandler接口,并实现insertFill方法和updateFill方法,this.strictUpdateFill方法中添加需要自动填充的entity字段名和填充Function,比如创建时间和更新时间,传入LocalDateTime::now方法,当然也可以用自定义的方法:

()->{

//比方说我们更新时间不想太精确,只想设定为那一天的0点

return LocalDateTime.now().toLocalDate().atStartOfDay();

}

这两个步骤完成后,mybatis-plus就可以自动填充此字段了,比如在新增一条记录时,只需要set此记录的业务值,不设置create_time和create_user,直接调用entity.insert()方法,可以在数据库新增的记录中看到create_time自动填充了当前时间,create_user自动填充了session中的当前用户id。

这是字段自动填充一个应用,可拓展方向有很多,大家可以多多思考,自行发挥。

到此这篇关于mybatis-plus 通用字段自动化(如逻辑删除和更新时间等)的文章就介绍到这了,更多相关mybatis-plus 字段自动化内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

本文标题: mybatis-plus 通用字段自动化(如逻辑删除和更新时间等)

本文地址: http://www.cppcns.com/ruanjian/java/372979.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的使用Mybatis Plus函数的示例: 假设我们有一个表名为user,包含以下字段:id、name、age、email。 1. 首先,在pom.xml文件中添加Mybatis Plus的依赖: ``` <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>latest version</version> </dependency> ``` 2. 在Mapper接口中定义查询方法,例如根据年龄age查询: ``` import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.apache.ibatis.annotations.Param; import java.util.List; public interface UserMapper extends BaseMapper<User> { List<User> selectByAge(@Param("age") Integer age); } ``` 3. 在Service实现类中调用函数查询方法,例如查询年龄大于20的用户: ``` import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import java.util.List; @Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService { @Override public List<User> getByAge(Integer age) { QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.gt("age", age); // 使用Mybatis Plus的gt函数,查询年龄大于age的用户 List<User> userList = baseMapper.selectList(queryWrapper); return userList; } } ``` 这样就可以使用Mybatis Plus的函数查询数据了。除了gt函数,Mybatis Plus还提供了很多其他的函数,例如eq、ne、like、between等,具体可以参考官方文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值