您好,登錄后才能下訂單哦!
這篇文章主要介紹“分析Mybatis-plus(MP)中CRUD操作”,在日常操作中,相信很多人在分析Mybatis-plus(MP)中CRUD操作問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”分析Mybatis-plus(MP)中CRUD操作”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
1. 直接使用jdbc,訪問數據庫,創建Connection,ResultSet
2. 把jdbc操作進行了封裝,創建了很多工具類,比如DBUtil
3. 持久層框架
(1)hibernate:全程的ORM框架。 實現java object ---表的映射,操作java對象操作數據庫表
可以使用hibernate訪問不同的數據庫,不需要改變代碼
(2)jpa規范:hibernate open-jpa ,link(定義一樣的方法操作數據庫)
(3)mybatis:編寫xml文件,在xml中編寫sql語句,訪問數據庫,任何操作都需要使用xml文件
需要熟悉sql語言,開發效率低一些,單表的CRUD也需要使用xml文件編寫sql語句
(4)Mybatis-plus 簡稱MP,對mybatis的增強,在mybatis-plus之外加一層,單表操作
可以不使用xml文件,分頁,性能統計,邏輯刪除等。
MyBatis-Plus(簡稱 MP )是一個 MyBatis 的增強工具,在 MyBatis 的基礎上只做增強不做改變,為簡化開發、提高效率而生。Mybatis-Plus 在 MyBatis 之上套了一層外衣,單表 CURD 的操作幾乎都可以由 MyBatis-Plus 代替執行。而且提供了各種查詢方式,分頁行為。作為使用者無需編寫 xml,直接調用 MyBatis-Plus 提供的 API 就可以了。
官網:http://mp.baomidou.com/
1.無侵入:只做增強不做改變,引入它不會對現有工程產生影響,如絲般順滑
2.損耗小:啟動即會自動注入基本 CURD,性能基本無損耗,直接面向對象操作
3.強大的 CRUD 操作:內置通用 Mapper、通用 Service,僅僅通過少量配置即可實現單表大部分 CRUD 操作,
更有強大的條件構造器,滿足各類使用需求
4.支持 Lambda 形式調用:通過 Lambda 表達式,方便的編寫各類查詢條件,無需再擔心字段寫錯
5.支持主鍵自動生成:支持多達 4 種主鍵策略(內含分布式唯一 ID 生成器 - Sequence),
可自由配置,完美解決主鍵問題
6.支持 ActiveRecord 模式:支持 ActiveRecord 形式調用,
實體類只需繼承 Model 類即可進行強大的 CRUD 操作
7.支持自定義全局通用操作:支持全局通用方法注入( Write once, use anywhere )
8.內置代碼生成器:采用代碼或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 層代碼,
支持模板引擎,更有超多自定義配置等您來使用
9.內置分頁插件:基于 MyBatis 物理分頁,開發者無需關心具體操作,
配置好插件之后,寫分頁等同于普通 List 查詢
10.分頁插件支持多種數據庫:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多種數據庫
11.內置性能分析插件:可輸出 SQL 語句以及其執行時間,建議開發測試時啟用該功能,能快速揪出慢查詢
12.內置全局攔截插件:提供全表 delete 、 update 操作智能分析阻斷,也可自定義攔截規則,預防誤操作
CREATE TABLE USER ( id INT ( 11 ) NOT NULL AUTO_INCREMENT, NAME VARCHAR ( 50 ) DEFAULT NULL, email VARCHAR ( 80 ) DEFAULT NULL, age INT ( 11 ) DEFAULT NULL, PRIMARY KEY ( id ) ) ENGINE = INNODB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8;
(1)新建的Spring Boot 工程
(2)指定maven的mp坐標
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.3.2</version> </dependency>
(3)指定數據庫的驅動
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency>
在application.yml中進行配置數據庫(數據庫名plus)
spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/plus?useSSL=false&serverTimezone=UTC username: root password: root
(4)創建實體類 定義屬性 指定主鍵的類型
public class User { /** * 指定主鍵的方式 * value:主鍵字段的名稱,如果是id可以不用寫 * type:指定主鍵的類型,主鍵的值如何生成:IdType.AUTO表示自動增長 */ @TableId(value ="id",type = IdType.AUTO) private Integer id; private String name; private String email; private Integer age;
(5)創建dao接口,需要繼承BaseMapper<實體.class>
/** * @author 王恒杰 * @Description: * 自定義的mapper,dao接口 * 1.實現BaseMapper * 2.要指定實體類對象 * * BaseMapper是mybatis-plus的對象,定義了17個方法(crud) */ public interface UserMapper extends BaseMapper<User> { }
(6)在springboot的啟動類上,加入@MappperScan(value=“指定dao接口的包名”);
/** * @author 王恒杰 * @MapperScan:掃描器,指定Mapper所在的包名 */ @SpringBootApplication @MapperScan(value = "com.tjcu.mapper") public class MybatisPlusApplication { public static void main(String[] args) { SpringApplication.run(MybatisPlusApplication.class, args); } }
(7)測試使用
在測試類或Service注入Dao接口,框架使用動態代理 創建Dao的實現類對象 。
調用BaseMapper 中的方法,完成CRUD操作
/* SuppressWarnings:該批注的作用是給編譯器一條指令, 告訴它對被批注的代碼元素內部的某些警告保持靜默。 添加@SuppressWarnings("all")之后 private UserMapper UserDao;中的UserDao才不報錯 */ @SuppressWarnings("all") @SpringBootTest class MybatisPlusApplicationTests { /** 使用自動注入,注入Mapper對象(Dao) * @Autowired 注釋,它可以對類成員變量、方法及構造函數進行標注, * 完成自動裝配的工作。 通過 @Autowired的使用來消除 set ,get方法。 */ @Autowired private UserMapper UserDao; /** * 測試添加操作 */ @Test public void testUserInsert() { //創建User對象 User user = new User(); user.setName("王恒杰"); user.setAge(20); user.setEmail("123@qq.com"); //調用UserMapper的方法,也就是父接口BaseMapper中提供的方法 int i = UserDao.insert(user); System.out.println(i); } }
@Autowired解釋
@Autowired 注釋,它可以對類成員變量、方法及構造函數進行標注,完成自動裝配的工作。
通過 @Autowired的使用來消除 set ,get方法。
@SuppressWarnings(“all”)解釋
@SuppressWarnings:該批注的作用是給編譯器一條指令,
告訴它對被批注的代碼元素內部的某些警告保持靜默。
在application.yml中進行配置
mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
配置日志文件后的控制臺
操作插入數據之前數據庫的數據
測試代碼
/** * 測試添加數據后,獲取主鍵值 */ @Test public void testUserInsertGetId() { User user = new User(); user.setName("楊福君"); user.setAge(19); user.setEmail("10019@qq.com"); int rows = UserDao.insert(user); //獲取主鍵的id,剛添加數據的id ,getId主鍵字段對應的get方法 Integer id = user.getId(); System.out.println("主鍵的id"+id); }
操作插入數據之后數據庫的數據
BaseMapper接口中的更新方法(源碼 )
int updateById(@Param("et") T entity); int update(@Param("et") T entity, @Param("ew") Wrapper<T> updateWrapper);
(1)更新數據實現 更新數據之前數據庫的數據
mybatis-plus封裝的sql語句
UPDATE user SET name=?, email=?, age=? WHERE id=?
測試代碼
/** * 更新用戶 */ @Test public void updateUser(){ User user = new User(); user.setName("被修改后的王恒杰"); user.setAge(22); user.setEmail("1259387078@qq.com"); //被更改的用戶 user.setId(2); //更新所有非null的值 int i = UserDao.updateById(user); System.out.println("影響行數"+i); }
更新數據之后數據庫的數據
(2)更新數據的是所有非null的值
int updateById(@Param("et") T entity);
這個方法更新的是所有非null的值,如果實體類是int類型的(非包裝類型),那這個數就自動更改為0
將age的類型改為int之后
@TableId(value ="id",type = IdType.AUTO) private Integer id; private String name; private String email; private int age;
測試代碼
/** * 更新用戶,只更新姓名數據 */ @Test public void updateUser(){ User user = new User(); user.setName("被修改后的楊福君"); //被更改的用戶 user.setId(3); //更新所有非null的值 int i = UserDao.updateById(user); System.out.println("影響行數"+i); }
mybatis-plus封裝的sql語句
UPDATE user SET name=?, age=? WHERE id=?
更新數據之后數據庫的數據
注意: 我們使用mybatis-plus時實體類最好使用包裝類型 ,避免出現基本數據類型 ,更新數據時,沒修改的為0的情況
BaseMapper接口中的刪除方法(源碼 )
1.int deleteById(Serializable id);
2.int deleteByMap(@Param("cm") Map<String, Object> columnMap);
3.int delete(@Param("ew") Wrapper<T> wrapper);
4.int deleteBatchIds(@Param("coll") Collection<? extends Serializable> idList);
(1)deleteById:按主鍵刪除 刪除數據之前數據庫的數據
測試代碼
/** * 刪除用戶 * 按主鍵刪除一條用戶 * 方法為:deleteById * 參數:主鍵值 * 返回值:是刪除的成功的記錄數 */ @Test public void deleteUserById(){ int i = UserDao.deleteById(2); System.out.println(i); }
mybatis-plus封裝的sql語句
DELETE FROM user WHERE id=?
刪除數據之后數據庫的數據
(2)根據Map中條件刪除
刪除數據之前數據庫的數據
測試代碼
/** * 按條件刪除數據,條件是封裝到Map對象中 * 方法:deleteByMap(map對象) */ @Test public void deleteUserByMap(){ // 創建Map對象,保存條件值 HashMap<String, Object> map = new HashMap<>(); map.put("name","王恒杰"); map.put("age",20); //DELETE FROM user WHERE name = ? AND age = ? int i = UserDao.deleteByMap(map); System.out.println(i); }
mybatis-plus封裝的sql語句
DELETE FROM user WHERE name = ? AND age = ?
刪除數據之后數據庫的數據
(3)批量刪除
刪除數據之前數據庫的數據
測試代碼
/** * 批量刪除 * deleteBatchIds(@Param("coll") Collection<? extends Serializable> idList); */ @Test public void deleteBatchIds(){ ArrayList<Integer> ids = new ArrayList<>(); ids.add(4); ids.add(5); ids.add(6); int i = UserDao.deleteBatchIds(ids); System.out.println(i); }
mybatis-plus封裝的sql語句
DELETE FROM user WHERE id IN ( ? , ? , ? )
刪除數據之后數據庫的數據
(4)使用Lambda表達式實現批量刪除
批量刪除數據之前數據庫的數據
測試代碼
/** * Lambda實現批量刪除 * deleteBatchIds(@Param("coll") Collection<? extends Serializable> idList); */ @Test public void deleteByLambda(){ List<Integer> ids= Stream.of(3, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19).collect(Collectors.toList()); int i = UserDao.deleteBatchIds(ids); System.out.println(i); }
mybatis-plus封裝的sql語句
DELETE FROM user WHERE id IN ( ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? )
批量刪除數據之后數據庫的數據
BaseMapper接口中的查詢十種 方法(源碼 )
//通過id查詢 T selectById(Serializable id); //批量查詢 List<T> selectBatchIds(@Param("coll") Collection<? extends Serializable> idList); //多個條件查詢 List<T> selectByMap(@Param("cm") Map<String, Object> columnMap); //查詢一個對象 T selectOne(@Param("ew") Wrapper<T> queryWrapper); //統計的count值 Integer selectCount(@Param("ew") Wrapper<T> queryWrapper); //條件查詢 List<T> selectList(@Param("ew") Wrapper<T> queryWrapper); List<Map<String, Object>> selectMaps(@Param("ew") Wrapper<T> queryWrapper); List<Object> selectObjs(@Param("ew") Wrapper<T> queryWrapper); //分頁查詢 <E extends IPage<T>> E selectPage(E page, @Param("ew") Wrapper<T> queryWrapper); <E extends IPage<Map<String, Object>>> E selectMapsPage(E page, @Param("ew") Wrapper<T> queryWrapper);
(1)根據 id 主鍵查詢
測試代碼
/** * 通過id查詢 * 如果根據主鍵沒有查到數據,得到的返回值是null * */ @Test public void selectUserById(){ User user = UserDao.selectById(26); System.out.println(user); }
mybatis-plus封裝的sql語句
SELECT id,name,email,age FROM user WHERE id=?
控制臺展示
(2)批量查詢記錄 測試代碼
/** * 實現批處理查詢,根據多個主鍵查詢,獲取到list * 方法:selectBatchIds * 參數:id集合 * 返回值:list<T> */ @Test public void selectBatchIds(){ ArrayList<Integer> ids = new ArrayList<>(); ids.add(23); ids.add(24); ids.add(25); ids.add(26); List<User> users = UserDao.selectBatchIds(ids); for (User user : users) { System.out.println(user); } }
mybatis-plus封裝的sql語句
SELECT id,name,email,age FROM user WHERE id IN ( ? , ? , ? , ? )
控制臺輸出結果
(3)Lambda實現批量查詢
測試代碼
/** * 使用Lambda實現批處理查詢,根據多個主鍵查詢,獲取到list * 方法:selectBatchIdsByLambda * 參數:id集合 * 返回值:list<T> */ @Test public void selectBatchIdsByLambda(){ List<Integer> ids = Stream.of(24, 25, 26, 27, 28).collect(Collectors.toList()); List<User> users = UserDao.selectBatchIds(ids); //遍歷 for (int i = 0; i < users.size(); i++) { System.out.println("查詢出來的第"+(i+1)+"個用戶:"+users.get(i)); } }
mybatis-plus封裝的sql語句
SELECT id,name,email,age FROM user WHERE id IN ( ? , ? , ? , ? , ? )
控制臺輸出結果
(4)使用Map條件查詢查詢單個用戶
測試代碼
//查詢單個用戶 HashMap<String, Object> map1 = new HashMap<>(); // 姓名:楊福君 map1.put("name", "楊福君"); // 年齡 :19 map1.put("age", 19); List<User> users = UserDao.selectByMap(map1); for (User user : users) { System.out.println(user); }
mybatis-plus封裝的sql語句
//查詢單個用戶 HashMap<String, Object> map1 = new HashMap<>(); // 姓名:楊福君 map1.put("name", "楊福君"); // 年齡 :19 map1.put("age", 19); List<User> users = UserDao.selectByMap(map1); for (User user : users) { System.out.println(user); }
控制臺輸出結果
(5)使用Map條件查詢查詢多個用戶 測試代碼
//詢多個用戶 HashMap<String, Object> map2 = new HashMap<>(); // 姓名:王恒杰 map2.put("name", "王恒杰"); // 年齡 :21 map2.put("age", 21); List<User> users1 = UserDao.selectByMap(map2); for (User user : users1) { System.out.println(user); }
mybatis-plus封裝的sql語句
SELECT id,name,email,age FROM user WHERE name = ? AND age = ?
控制臺輸出結果
通過使用動態代理 的方式來生成dao對象,來調用sqlSession底層方法,對mybatis進行封裝和增強,用mybatis-plus替代mybatis
到此,關于“分析Mybatis-plus(MP)中CRUD操作”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。