四.四 添加/修改 验证
四.四.一 添加时,自动填充 createTime 字段值
四.四.二 修改时,自动更新 updateTime 字段值
五. 逻辑删除
通常,在一个表里面,删除时,并不是真正物理删除这条数据,而是逻辑删除数据。
常常用 flag, write_status 等字段来表示. 为1 时表示正常状态, 为0时,表示删除状态。
设置时,有两种, 一种是单个表设置,一种是全局性配置。
五.一 数据表 user 添加 flag 字段
-- 修改数据库中表结构, 添加一个字段作为标记 ALTER TABLE user ADD column flag TINYINT COMMENT '0表示删除,1表示正常'; -- 更新表中所有数据, 全部设置为未删除 UPDATE user SET flag=1;
五.二 单个表设置逻辑删除
五.二.一 User.java 添加flag属性和配置
@TableField(value="flag",fill = FieldFill.INSERT) @TableLogic(value = "1",delval = "0") private Integer flag;
用 @TableLogic 注解放置在属性上, value表示正常的状态, delval 表示删除时的值信息。
五.二.二 处理自动插入 flag
@Component @Log4j2 public class FillDateHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { log.info("createTime 字段插入开始日期"); this.strictInsertFill(metaObject, "createTime", Date.class, new Date()); //处理 flag 逻辑删除位。 this.strictInsertFill(metaObject, "flag", Integer.class, 1); } @Override public void updateFill(MetaObject metaObject) { log.info("updateTime 字段更新修改日期"); this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date()); } }
五.二.三 新增,修改,删除验证
五.二.三.一 新增
五.二.三.二 修改
五.二.三.三 删除
变成了逻辑删除, 令 flag=0
五.二.三.四 全部查询 findAllTest
查询时,都会带上条件, flag=1 进行查询, 避免已经逻辑删除的数据被查询到。
五.三 全局配置逻辑删除
当表过多时,不应该每一个表对应的类都进行配置 逻辑删除的数据,希望全局性进行配置,便于维护.
五.三.一 application.yml 全局配置
#整合mybatis时使用的 mybatis-plus: # 配置 mapper文件的位置 mapper-locations: classpath:mybatis/mapper/**/*.xml # 配置日志 configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl map-underscore-to-camel-case: true # 配置数据库表的列别名设置 global-config: db-config: logic-delete-field: flag # 逻辑删除的字段 logic-not-delete-value: 1 # 正常状态下,该字段的值 logic-delete-value: 0 # 删除后,该字段的值 table-underline: true # 驼峰方式转换
五.三.二 User.java 配置 flag 属性
/*处理标识位*/ //@TableField(value="flag",fill = FieldFill.INSERT) //@TableLogic(value = "1",delval = "0") @TableField(value="flag",fill = FieldFill.INSERT) @TableLogic private Integer flag;
五.三.三 处理自动插入 flag
@Component @Log4j2 public class FillDateHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { log.info("createTime 字段插入开始日期"); this.strictInsertFill(metaObject, "createTime", Date.class, new Date()); //处理 flag 逻辑删除位。 this.strictInsertFill(metaObject, "flag", Integer.class, 1); } @Override public void updateFill(MetaObject metaObject) { log.info("updateTime 字段更新修改日期"); this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date()); } }
五.三.四 添加,修改,删除测试
添加,修改,删除,查询均与 五.二.三.四 部分相同。 这儿,老蝴蝶只给出一个插入的打印信息。
六. 分页展示
当数据量过多时,会进行分页展示。 MyBatis-Plus 自带分页处理,也支持 pagehelper-spring-boot-starter 进行分页处理.
六.一 MyBatisPlus 自带的分页 PaginationInterceptor
六.一.一 配置 PageConfig
@Component //配置扫描哪些 mapper @MapperScan(value="top.yueshushu.learn.mapper") public class PageConfig { /** * 对分页进行配置 * @return */ @Bean public PaginationInterceptor getPaginationInterceptor(){ return new PaginationInterceptor(); } }
六.一.二 分页处理 接口和实现类
UserService.java
Page pageUser(Integer pageNumber, Integer pageSize);
UserServiceImpl.java
@Override public Page pageUser(Integer pageNumber, Integer pageSize) { //开启分页 Page userPage=new Page(pageNumber,pageSize); //正常的查询 userMapper.selectPage(userPage,null); return userPage; }
六.一.三 测试
@Test public void pageTest(){ Integer pageNumber=2; Integer pageSize=3; Page pageInfo=userService.pageUser(pageNumber,pageSize); log.info("总数:"+pageInfo.getTotal()); List<User> userList=pageInfo.getRecords(); userList.forEach(n->log.info(n)); }
可以进行分页的. 具体的分页后的数据,可以查询 Page 类
六.二 分页 pagehelper-spring-boot-starter
六.二.一 pom.xml 中添加依赖
<!-- 引入pagehelper分页插件 注意版本号要与 mybatis-plus 进行匹配到 --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.12</version> </dependency>
注意依赖的版本号, 要与 mybatis-plus 的版本号适配。
六.二.二 application.yml 配置
#分页插件 pagehelper: helperDialect: mysql reasonable: true supportMethodsArguments: true params: count=countSql
六.二.三 去掉 PaginationInterceptor 的分页
//@Component //配置扫描哪些 mapper @MapperScan(value="top.yueshushu.learn.mapper") public class PageConfig { /** * 对分页进行配置 * @return */ //@Bean public PaginationInterceptor getPaginationInterceptor(){ return new PaginationInterceptor(); } }
六.二.四 分页
UserService.java
PageInfo githubPageUser(Integer pageNumber, Integer pageSize);
UserServiceImpl.java
@Override public PageInfo githubPageUser(Integer pageNumber, Integer pageSize) { //开启分页 PageHelper.startPage(pageNumber,pageSize); //正常的查询 List<User> userList=userMapper.selectList(null); //将结果转换成PageInfo对象。 PageInfo pageInfo=new PageInfo(userList); return pageInfo; }
六.二.五 分页测试
@Test public void githubPageTest(){ Integer pageNumber=2; Integer pageSize=3; PageInfo pageInfo=userService.githubPageUser(pageNumber,pageSize); log.info("总数:"+pageInfo.getTotal()); List<User> userList=pageInfo.getList(); userList.forEach(n->log.info(n)); }
分页是可以的。
本章节的代码放置在 github 上:
https://github.com/yuejianli/springboot/tree/develop/SpringBoot_MyBatisPlus
谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!