這篇文章之後。
此次要講的是關于查詢。
查詢是用的比較多的,查詢很重要,好的查詢,加上索引如魚得水,不好的查詢加再多索引也是無濟于事。
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衍生出來的。