提升開發效率的一款mybatis開發神器
文末附有完整案例的程式碼內容!!
以前在開發的時候,使用mybatis的時候,經常都需要先配置xml對映檔案,然後每條sql操作都需要自己進行手動編寫,對於一些複雜的sql這麼來操作確實有必要,但是如果只是一些非常簡單的insert,update,delete,select這型別的語句而言,也需要開發人員花費額外的時間進行手動編寫的話,確實費時又費力。
能否為mybatis特別定製一套能夠自動為我們生成一些簡單sql功能,同時又支援我們進行自定義sql設定功能的強大框架呢?
mybatis plus因此誕生了。
這隻小鳥太魔性了
mybatis plus是一款專門針對於傳統MyBatis開發中sql需要手動進行對映配置繁瑣缺點的一款框架技術,這款框架技術提供了十分豐富的api供開發者們使用,在 MyBatis 的基礎上只做增強不做改變,為簡化開發、提高效率而生。
Mybatis plus到底有多方便呢,我們閒話不多說,直接上手程式碼例項來進行演示:
首先我們需要匯入一些相關的pom依賴配置
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.sise</groupId> <artifactId>mybatis-plus</artifactId> <version>1.0-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.9.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatisplus-spring-boot-starter</artifactId> <version>1.0.5</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus</artifactId> <version>2.3</version> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> </project>
匯入了jar包之後,為了方便測試,我們首先在資料庫裡面搭建相關的資料表資訊
CREATE TABLE `teacher` ( `id` int(11) NOT NULL AUTO_INCREMENT, `teacher_name` varchar(60) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, `teacher_pwd` varchar(60) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=gbk;
該表對應的實體類:
package com.sise.model; import com.baomidou.mybatisplus.annotations.TableName; /** * @author idea * @data 2019/5/24 */ @TableName(value = "teacher") public class Teacher { private int id; private String teacherName; private String teacherPwd; public int getId() { return id; } public Teacher() { } public Teacher(int id) { this.id = id; } public Teacher setId(int id) { this.id = id; return this; } public String getTeacherName() { return teacherName; } public Teacher setTeacherName(String teacherName) { this.teacherName = teacherName; return this; } public String getTeacherPwd() { return teacherPwd; } public Teacher setTeacherPwd(String teacherPwd) { this.teacherPwd = teacherPwd; return this; } @Override public String toString() { return "Teacher{" + "id=" + id + ", teacherName='" + teacherName + ''' + ", teacherPwd='" + teacherPwd + ''' + '}'; } }
通常我們在開發的時候都會自定義一個Dao層,mybatis plus裡面提供了一個叫做BaseMapper的介面,內部已經提供了相當多的crud操作函式的封裝。可以來仔細檢視一下該介面的內容:
/** * Copyright (c) 2011-2020, hubin ([email protected]). * <p> * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * <p> * http://www.apache.org/licenses/LICENSE-2.0 * <p> * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.baomidou.mybatisplus.mapper; import java.io.Serializable; import java.util.Collection; import java.util.List; import java.util.Map; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.session.RowBounds; /** * <p> * Mapper 繼承該介面後,無需編寫 mapper.xml 檔案,即可獲得CRUD功能 * </p> * <p> * 這個 Mapper 支援 id 泛型 * </p> * * @author hubin * @Date 2016-01-23 */ public interface BaseMapper<T> { /** * <p> * 插入一條記錄 * </p> * * @param entity 實體物件 * @return int */ Integer insert(T entity); /** * <p> * 插入一條記錄 * </p> * * @param entity 實體物件 * @return int */ Integer insertAllColumn(T entity); /** * <p> * 根據 ID 刪除 * </p> * * @param id 主鍵ID * @return int */ Integer deleteById(Serializable id); /** * <p> * 根據 columnMap 條件,刪除記錄 * </p> * * @param columnMap 表字段 map 物件 * @return int */ Integer deleteByMap(@Param("cm") Map<String, Object> columnMap); /** * <p> * 根據 entity 條件,刪除記錄 * </p> * * @param wrapper 實體物件封裝操作類(可以為 null) * @return int */ Integer delete(@Param("ew") Wrapper<T> wrapper); /** * <p> * 刪除(根據ID 批量刪除) * </p> * * @param idList 主鍵ID列表 * @return int */ Integer deleteBatchIds(@Param("coll") Collection<? extends Serializable> idList); /** * <p> * 根據 ID 修改 * </p> * * @param entity 實體物件 * @return int */ Integer updateById(@Param("et") T entity); /** * <p> * 根據 ID 修改 * </p> * * @param entity 實體物件 * @return int */ Integer updateAllColumnById(@Param("et") T entity); /** * <p> * 根據 whereEntity 條件,更新記錄 * </p> * * @param entity 實體物件 * @param wrapper 實體物件封裝操作類(可以為 null) * @return */ Integer update(@Param("et") T entity, @Param("ew") Wrapper<T> wrapper); /** * <p> * 根據 whereEntity 條件,更新記錄 * </p> * * @param setStr set字串 * @param wrapper 實體物件封裝操作類(可以為 null) * @return */ Integer updateForSet(@Param("setStr") String setStr, @Param("ew") Wrapper<T> wrapper); /** * <p> * 根據 ID 查詢 * </p> * * @param id 主鍵ID * @return T */ T selectById(Serializable id); /** * <p> * 查詢(根據ID 批量查詢) * </p> * * @param idList 主鍵ID列表 * @return List<T> */ List<T> selectBatchIds(@Param("coll") Collection<? extends Serializable> idList); /** * <p> * 查詢(根據 columnMap 條件) * </p> * * @param columnMap 表字段 map 物件 * @return List<T> */ List<T> selectByMap(@Param("cm") Map<String, Object> columnMap); /** * <p> * 根據 entity 條件,查詢一條記錄 * </p> * * @param entity 實體物件 * @return T */ T selectOne(@Param("ew") T entity); /** * <p> * 根據 Wrapper 條件,查詢總記錄數 * </p> * * @param wrapper 實體物件 * @return int */ Integer selectCount(@Param("ew") Wrapper<T> wrapper); /** * <p> * 根據 entity 條件,查詢全部記錄 * </p> * * @param wrapper 實體物件封裝操作類(可以為 null) * @return List<T> */ List<T> selectList(@Param("ew") Wrapper<T> wrapper); /** * <p> * 根據 Wrapper 條件,查詢全部記錄 * </p> * * @param wrapper 實體物件封裝操作類(可以為 null) * @return List<T> */ List<Map<String, Object>> selectMaps(@Param("ew") Wrapper<T> wrapper); /** * <p> * 根據 Wrapper 條件,查詢全部記錄 * 注意: 只返回第一個欄位的值 * </p> * * @param wrapper 實體物件封裝操作類(可以為 null) * @return List<Object> */ List<Object> selectObjs(@Param("ew") Wrapper<T> wrapper); /** * <p> * 根據 entity 條件,查詢全部記錄(並翻頁) * </p> * * @param rowBounds 分頁查詢條件(可以為 RowBounds.DEFAULT) * @param wrapper 實體物件封裝操作類(可以為 null) * @return List<T> */ List<T> selectPage(RowBounds rowBounds, @Param("ew") Wrapper<T> wrapper); /** * <p> * 根據 Wrapper 條件,查詢全部記錄(並翻頁) * </p> * * @param rowBounds 分頁查詢條件(可以為 RowBounds.DEFAULT) * @param wrapper 實體物件封裝操作類 * @return List<Map<String, Object>> */ List<Map<String, Object>> selectMapsPage(RowBounds rowBounds, @Param("ew") Wrapper<T> wrapper); }
這些內建的功能都是已經提前自定義好了的,因此對於一些常用的簡單的sql我們可以避免使用手動拼接的方式來實現,大大提升了開發人員的開發效率,結合文章上邊所說的教師物件,我們自定義一個Mapper介面用於實現crud的操作:
package com.sise.dao; import com.baomidou.mybatisplus.mapper.BaseMapper; import com.sise.model.Teacher; import org.apache.ibatis.annotations.Mapper; /** * @author idea * @data 2019/5/24 */ @Mapper public interface TeacherMapper extends BaseMapper<Teacher> { }
為了方便測試,我直接選擇了在controller裡面引用dao函式的功能。
1.提前定義好的插入功能:
BaseMapper裡面封裝了已經定義好的insert語句,能夠方便我們直接呼叫,無須自己手動編寫sql
@GetMapping(value = "/insert") public void insert(){ Teacher teacher=new Teacher(); teacher.setTeacherName(createRandomStr(6)); teacher.setTeacherPwd(createRandomStr(6)); teacherMapper.insert(teacher); } /** * 生成隨機字串 * * @return */ private static String createRandomStr(int length){ String str="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; Random random=new Random(); StringBuffer sb=new StringBuffer(); for(int i=0;i<length;i++){ int number=random.nextInt(str.length()); sb.append(str.charAt(number)); } return sb.toString(); }
生成的sql語句:
INSERT INTO teacher ( id, teacher_name, teacher_pwd ) VALUES ( 0, 'mNJXIf', 'LKTnam' );
2.提前定義好的刪除功能
BaseMapper裡面提供有已經定義好的delete功能,
@GetMapping(value = "/delete") public void delete(){ Teacher teacher=new Teacher(); teacher.setId(11); EntityWrapper entityWrapper=new EntityWrapper(teacher); teacherMapper.delete(entityWrapper); }
生成的sql語句:
DELETE FROM teacher WHERE id=11;
3.提前定義好的更新功能
BaseMapper裡面定義了相關的update功能,但是在進行update的時候有個地方需要注意,來看看下邊這段程式碼先
@GetMapping(value = "/update") public void update(){ //update的判斷條件 EntityWrapper entityWrapper=new EntityWrapper(new Teacher(1)); //更新之後的物件 Teacher teacher=new Teacher(); teacher.setTeacherPwd("new-pwd"); teacherMapper.update(teacher,entityWrapper); }
生成的sql語句:
UPDATE teacher SET teacher_pwd='new-pwd' WHERE id=1;
mybatis-plus裡面提供了一個叫做EntityWrapper的物件封裝操作類,通過傳入相關的Entity來判斷傳入的查詢引數,這裡的使用讓我回想起了以前用hibernate的那種味道,不得不說這種功能的設計確實幫開發者的開發效率提升了很多。
以前寫更新語句的時候,經常是需要在xml裡面進行非常多繁瑣耗時的sql拼接工作,現在mybatis-plus通過EntityWrapper這個封裝類,大大節省了相應時間。
4.根據指定id進行查詢
mybatis-plus也預設提供了關鍵字查詢的功能,可以將查詢引數通過物件Entity的形式注入,非常方便。
ps:mybatis-plus已經預設帶有了sql注入的預防功能,因此這點可以放心使用。
@GetMapping(value = "/selectAllById") public Teacher selectByTeacherName(int id){ return teacherMapper.selectOne(new Teacher(id)); }
生成的sql語句:
SELECT id,teacher_name AS teacherName,teacher_pwd AS teacherPwd FROM teacher WHERE id=0;
5.使用Map來進行多關鍵字的查詢
有些時候,除了使用查詢時候使用Entity關鍵字來進行查詢之外,還可以通過使用Map的形式來進行多關鍵字的搜尋實現,相關程式碼如下所示:
@GetMapping(value = "/selectAllByMap") public List<Teacher> selectAllByEntity(String name){ Map<String,Object> hashMap=new HashMap<>(); hashMap.put("teacher_name",name); return teacherMapper.selectByMap(hashMap); }
注意,這裡的map放入的key值需要和表裡面的欄位命名一致。
生成的sql語句:
SELECT id,teacher_name AS teacherName,teacher_pwd AS teacherPwd FROM teacher WHERE teacher_name = 'qwe';
6.統計查詢
@GetMapping(value = "/selectCountByEntity") public int selectCount(String name){ Teacher teacher=new Teacher(); teacher.setId(1); teacher.setTeacherName(name); EntityWrapper<Teacher> entityWrapper=new EntityWrapper<>(teacher); return teacherMapper.selectCount(entityWrapper); }
生成的sql語句:
SELECT COUNT(1) FROM teacher WHERE id=1 AND teacher_name='qwe';
7.分頁查詢
在實際開發中,分頁查詢功能一直是非常普遍需要運用到的一點,在mybatis-plus裡面,他提供了一個叫做Page的類供我們使用,相應的程式碼如下所示:
@GetMapping(value = "/selectAllInPage") public List<Teacher> selectAllInPage(int pageNumber,int pageSize){ Page<Teacher> page =new Page<>(pageNumber,pageSize); EntityWrapper<Teacher> entityWrapper = new EntityWrapper<>(); entityWrapper.ge("id", 1); return teacherMapper.selectPage(page,entityWrapper); }
生成的sql語句:
SELECT id,teacher_name AS teacherName,teacher_pwd AS teacherPwd FROM teacher WHERE (id >= 1) LIMIT 0,1;
mybatis-plus使用的分頁技術是傳統的 limit 物理分頁方式。
8. in 查詢
查詢的時候,如果需要使用in查詢的話,可以使用selectBatchIds這個api功能:
@GetMapping(value = "/selectInIdArr") public List<Teacher> selectInIdArr(){ List<Integer> idList=new ArrayList<>(); idList.add(1); idList.add(10); idList.add(11); return teacherMapper.selectBatchIds(idList); }
生成的sql語句:
SELECT id,teacher_name AS teacherName,teacher_pwd AS teacherPwd FROM teacher WHERE id IN ( 1 , 10 , 11 );
9.複雜條件查詢
針對於比較複雜的多條件查詢,mybatis-plus內部提供的EntityWrapper支援有許多豐富的查詢api功能供我們使用。
為了方便理解,下邊通過實際的程式碼案例來進行解釋
allEq查詢(相當於條件全部都要求滿足的情況)
@GetMapping(value = "/selectAllByWrapper1") public List<Teacher> selectAllByWrapper1(){ Map<String,Object> map=new HashMap<>(); map.put("teacher_name","name"); map.put("teacher_pwd","pwd"); EntityWrapper entity=new EntityWrapper(); entity.allEq(map); return teacherMapper.selectList(entity); }
生成的sql語句:
SELECT id,teacher_name AS teacherName,teacher_pwd AS teacherPwd FROM teacher WHERE (teacher_pwd = 'pwd' AND teacher_name = 'name');
ne查詢
@GetMapping(value = "/selectAllByWrapper3") public List<Teacher> selectAllByWrapper3(){ EntityWrapper entity=new EntityWrapper(); entity.ne("teacher_name","name"); return teacherMapper.selectList(entity); }
生成的sql語句:
SELECT id,teacher_name AS teacherName,teacher_pwd AS teacherPwd FROM teacher WHERE (teacher_name <> 'name');
eq查詢
@GetMapping(value = "/selectAllByWrapper2") public List<Teacher> selectAllByWrapper2(){ EntityWrapper entity=new EntityWrapper(); entity.eq("teacher_name","name"); return teacherMapper.selectList(entity); }
生成的sql語句:
SELECT id,teacher_name AS teacherName,teacher_pwd AS teacherPwd FROM teacher WHERE (teacher_name = 'name');
複雜的多條件查詢:
@GetMapping(value = "/selectAllByWrapper4") public List<Teacher> selectAllByWrapper4(){ EntityWrapper entity=new EntityWrapper(); entity.gt("id","0"); entity.le("id",11); entity.ne("teacher_name","null_name"); entity.like("teacher_name","tt"); entity.notLike("teacher_pwd","sadas"); entity.orderBy("id"); return teacherMapper.selectList(entity); }
生成的sql語句:
組合的and和or條件查詢:
生成的sql語句:
SELECT id,teacher_name AS teacherName,teacher_pwd AS teacherPwd FROM teacher WHERE (id>1) OR (id=0 AND teacher_name='name' AND teacher_pwd IS NULL);
having和groupby查詢:
生成的sql語句:
SELECT id,teacher_name AS teacherName,teacher_pwd AS teacherPwd FROM teacher GROUP BY teacher_name HAVING (id>1);
除了常規的基於Mapper的直接操作資料庫操作功能以外,Mybatis-plus內部還提供了一個叫做IService的介面,內部含有很多豐富的CRUD操作功能可以供開發人員呼叫:
/** * Copyright (c) 2011-2016, hubin ([email protected]). * <p> * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * <p> * http://www.apache.org/licenses/LICENSE-2.0 * <p> * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.baomidou.mybatisplus.service; import java.io.Serializable; import java.util.Collection; import java.util.List; import java.util.Map; import com.baomidou.mybatisplus.mapper.Wrapper; import com.baomidou.mybatisplus.plugins.Page; /** * <p> * 頂級 Service * </p> * * @author hubin * @Date 2016-04-20 */ public interface IService<T> { /** * <p> * 插入一條記錄(選擇欄位,策略插入) * </p> * * @param entity 實體物件 * @return boolean */ boolean insert(T entity); /** * <p> * 插入一條記錄(全部欄位) * </p> * * @param entity 實體物件 * @return boolean */ boolean insertAllColumn(T entity); /** * <p> * 插入(批量),該方法不適合 Oracle * </p> * * @param entityList 實體物件列表 * @return boolean */ boolean insertBatch(List<T> entityList); /** * <p> * 插入(批量) * </p> * * @param entityList 實體物件列表 * @param batchSize 插入批次數量 * @return boolean */ boolean insertBatch(List<T> entityList, int batchSize); /** * <p> * 批量修改插入 * </p> * * @param entityList 實體物件列表 * @return boolean */ boolean insertOrUpdateBatch(List<T> entityList); /** * <p> * 批量修改插入 * </p> * * @param entityList 實體物件列表 * @param batchSize * @return boolean */ boolean insertOrUpdateBatch(List<T> entityList, int batchSize); /** * <p> * 批量修改或插入全部欄位 * </p> * * @param entityList 實體物件列表 * @return boolean */ boolean insertOrUpdateAllColumnBatch(List<T> entityList); /** * 批量修改或插入全部欄位 * * @param entityList 實體物件列表 * @param batchSize * @return boolean */ boolean insertOrUpdateAllColumnBatch(List<T> entityList, int batchSize); /** * <p> * 根據 ID 刪除 * </p> * * @param id 主鍵ID * @return boolean */ boolean deleteById(Serializable id); /** * <p> * 根據 columnMap 條件,刪除記錄 * </p> * * @param columnMap 表字段 map 物件 * @return boolean */ boolean deleteByMap(Map<String, Object> columnMap); /** * <p> * 根據 entity 條件,刪除記錄 * </p> * * @param wrapper 實體包裝類 {@link Wrapper} * @return boolean */ boolean delete(Wrapper<T> wrapper); /** * <p> * 刪除(根據ID 批量刪除) * </p> * * @param idList 主鍵ID列表 * @return boolean */ boolean deleteBatchIds(Collection<? extends Serializable> idList); /** * <p> * 根據 ID 選擇修改 * </p> * * @param entity 實體物件 * @return boolean */ boolean updateById(T entity); /** * <p> * 根據 ID 修改全部欄位 * </p> * * @param entity 實體物件 * @return boolean */ boolean updateAllColumnById(T entity); /** * <p> * 根據 whereEntity 條件,更新記錄 * </p> * * @param entity 實體物件 * @param wrapper 實體包裝類 {@link Wrapper} * @return boolean */ boolean update(T entity, Wrapper<T> wrapper); /** * <p> * 根據 whereEntity 條件,自定義set值更新記錄 * </p> * * @param setStr set值字串 * @param wrapper 實體包裝類 {@link Wrapper} * @return boolean */ boolean updateForSet(String setStr, Wrapper<T> wrapper); /** * <p> * 根據ID 批量更新 * </p> * * @param entityList 實體物件列表 * @return boolean */ boolean updateBatchById(List<T> entityList); /** * <p> * 根據ID 批量更新 * </p> * * @param entityList 實體物件列表 * @param batchSize 更新批次數量 * @return boolean */ boolean updateBatchById(List<T> entityList, int batchSize); /** * <p> * 根據ID 批量更新全部欄位 * </p> * * @param entityList 實體物件列表 * @return boolean */ boolean updateAllColumnBatchById(List<T> entityList); /** * <p> * 根據ID 批量更新全部欄位 * </p> * * @param entityList 實體物件列表 * @param batchSize 更新批次數量 * @return boolean */ boolean updateAllColumnBatchById(List<T> entityList, int batchSize); /** * <p> * TableId 註解存在更新記錄,否插入一條記錄 * </p> * * @param entity 實體物件 * @return boolean */ boolean insertOrUpdate(T entity); /** * 插入或修改一條記錄的全部欄位 * * @param entity 實體物件 * @return boolean */ boolean insertOrUpdateAllColumn(T entity); /** * <p> * 根據 ID 查詢 * </p> * * @param id 主鍵ID * @return T */ T selectById(Serializable id); /** * <p> * 查詢(根據ID 批量查詢) * </p> * * @param idList 主鍵ID列表 * @return List<T> */ List<T> selectBatchIds(Collection<? extends Serializable> idList); /** * <p> * 查詢(根據 columnMap 條件) * </p> * * @param columnMap 表字段 map 物件 * @return List<T> */ List<T> selectByMap(Map<String, Object> columnMap); /** * <p> * 根據 Wrapper,查詢一條記錄 * </p> * * @param wrapper 實體物件 * @return T */ T selectOne(Wrapper<T> wrapper); /** * <p> * 根據 Wrapper,查詢一條記錄 * </p> * * @param wrapper {@link Wrapper} * @return Map<String,Object> */ Map<String, Object> selectMap(Wrapper<T> wrapper); /** * <p> * 根據 Wrapper,查詢一條記錄 * </p> * * @param wrapper {@link Wrapper} * @return Object */ Object selectObj(Wrapper<T> wrapper); /** * <p> * 根據 Wrapper 條件,查詢總記錄數 * </p> * * @param wrapper 實體物件 * @return int */ int selectCount(Wrapper<T> wrapper); /** * <p> * 查詢列表 * </p> * * @param wrapper 實體包裝類 {@link Wrapper} * @return */ List<T> selectList(Wrapper<T> wrapper); /** * <p> * 翻頁查詢 * </p> * * @param page 翻頁物件 * @return */ Page<T> selectPage(Page<T> page); /** * <p> * 查詢列表 * </p> * * @param wrapper {@link Wrapper} * @return */ List<Map<String, Object>> selectMaps(Wrapper<T> wrapper); /** * <p> * 根據 Wrapper 條件,查詢全部記錄 * </p> * * @param wrapper 實體物件封裝操作類(可以為 null) * @return List<Object> */ List<Object> selectObjs(Wrapper<T> wrapper); /** * <p> * 翻頁查詢 * </p> * * @param page 翻頁物件 * @param wrapper {@link Wrapper} * @return */ @SuppressWarnings("rawtypes") Page<Map<String, Object>> selectMapsPage(Page page, Wrapper<T> wrapper); /** * <p> * 翻頁查詢 * </p> * * @param page 翻頁物件 * @param wrapper 實體包裝類 {@link Wrapper} * @return */ Page<T> selectPage(Page<T> page, Wrapper<T> wrapper); }
在使用的過程中,mybatis-plus還能相容原有mybatis的xml和註解模式的sql拼寫功能。
mybatis-plus這種集mybatis與hibernate的優點一起的框架。提供了hibernate的單表CRUD操作的方便同時,又保留了mybatis的特性。
不得不說mybatis-plus的出現搭配上原有的mybatis框架極大的促進了開發效率的提升,同時基友搭配,效率翻倍。因此也有人把它們比做成魂鬥羅裡面的兩兄弟,基友搭配,效率翻倍。
本案例的程式碼連結:
https://gitee.com/IdeaHome_admin/wfw
推薦閱讀
1. SpringBoot 整合篇
2. 手寫一套迷你版HTTP伺服器
3. 記住:永遠不要在MySQL中使用UTF-8
4. Springboot啟動原理解析<