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

經過mybatis-plus實現分頁,也是很簡單,插件大法。前端

1、分頁

一、配置分頁插件

把分頁的插件也配置到統一的配置類裏:mysql

@Configuration
// 配置掃描mapper的路徑
@MapperScan("com.pingguo.mpdemo.mapper")
public class MpConfig {

    // 樂觀鎖插件
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
        return new OptimisticLockerInterceptor();
    }

   // 分頁插件
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }
}

二、使用分頁

仍是在測試類中增長測試方法,這裏列了經常使用到的方法,後面配合前端頁面作分頁功能時候,都要用上。spring

//  測試分頁
    @Test
    void testPaging() {
        // 建立分頁對象,current爲當前頁數,size爲每頁最大記錄數
        Page<User> 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條數據,運行一下,對比下結果:sql

當前頁:1
當前頁數據list集合:[User(id=2, name=修更名稱222, age=19, email=pingguotest1@pingguo.com, 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=pingguotest1@pingguo.com, 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=pingguotest1@pingguo.com, createTime=null, updateTime=Fri Dec 25 00:55:02 CST 2020, version=null), User(id=5, name=wesson5, age=20, email=pingguotest1@pingguo.com, createTime=null, updateTime=null, version=null), User(id=1342322873243996161, name=李白6, age=66, email=laowang@123.com, 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

2、邏輯刪除

邏輯刪除並非真正從數據表開刪除數據記錄,只是經過一個字段去標識出這條記錄被刪除了,好比deleted0表示未刪除,1表示已刪除。apache

一、在數據表增長deleted字段。

二、實體類添加註解@TableLogic

在對應實體類裏增長屬性,而且加上@TableLogic註解。爲了方便,我還加了自動填充。session

@Data
public class User {
    @TableId(type = IdType.ID_WORKER)
    private Long id;
    private String name;
    ... ...
    @TableLogic   // 加上邏輯刪除註解
    @TableField(fill = FieldFill.INSERT) //爲了方便,加了自動填充
    private Integer deleted;
}

三、自動填充(非必須)

自動填充的話,這裏也須要增長:mybatis

@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

    }
}

四、application.properties 加入配置(非必須)

這裏默認狀況下,刪除是1,沒刪除是0。
若是你想改爲別的值,那麼就要在application.properties 加入配置,換成你須要設置的值。app

mybatis-plus.global-config.db-config.logic-delete-value=100
mybatis-plus.global-config.db-config.logic-not-delete-value=300

五、配置插件

@Configuration
// 配置掃描mapper的路徑
@MapperScan("com.pingguo.mpdemo.mapper")
public class MpConfig {

    // 樂觀鎖插件
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
        return new OptimisticLockerInterceptor();
    }
    ... ...
    // 邏輯刪除
    @Bean
    public ISqlInjector sqlInjector() {
        return new LogicSqlInjector();
    }
}

六、試一試

由於以前的數據,都沒有值,我手動把id=2的設置了0,而後去刪除id=2的數據。ide

// 測試 邏輯刪除
    @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

成功更新。

七、另外

MP查詢數據的時候會自動過濾掉被邏輯刪除的數據的,不須要咱們額外處理。
執行查詢試試:

//    查詢
    @Test
     void findAll() {
        List<User> users =  userMapper.selectList(null);
        System.out.println(users);
    }

SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0

相關文章
相關標籤/搜索