Mybatis Plus本身提供基於Service和Mapper的各種增刪改查的方法。
我們來詳細看一下Mybatis Plus中Mapper的查詢功能。
Mybatis Plus mapper查詢用法
Mybatis Plus的查詢預設提供了10種查詢方式,主要支援單條查詢和批次查詢,還有就是返回值的區別,我們來看看每種查詢的使用方式。
1、根據主鍵查詢單條記錄
程式碼 :
@Test public void testSelectById() { System.out.println(("----- selectById method test ------")); User user = userMapper.selectById(1); System.out.println(user); }
輸出 :
==> Preparing: SELECT id,name,age,email FROM user WHERE id=? ==> Parameters: 1(Integer)<== Columns: ID, NAME, AGE, EMAIL<== Row: 1, Jone, 18, [email protected]<== Total: 1
System.out.println輸出:
User(id=1, name=Jone, age=18, [email protected])
2、根據指定條件,查詢單條資料
程式碼:
@Test public void testSelectOne() { System.out.println(("----- selectOne method test ------")); QueryWrapper wrapper = new QueryWrapper(); wrapper.eq("Name", "Jack"); User user = userMapper.selectOne(wrapper); System.out.println(user); }
輸出:
==> Preparing: SELECT id,name,age,email FROM user WHERE (Name = ?) ==> Parameters: Jack(String)<== Columns: ID, NAME, AGE, EMAIL<== Row: 2, Jack, 20, [email protected]<== Total: 1
System.out.println輸出:
User(id=2, name=Jack, age=20, [email protected])
3、根據主鍵的集合,查詢多條資料
程式碼:
@Test public void testSelectBatchIds() { System.out.println(("----- selectBatchIds method test ------")); List<Integer> ids = new ArrayList<>(); ids.add(1); ids.add(2); List<User> users = userMapper.selectBatchIds(ids); users.forEach(System.out::println); }
輸出 :
==> Preparing: SELECT id,name,age,email FROM user WHERE id IN ( ? , ? ) ==> Parameters: 1(Integer), 2(Integer)<== Columns: ID, NAME, AGE, EMAIL<== Row: 1, Jone, 18, [email protected]<== Row: 2, Jack, 20, [email protected]<== Total: 2
System.out.println輸出:
User(id=1, name=Jone, age=18, [email protected])User(id=2, name=Jack, age=20, [email protected])
4、根據Map作為條件,查詢多條資料
程式碼:
@Test public void testSelectByMap() { System.out.println(("----- selectByMap method test ------")); Map<String,Object> columnMap = new HashMap<>(); columnMap.put("Name","Jack"); columnMap.put("Name","Jone"); columnMap.put("Age",20); List<User> users = userMapper.selectByMap(columnMap); users.forEach(System.out::println); }
輸出:
==> Preparing: SELECT id,name,age,email FROM user WHERE Age = ? AND Name = ? ==> Parameters: 20(Integer), Jone(String)<== Total: 0Closing non transactio
這裡查詢結果為0條是資料,看日誌輸出,age:20,Name:Jone。
我實際的Name設定了兩次,分別是:
columnMap.put("Name","Jack");columnMap.put("Name","Jone");
我們都知道map的特性,key不能重複,所以設定兩次肯定是以最後一次為準,所以這裡的引數是Name:Jone。
實際Jone的age是18,我引數設定了20,肯定查不出來,設定為18是可以查出結果的。
selectByMap的作用就是基於一列的多個欄位作為條件來查詢,並且條件是and的關係。
5、根據設定條件統計總記錄數
程式碼:
@Test public void testSelectCount() { System.out.println(("----- selectCount method test ------")); Map<String,Object> columnMap = new HashMap<>(); columnMap.put("Name","Jack"); columnMap.put("Name","Jone"); columnMap.put("Age",20); Integer integer = userMapper.selectCount(null); System.out.println(("----- 總記錄數: "+integer)); }
輸出:
==> Preparing: SELECT COUNT( 1 ) FROM user ==> Parameters: <== Columns: COUNT(*)<== Row: 5<== Total: 1
System.out.println輸出:
----- 總記錄數: 5
6、根據條件查詢列表,這個我們在第一節就演示過了,看下原始碼定義:
/** * 根據 entity 條件,查詢全部記錄 * * @param queryWrapper 實體物件封裝操作類(可以為 null) */ List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
第一節內容的程式碼:
@Test public void testSelect() { System.out.println(("----- selectAll method test ------")); List<User> userList = userMapper.selectList(null); Assert.assertEquals(5, userList.size()); userList.forEach(System.out::println); }
7、基於條件將查詢結果以List<Map>返回
程式碼:
@Test public void testSelectMaps() { System.out.println(("----- selectMaps method test ------")); QueryWrapper wrapper = new QueryWrapper(); wrapper.gt("Age", 21); List<Map<String, Object>> list = userMapper.selectMaps(wrapper); list.forEach(user -> user.forEach((k,v)->{ // 列印鍵,列印值 System.out.println(k + "----" +v); })); }
輸出:
==> Preparing: SELECT id,name,age,email FROM user WHERE (Age > ?) ==> Parameters: 21(Integer)<== Columns: ID, NAME, AGE, EMAIL<== Row: 3, Tom, 28, [email protected]<== Row: 5, Billie, 24, [email protected]<== Total: 2
上面是SQL輸出,下面是程式碼列印輸出:
ID----3EMAIL----test3@baomidou.comNAME----TomAGE----28ID----5EMAIL----test5@baomidou.comNAME----BillieAGE----24
sql查詢條件是年齡大於21的人,列印了兩條資料,是key—-value的格式列印的。
8、基於條件查詢,返回一個主鍵的list,也就是返回的是主鍵的集合
程式碼:
@Test public void testSelectObjs() { System.out.println(("----- selectObjs method test ------")); QueryWrapper wrapper = new QueryWrapper(); wrapper.gt("Age", 21); List users = userMapper.selectObjs(wrapper); users.forEach(System.out::println); }
輸出:
==> Preparing: SELECT id,name,age,email FROM user WHERE (Age > ?) ==> Parameters: 21(Integer)<== Columns: ID, NAME, AGE, EMAIL<== Row: 3, Tom, 28, [email protected]<== Row: 5, Billie, 24, [email protected]<== Total: 2
System.out::println的輸出:
35
9、基於條件的分頁查詢,在第二節已經講過,這裡貼出原始碼的方法定義
/** * 根據 entity 條件,查詢全部記錄(並翻頁) * * @param page 分頁查詢條件(可以為 RowBounds.DEFAULT) * @param queryWrapper 實體物件封裝操作類(可以為 null) */ <E extends IPage<T>> E selectPage(E page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
第二節內容的程式碼:
@Test public void testSelectPage() { System.out.println(("----- selectAll method test ------")); Page<User> userPage = userMapper.selectPage(new Page<User>(1, 2), null); List<User> records = userPage.getRecords(); records.forEach(System.out::println); }
10、基於條件的分頁查詢,在第二節已經講過,這裡貼出原始碼的方法定義
/** * 根據 Wrapper 條件,查詢全部記錄(並翻頁) * * @param page 分頁查詢條件 * @param queryWrapper 實體物件封裝操作類 */ <E extends IPage<Map<String, Object>>> E selectMapsPage(E page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);