mybatis-plus 通用字段自动化(如逻辑删除和更新时间等)
一般来说某些项目比较规范的情况下,大多数表都会有逻辑删除字段和通用字段,例如更新时间,创建时间,更新人,创建人等等,但是在代码开发上会产生很多冗余的代码,逻辑删除的话,自己写比较繁琐,而且容易有遗漏逻辑。
本来打算自己写切面去实现,偶然发现mybatis-plus已经帮封装实现了,试了一下,很好用,所以分享一下。
逻辑删除
逻辑删除的意思就是某些业务表,在用户删除某条数据的时候,不真正删除,而是将此数据某字段改成类似“已删除”,而查询语句、更新语句等会忽略此条被逻辑删除的数据。
这里就不多介绍mybatis-plus的基础使用了,没接触过的小伙伴可以去官网研究一下,都是中文,很好看懂。
贴一下我们mybatis-plus的pom依赖:
<!-- mybatis plus 核心依赖 --> <dependency> <groupid>com.baomidou</groupid> <artifactid>mybatis-plus-boot-starter</artifactid> <version>3.4.0</version> </dependency> <!-- mybatis plus 代码生成器依赖 --> <dependency> <groupid>com.baomidou</groupid> <artifactid>mybatis-plus-generator</artifactid> <version>3.4.0</version> </dependency> <!-- 代码生成器模板 --> <dependency> <groupid>org.apache.velocity</groupid> <artifactid>velocity-engine-core</artifactid> <version>2.1</version> </dependency>
逻辑删除比较简单,在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<tablefill> 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 字段自动化内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
上一篇: Fedora Linux怎么设置自动清空回收站的时间?
下一篇: node.js实现的装饰者模式示例