天天看點

MP實戰系列(十二)之封裝方法詳解(續二)

繼續 MP實戰系列(十一)之封裝方法詳解(續一)

這篇文章之後。

此次要講的是關于查詢。

查詢是用的比較多的,查詢很重要,好的查詢,加上索引如魚得水,不好的查詢加再多索引也是無濟于事。

1.selectById()方法

示範示例:

UserEntity user = ud.selectById(33);
        System.out.println(user.getEmail());
          

簡單的說明:

如果是在MyBatis中,需要再對應的xml編寫這樣的sql select column1,column2... from table where id=#{id}

這裡的id指的是主鍵。根據主鍵擷取對應的資訊。

selectById的源碼如下:

/**
     * <p>
     * 根據 ID 查詢
     * </p>
     *
     * @param id 主鍵ID
     * @return T
     */
    T selectById(Serializable id);

          

2.selectOne()

EntityWrapper<UserEntity> wrapper = new EntityWrapper<UserEntity>();
        wrapper.eq("user_id", 4);
        
        UserEntity user = ud.selectOne(wrapper);
        System.out.println(user.getEmail());      

對應的sql 是 select * from user where user_id=#{userId}

如果你想指定需要的字段,而不全部查出來,當然這有助于sql優化,可以通過wrapper調用,上面代碼就變成這樣

EntityWrapper<UserEntity> wrapper = new EntityWrapper<UserEntity>();
        wrapper.setSqlSelect("email","username");
        wrapper.eq("user_id", 4);
        
        UserEntity user = ud.selectOne(wrapper);
        System.out.println(user.getEmail());      

wrapper.setSqlSelect()中的必須要寫資料表中的列名,而不是對應JavaBean的屬性名。這個是要注意的地方。

3.selectByMap()

這個方法主要是針對集合的,而不是單個資料查詢。

示範代碼如下:

    Map<String,Object> columnMap = new HashMap<String,Object>();
        columnMap.put("username", "test");
        List<UserEntity> list =ud.selectByMap(columnMap);
        for (UserEntity userEntity : list) {
            System.out.println(userEntity.getCreateTime());
        }      

相當于的sql是 select * from user where username=#{username}

put中的和相當于#{username}占位符。

源代碼如下:

/**
     * <p>
     * 查詢(根據 columnMap 條件)
     * </p>
     *
     * @param columnMap 表字段 map 對象
     * @return List<T>
     */
    List<T> selectByMap(Map<String, Object> columnMap);      

4.selectList()

顧名思義,也是查詢集合資料

EntityWrapper<UserEntity> wrapper = new EntityWrapper<UserEntity>();
        wrapper.eq("username", "test");
        List<UserEntity> list =ud.selectList(wrapper);
        for (UserEntity userEntity : list) {
            System.out.println(userEntity.getCreateTime());
        }      

不過不同的是,如果selectList(null),參數值為null,那麼就意味着查詢所有不含條件。wrappper就相當于條件。

wrapper可以指定很多條件,如下所示:

wrapper.between(column, val1, val2)
        wrapper.groupBy(columns)  //對應sql中分組
        wrapper.eq(column, params) //相當于where條件
        wrapper.in(column, value) //sql中in
        wrapper.notIn(column, value) //sql中 not in
        wrapper.orderBy(columns, isAsc) //排序
        wrapper.exists(value) //相對于sql中exists查詢
        wrapper.notExists(value) //相當于sql中not exists查詢
        wrapper.notBetween(column, val1, val2) //相當于sql中在某個範圍内使用的between
        wrapper.ge(column, params) //大于等于
        wrapper.le(column, params) //小于等于
        wrapper.like(column, value) //模糊查詢
        wrapper.having(sqlHaving, params) //條件過濾
      

 隻要符合你的業務需要,都能使用。

方法名很容易了解。

源碼如下:

/**
     * <p>
     * 查詢清單
     * </p>
     *
     * @param wrapper 實體包裝類 {@link Wrapper}
     * @return
     */
    List<T> selectList(Wrapper<T> wrapper);      

5.selectCount()

EntityWrapper<UserEntity> wrapper = new EntityWrapper<UserEntity>();
        wrapper.eq("username", "test");
        int lines =ud.selectCount(wrapper);
        System.out.println(lines);
          

查詢符合條件的數量,通常情況下用于分頁查詢總數。

/**
     * <p>
     * 根據 Wrapper 條件,查詢總記錄數
     * </p>
     *
     * @param wrapper 實體對象
     * @return int
     */
    int selectCount(Wrapper<T> wrapper);      

6.selectMap

EntityWrapper<UserEntity> wrapper = new EntityWrapper<UserEntity>();
        wrapper.eq("username", "test");

        UserEntity user = new UserEntity();
        Map<String,Object> map= ud.selectMap(wrapper);
        map.put("user", user);

        for (String u : map.keySet()) {
            System.out.println(map.get(u));
        }      

這是通過Map的形式周遊,不過隻能擷取一條資料。

/**
     * <p>
     * 根據 Wrapper,查詢一條記錄
     * </p>
     *
     * @param wrapper {@link Wrapper}
     * @return Map<String,Object>
     */
    Map<String, Object> selectMap(Wrapper<T> wrapper);      

這種使用場景的話,就目前我而言,沒有用到過。

當然,我也一再強調,沒有用到,并不代表沒用。

7.selectMaps

EntityWrapper<UserEntity> wrapper = new EntityWrapper<UserEntity>();
        wrapper.eq("username", "test");
        UserEntity user = new UserEntity();
        Map<String,Object> map = new HashMap<String,Object>();
        map.put("user", user);
    
        List<Map<String,Object>> list= ud.selectMaps(wrapper);
        list.add(map);
        for (Map<String, Object> maps : list) {
            System.out.println(maps.keySet()+"||"+maps.values());
        }      

主要用于查詢集合資料

/**
     * <p>
     * 查詢清單
     * </p>
     *
     * @param wrapper {@link Wrapper}
     * @return
     */
    List<Map<String, Object>> selectMaps(Wrapper<T> wrapper);      

關于Map相關的一系列源碼,我會再後續章節詳細講解。

此次主要講的是MyBatis Plus的常用和包含的方法

8.selectPage

示範示例1:

List<UserEntity> records = ud.selectList(null);
        int lines = ud.selectCount(null);
        Page<UserEntity> page = new Page<UserEntity>();
        page.setLimit(0);
        page.setSize(10);
        page.setRecords(records);
        page.setCurrent(1);
        page.setTotal(lines);
        System.out.println(ud.selectPage(page));      

示範示例2:

List<UserEntity> records = ud.selectList(null);
        int lines = ud.selectCount(null);
        EntityWrapper<UserEntity> wrapper = new EntityWrapper<UserEntity>();
        wrapper.eq("username", "test");
        Page<UserEntity> page = new Page<UserEntity>();
        page.setLimit(0);
        page.setSize(10);
        page.setRecords(records);
        page.setCurrent(1);
        page.setTotal(lines);
        System.out.println(ud.selectPage(page, wrapper));      

主要是用于翻頁查詢,可以了解為分頁查詢

非常易懂

limit索引從幾開始

size每頁顯示多少條資料

record集合資料放置

current目前頁

total總數

/**
     * <p>
     * 翻頁查詢
     * </p>
     *
     * @param page 翻頁對象
     * @return
     */
    Page<T> selectPage(Page<T> page);      
/**
     * <p>
     * 翻頁查詢
     * </p>
     *
     * @param page    翻頁對象
     * @param wrapper 實體包裝類 {@link Wrapper}
     * @return
     */
    Page<T> selectPage(Page<T> page, Wrapper<T> wrapper);      

9.selectObj

EntityWrapper<UserEntity> wrapper = new EntityWrapper<UserEntity>();
        wrapper.eq("username", "test");

        Object obj = ud.selectObj(wrapper);
        System.out.println(obj);      

傳回的結果是該使用者對應的ID

/**
     * <p>
     * 根據 Wrapper,查詢一條記錄
     * </p>
     *
     * @param wrapper {@link Wrapper}
     * @return Object
     */
    Object selectObj(Wrapper<T> wrapper);      

10.selectObjs

EntityWrapper<UserEntity> wrapper = new EntityWrapper<UserEntity>();
        wrapper.eq("username", "test");

        List<Object> obj = ud.selectObjs(wrapper);
        for (Object object : obj) {
            System.out.println(object);
        }      

selectObj傳回符合條件的一條資料,該selectObjs傳回全部符合條件的資料

/**
     * <p>
     * 根據 Wrapper 條件,查詢全部記錄
     * </p>
     *
     * @param wrapper 實體對象封裝操作類(可以為 null)
     * @return List<Object>
     */
    List<Object> selectObjs(Wrapper<T> wrapper);      

小結:

其實查詢還有幾個,不過那幾個我不是特别了解,所有就沒有列出來了,上述列出的除了倒數兩個不常用,其他或多或少十分常用。

如果你項目最初開發,使用的持久層為MyBatis Plus,你可以參考我的這篇文章

MP實戰系列(六)之代碼生成器講解

直接通過代碼生成器開發,一次性生成所有實體、DAO、Service及其實作類和XML檔案。絕對比MyBatis的逆向工程要簡潔好用的多。

通過MyBatis Plus,你的開發效率,我相信可以提高70%或者80%。我公司目前采用這個,同僚們的開發效率提高了很多。項目進展也比較快。

當然,我希望我以後能更深入的掌握MyBatis Plus的原理或者MyBatis也行。因為MyBatis Plus就是從MyBatis衍生出來的。