Mybatis Plus ActiveRecord模式的具體使用
DEMO源碼地址 https://gitee.com/JackSong2019/demo-mybatis3.git
前言
ActiveRecord 模式 簡介
ActiveRecord 是一種設(shè)計(jì)模式,它是一種在軟件開發(fā)中用于管理關(guān)系數(shù)據(jù)庫的模式,他簡化了數(shù)據(jù)庫操作的流程,使得開發(fā)人員可以更專注于業(yè)務(wù)邏輯而非數(shù)據(jù)庫細(xì)節(jié)。它提供了一種面向?qū)ο蟮姆椒▉硖幚頂?shù)據(jù)庫,使得數(shù)據(jù)庫操作變得更加直觀、易于維護(hù)和擴(kuò)展。
1、對象關(guān)系映射 (ORM):
ActiveRecord 是一種對象關(guān)系映射 (ORM) 模式的實(shí)現(xiàn)。它將數(shù)據(jù)庫中的表格(或集合)映射到應(yīng)用程序中的對象。每個(gè)數(shù)據(jù)庫表格對應(yīng)于一個(gè) ActiveRecord 模型類,而表格中的每一行數(shù)據(jù)則對應(yīng)于該模型類的一個(gè)實(shí)例對象。
2、模型類(Model Class):
在 ActiveRecord 中,模型類是應(yīng)用程序中操作數(shù)據(jù)庫的主要組件。每個(gè)模型類代表一個(gè)數(shù)據(jù)庫表格,并且可以用于查詢、插入、更新和刪除表格中的數(shù)據(jù)。模型類通常繼承自框架提供的 ActiveRecord 基類,這個(gè)基類提供了許多用于數(shù)據(jù)庫操作的方法和功能。
3、數(shù)據(jù)表與字段映射:
ActiveRecord 模式通過約定俗成的方式將數(shù)據(jù)表中的字段映射到模型類的屬性。例如,一個(gè)數(shù)據(jù)庫表格中的 users 表可能會(huì)映射到一個(gè) User 模型類,表中的每個(gè)字段(如 id、name、email 等)則對應(yīng)于模型類中的屬性。
4、CRUD 操作:
ActiveRecord 模式使得執(zhí)行 CRUD 操作變得簡單和直觀。通過模型類,我們可以輕松地執(zhí)行創(chuàng)建(Create)、讀?。≧ead)、更新(Update)和刪除(Delete)這些基本的數(shù)據(jù)庫操作,而無需編寫復(fù)雜的 SQL 查詢語句。
5、關(guān)聯(lián)和查詢:
ActiveRecord 支持定義和使用關(guān)聯(lián)關(guān)系,比如一對一、一對多、多對多等關(guān)系。這使得在處理復(fù)雜的數(shù)據(jù)模型時(shí)更加便捷。同時(shí),ActiveRecord 提供了強(qiáng)大的查詢接口,允許開發(fā)人員使用鏈?zhǔn)秸{(diào)用的方式構(gòu)建復(fù)雜的數(shù)據(jù)庫查詢,而無需直接編寫 SQL。
6、數(shù)據(jù)驗(yàn)證和回調(diào):
ActiveRecord 提供了內(nèi)置的數(shù)據(jù)驗(yàn)證功能,可以確保數(shù)據(jù)的完整性和一致性。開發(fā)人員可以在模型類中定義驗(yàn)證規(guī)則,以確保數(shù)據(jù)符合預(yù)期的格式和約束。此外ActiveRecord 還支持回調(diào)機(jī)制,允許在數(shù)據(jù)保存、更新等操作前后執(zhí)行特定的代碼。
一、前置條件
JDK版本 Springboot版本 MybatisPlus版本
- JDK 17 以上
- SpringBoot 3.+ 以上
- MybatisPlus 3.+ 以上
說明: 實(shí)體類只需繼承 Model 類即可進(jìn)行強(qiáng)大的 CRUD 操作 ; 需要項(xiàng)目中已注入對應(yīng)實(shí)體的BaseMapper
二、示例數(shù)據(jù)腳本
將腳本數(shù)據(jù)腳本導(dǎo)入到數(shù)據(jù)庫中
-- user 表Schema 腳本 DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( id BIGINT NOT NULL AUTO_INCREMENT COMMENT '主鍵ID', name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名', age INT NULL DEFAULT NULL COMMENT '年齡', email VARCHAR(50) NULL DEFAULT NULL COMMENT '郵箱', PRIMARY KEY (id) ); -- Data 腳本 DELETE FROM `user`; INSERT INTO `user` (id, name, age, email) VALUES (1, 'Jone', 18, 'test1@baomidou.com'), (2, 'Jack', 20, 'test2@baomidou.com'), (3, 'Tom', 28, 'test3@baomidou.com'), (4, 'Sandy', 21, 'test4@baomidou.com'), (5, 'Billie', 24, 'test5@baomidou.com');
三、初始化工程
1、 創(chuàng)建一個(gè)空的 Spring Boot 工程
提示 :
a、可以使用 Spring Initializer (opens new window)快速初始化一個(gè) Spring Boot 工程
b、也可以創(chuàng)建一個(gè)maven空工程,然后按需要引入依賴
添加依賴
2、 引入 Spring Boot Starter 父工程
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <!-- 因?yàn)槭褂玫膍ybatis plus 3.+ 所以需要指定springboot3.+以上的版本 --> <version>3.1.5</version> <relativePath/> </parent>
3、 引入 spring-boot-starter、spring-boot-starter-test、mybatis-plus-boot-starter、mysql 依賴:
<dependencies> <!-- SpringBoot --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <scope>provided</scope> </dependency> <!-- mybatis plus3 --> <dependency> <groupId>com.baomidou</groupId> <!--3.5.4開始,支持SpringBoot3使用此版本--> <artifactId>mybatis-plus-spring-boot3-starter</artifactId> <version>3.5.4</version> </dependency> <!-- mysql --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> <scope>runtime</scope> </dependency> </dependencies>
4、 配置application.yml 文件 主要是數(shù)據(jù)庫連接信息
spring: datasource: url: jdbc:mysql://localhost:3306/test_db?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver
5、 添加啟動(dòng)類,在 Spring Boot 啟動(dòng)類中添加 @MapperScan 注解,掃描 Mapper 文件夾
package org.example; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication @MapperScan("org.example.mapper") public class DemoMybatis3Application { public static void main(String[] args) { SpringApplication.run(DemoMybatis3Application.class, args); } }
6、編寫 User 實(shí)體類 及 UserMapper 接口
@Data @TableName("`user`") public class User extends Model<User>{ private Long id; private String name; private Integer age; private String email; }
public interface UserMapper extends BaseMapper<User> { }
7、 CRUD操作測試
/** * 測試查詢所有 */ @Test public void testSelectAll() { System.out.println(("----- selectAll method test ------")); User user = new User(); List<User> userList = user.selectAll(); userList.forEach(System.out::println); } /** * 測試新增 */ @Test public void add() { System.out.println(("----- add method test ------")); User user = new User(); user.setName("趙六"); user.setAge(30); user.setEmail("zhaoliu@163.com"); user.insert(); System.out.println(user.toString()); } /** * 測試單條查詢 */ @Test public void getOne() { System.out.println(("----- getOne method test ------")); User user = new User(); // user.setId(9L); // user = user.selectById(); user = user.selectById(9L); System.out.println(user.toString()); } /** * 測試修改 */ @Test public void update() { System.out.println(("----- update method test ------")); User user = new User(); user.setId(9L); user.setName("趙六六"); user.setAge(33); user.setEmail("zhaoliu@163.com"); user.updateById(); System.out.println(user.toString()); } /** * 測試刪除 */ @Test public void del() { System.out.println(("----- del method test ------")); User user = new User(); // user.setId(9L); // user.deleteById(); boolean b = user.deleteById(9L); System.out.println(b); }
8、 SimpleQuery 工具類
說明:對selectList查詢后的結(jié)果用Stream流進(jìn)行了一些封裝,使其可以返回一些指定結(jié)果,簡潔了api的調(diào)用需要項(xiàng)目中已注入對應(yīng)實(shí)體的BaseMapper
測試代碼示例
@Test public void listOperate() { System.out.println(("----- SimpleQuery listOperate method test ------")); List<String> userNames = new java.util.ArrayList<>(); List<String> emails = new java.util.ArrayList<>(); // 該查詢 追加了 獲取id集,打印,獲取name集,獲取email集的操作 List<Long> ids = SimpleQuery.list(lambdaQuery(), User::getId, System.out::println, user -> userNames.add(user.getName()), user -> emails.add(user.getEmail())); // 打印ids ids.forEach(System.out::println); // 打印userNames userNames.forEach(System.out::println); // 打印emails emails.forEach(System.out::println); } /** * 測試查詢 keyMap 返回為Map<屬性,實(shí)體> */ @Test public void keyMap() { System.out.println(("----- SimpleQuery keyMap method test ------")); // 查詢表內(nèi)記錄,封裝返回為Map<屬性,實(shí)體> // Map<Long,User> userMap = SimpleQuery.keyMap(Wrappers.lambdaQuery(), // User::getId); // 查詢表內(nèi)記錄,封裝返回為Map<屬性,實(shí)體>,考慮了并行流的情況 Map<Long,User> userMap = SimpleQuery.keyMap(lambdaQuery(), User::getId,true); userMap.forEach((k,v)->{ System.out.println(k+"-->"+v); }); } /** * 測試查詢 map 返回為Map<屬性,屬性> */ @Test public void map() { System.out.println(("----- SimpleQuery map method test ------")); // 查詢表內(nèi)記錄,封裝返回為Map<屬性,屬性> // Map<Long,String> userMap = SimpleQuery.map(Wrappers.lambdaQuery(), // User::getId,User::getName); // 查詢表內(nèi)記錄,封裝返回為Map<屬性,屬性>,考慮了并行流的情況 Map<Long,String> userMap = SimpleQuery.map(lambdaQuery(), User::getId,User::getEmail,true); userMap.forEach((k,v)->{ System.out.println(k+"-->"+v); }); } /** * 測試查詢 group 返回為Map<屬性,List<實(shí)體>> */ @Test public void group() { System.out.println(("----- SimpleQuery group method test ------")); // 查詢表內(nèi)記錄,封裝返回為Map<屬性,List<實(shí)體>> // Map<Integer,List<User>> userMap = SimpleQuery.group(Wrappers.lambdaQuery(), // User::getAge); // 查詢表內(nèi)記錄,封裝返回為Map<屬性,List<實(shí)體>>,考慮了并行流的情況 Map<Integer,List<User>> userMap = SimpleQuery.group(lambdaQuery(), User::getAge,true); userMap.forEach((k,v)->{ System.out.println(k+"-->"+v); }); } /** * 測試查詢 group 返回為Map<屬性,分組后對集合進(jìn)行的下游收集器> */ @Test public void groupM() { System.out.println(("----- SimpleQuery groupM method test ------")); // 查詢表內(nèi)記錄,封裝返回為Map<屬性,List<實(shí)體>> // Map<Integer, Set<User>> group = SimpleQuery.group(Wrappers.lambdaQuery(), // User::getAge, Collectors.toSet()); // Map<Integer, Map<Long, String>> group = SimpleQuery.group(Wrappers.lambdaQuery(), // User::getAge, Collectors.toMap(User::getId, User::getName, (a, b) -> a)); // // 查詢表內(nèi)記錄,封裝返回為Map<屬性,List<實(shí)體>>,考慮了并行流的情況 // Map<Integer, Set<User>> group = SimpleQuery.group(Wrappers.lambdaQuery(), // User::getAge, Collectors.toSet(),true); Map<Integer, Map<Long, String>> group = SimpleQuery.group(lambdaQuery(), User::getAge, Collectors.toMap(User::getId, User::getName, (a, b) -> a)); group.forEach((k,v)->{ System.out.println(k+"-->"+v); }); } /** * 測試查詢 list 返回為List<屬性> */ @Test public void list() { System.out.println(("----- SimpleQuery list method test ------")); // 查詢表內(nèi)記錄,封裝返回為List<屬性> // List<String> names = SimpleQuery.list(Wrappers.lambdaQuery(), User::getName); // 查詢表內(nèi)記錄,封裝返回為List<屬性>,考慮了并行流的情況 List<String> names = SimpleQuery.list(lambdaQuery(), User::getName,true); // 打印 names names.forEach(System.out::println); } @Test void testList() { // 我要這張表里的ids List<Long> entityIds = SimpleQuery.list(lambdaQuery(), User::getId); assertThat(entityIds).containsExactly(1L, 2L); // 可疊加后續(xù)操作 List<String> names = SimpleQuery.list(lambdaQuery(), User::getName, e -> Optional.ofNullable(e.getName()) .map(String::toUpperCase) .ifPresent(e::setName)); assertThat(names).containsExactly("RUBEN", null); }
9、Db類
說明:
使用靜態(tài)調(diào)用的方式,執(zhí)行CRUD方法,避免Spring環(huán)境下Service循環(huán)注入、簡潔代碼,提升效率需要項(xiàng)目中已注入對應(yīng)實(shí)體的BaseMapper對于參數(shù)為Wrapper的,需要在Wrapper中傳入Entity或者EntityClass供尋找對應(yīng)的Mapper不建議在循環(huán)中調(diào)用,如果是批量保存,建議將數(shù)據(jù)構(gòu)造好后使用 Db.saveBatch(數(shù)據(jù)) 保存
代碼示例
@Test void dbTest() { // 根據(jù)id查詢 List<User> list = Db.listByIds(Arrays.asList(1L, 2L), User.class); list.stream().forEach(System.out::println); // 根據(jù)條件構(gòu)造器查詢 List<User> list1 = Db.list(Wrappers.lambdaQuery(User.class)); list1.stream().forEach(System.out::println); // 批量根據(jù)id更新 // boolean isSuccess = Db.updateBatchById(list); }
到此這篇關(guān)于Mybatis Plus ActiveRecord模式的具體使用的文章就介紹到這了,更多相關(guān)Mybatis Plus ActiveRecord內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring AOP攔截-三種方式實(shí)現(xiàn)自動(dòng)代理詳解
這篇文章主要介紹了Spring AOP攔截-三種方式實(shí)現(xiàn)自動(dòng)代理詳解,還是比較不錯(cuò)的,這里分享給大家,供需要的朋友參考。2017-11-11SpringMVC結(jié)合天氣api實(shí)現(xiàn)天氣查詢
這篇文章主要為大家詳細(xì)介紹了SpringMVC結(jié)合天氣api實(shí)現(xiàn)天氣查詢,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05Apache Commons Math3學(xué)習(xí)之?dāng)?shù)值積分實(shí)例代碼
這篇文章主要介紹了Apache Commons Math3學(xué)習(xí)之?dāng)?shù)值積分實(shí)例代碼,涉及使用辛普森積分的例子,這里分享給大家,供需要的朋友參考。2017-10-10一文了解Java動(dòng)態(tài)代理的原理及實(shí)現(xiàn)
動(dòng)態(tài)代理指的是,代理類和目標(biāo)類的關(guān)系在程序運(yùn)行的時(shí)候確定的,客戶通過代理類來調(diào)用目標(biāo)對象的方法,是在程序運(yùn)行時(shí)根據(jù)需要?jiǎng)討B(tài)的創(chuàng)建目標(biāo)類的代理對象。本文將通過案例詳細(xì)講解一下Java動(dòng)態(tài)代理的原理及實(shí)現(xiàn),需要的可以參考一下2022-07-07maven profile動(dòng)態(tài)選擇配置文件詳解
這篇文章主要介紹了maven profile動(dòng)態(tài)選擇配置文件詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11apollo與springboot集成實(shí)現(xiàn)動(dòng)態(tài)刷新配置的教程詳解
這篇文章主要介紹了apollo與springboot集成實(shí)現(xiàn)動(dòng)態(tài)刷新配置,本文分步驟給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06JavaFx實(shí)現(xiàn)登錄成功跳轉(zhuǎn)到程序主頁面
這篇文章主要為大家詳細(xì)介紹了JavaFx實(shí)現(xiàn)登錄成功跳轉(zhuǎn)到程序主頁面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06SpringBoot整合Mybatis-Plus+Druid實(shí)現(xiàn)多數(shù)據(jù)源配置功能
本文主要講解springboot?+mybatisplus?+?druid?實(shí)現(xiàn)多數(shù)據(jù)源配置功能以及一些必要的準(zhǔn)備及代碼說明,具有一定的參考價(jià)值,感興趣的小伙伴可以借鑒一下2023-06-06Spring Boot整合MyBatis-Plus實(shí)現(xiàn)CRUD操作的示例代碼
本文主要介紹了Spring Boot整合MyBatis-Plus實(shí)現(xiàn)CRUD操作,可以快速實(shí)現(xiàn)數(shù)據(jù)庫的增刪改查操作,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-04-04解決mybatis執(zhí)行SQL語句部分參數(shù)返回NULL問題
這篇文章主要介紹了mybatis執(zhí)行SQL語句部分參數(shù)返回NULL問題,需要的的朋友參考下吧2017-06-06