1. 程式人生 > >【mybatis-plus】分頁、邏輯刪除

【mybatis-plus】分頁、邏輯刪除

通過mybatis-plus實現分頁,也是很簡單,外掛大法。 ### 一、分頁 #### 1、配置分頁外掛 把分頁的外掛也配置到統一的配置類裡: ``` @Configuration // 配置掃描mapper的路徑 @MapperScan("com.pingguo.mpdemo.mapper") public class MpConfig { // 樂觀鎖外掛 @Bean public OptimisticLockerInterceptor optimisticLockerInterceptor() { return new OptimisticLockerInterceptor(); } // 分頁外掛 @Bean public PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor(); } } ``` #### 2、使用分頁 還是在測試類中增加測試方法,這裡列了常用到的方法,後面配合前端頁面做分頁功能時候,都要用上。 ``` // 測試分頁 @Test void testPaging() { // 建立分頁物件,current為當前頁數,size為每頁最大記錄數 Page pageUser = new Page<>(1, 5); // 呼叫分頁查詢方法,傳入分頁物件-pageUser,wrapper是構造條件物件,這裡暫時寫null userMapper.selectPage(pageUser, null); System.out.println("當前頁:"+ pageUser.getCurrent()); System.out.println("當前頁資料list集合:" + pageUser.getRecords()); System.out.println("每頁顯示記錄數:" + pageUser.getSize()); System.out.println("總記錄數:" + pageUser.getTotal()); System.out.println("總頁數:" + pageUser.getPages()); System.out.println("是否有下一頁:" + pageUser.hasNext()); System.out.println("是否有上一頁:" + pageUser.hasPrevious()); } ``` 目前資料表共12條資料,執行一下,對比下結果: ![](https://img2020.cnblogs.com/blog/1268169/202012/1268169-20201228152821181-1294943456.png) ``` 當前頁:1 當前頁資料list集合:[User(id=2, name=修改名稱222, age=19, [email protected], createTime=Thu Dec 24 23:27:20 CST 2020, updateTime=Thu Dec 24 23:27:23 CST 2020, version=null), User(id=3, name=wesson3, age=20, [email protected], createTime=Wed Dec 23 23:27:32 CST 2020, updateTime=Thu Dec 24 23:27:36 CST 2020, version=null), User(id=4, name=daxiong, age=22, [email protected], createTime=null, updateTime=Fri Dec 25 00:55:02 CST 2020, version=null), User(id=5, name=wesson5, age=20, [email protected], createTime=null, updateTime=null, version=null), User(id=1342322873243996161, name=李白6, age=66, [email protected], createTime=Fri Dec 25 12:14:47 CST 2020, updateTime=Fri Dec 25 15:43:11 CST 2020, version=2)] 每頁顯示記錄數:5 總記錄數:12 總頁數:3 是否有下一頁:true 是否有上一頁:false ``` ### 二、邏輯刪除 邏輯刪除並不是真正從資料表開刪除資料記錄,只是通過一個欄位去標識出這條記錄被刪除了,比如`deleted`,`0`表示未刪除,`1`表示已刪除。 #### 1、在資料表增加deleted欄位。 ![](https://img2020.cnblogs.com/blog/1268169/202012/1268169-20201228153912370-437939274.png) #### 2、實體類添加註解@TableLogic 在對應實體類裡增加屬性,並且加上`@TableLogic`註解。為了方便,我還加了自動填充。 ``` @Data public class User { @TableId(type = IdType.ID_WORKER) private Long id; private String name; ... ... @TableLogic // 加上邏輯刪除註解 @TableField(fill = FieldFill.INSERT) //為了方便,加了自動填充 private Integer deleted; } ``` #### 3、自動填充(非必須) 自動填充的話,這裡也需要增加: ``` @Component //此註解表示 將其交給spring去管理 public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { this.setFieldValByName("createTime", new Date(), metaObject); this.setFieldValByName("updateTime", new Date(), metaObject); this.setFieldValByName("version", 0, metaObject); //為了第一次新增就設定版本值 this.setFieldValByName("deleted", 0, metaObject); //新增資料就預設設定0 } } ``` #### 4、application.properties 加入配置(非必須) 這裡預設情況下,刪除是1,沒刪除是0。 如果你想改成別的值,那麼就要在application.properties 加入配置,換成你需要設定的值。 ``` mybatis-plus.global-config.db-config.logic-delete-value=100 mybatis-plus.global-config.db-config.logic-not-delete-value=300 ``` #### 5、配置外掛 ``` @Configuration // 配置掃描mapper的路徑 @MapperScan("com.pingguo.mpdemo.mapper") public class MpConfig { // 樂觀鎖外掛 @Bean public OptimisticLockerInterceptor optimisticLockerInterceptor() { return new OptimisticLockerInterceptor(); } ... ... // 邏輯刪除 @Bean public ISqlInjector sqlInjector() { return new LogicSqlInjector(); } } ``` #### 6、試一試 因為之前的資料,都沒有值,我手動把id=2的設定了0,然後去刪除id=2的資料。 ``` // 測試 邏輯刪除 @Test void testLogicDelete() { int result = userMapper.deleteById(2L); System.out.println(result); } ``` 可以看到執行的sql其實是個update ``` JDBC Connection [HikariProxyConnection@2144912729 wrapping com.mysql.cj.jdbc.ConnectionImpl@44c13103] will not be managed by Spring ==> Preparing: UPDATE user SET deleted=1 WHERE id=? AND deleted=0 ==> Parameters: 2(Long) <== Updates: 1 Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@10f19647] 1 ``` 成功更新。 ![](https://img2020.cnblogs.com/blog/1268169/202012/1268169-20201228155617625-782819675.png) #### 7、另外 MP查詢資料的時候會自動過濾掉被邏輯刪除的資料的,不需要我們額外處理。 執行查詢試試: ``` // 查詢 @Test void findAll() { List users = userMapper.selectList(null); System.out.println(users); } ``` SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 ![](https://img2020.cnblogs.com/blog/1268169/202012/1268169-20201228155940666-21318650