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、對(duì)象關(guān)系映射 (ORM):
ActiveRecord 是一種對(duì)象關(guān)系映射 (ORM) 模式的實(shí)現(xiàn)。它將數(shù)據(jù)庫中的表格(或集合)映射到應(yīng)用程序中的對(duì)象。每個(gè)數(shù)據(jù)庫表格對(duì)應(yīng)于一個(gè) ActiveRecord 模型類,而表格中的每一行數(shù)據(jù)則對(duì)應(yīng)于該模型類的一個(gè)實(shí)例對(duì)象。
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 等)則對(duì)應(yīng)于模型類中的屬性。
4、CRUD 操作:
ActiveRecord 模式使得執(zhí)行 CRUD 操作變得簡單和直觀。通過模型類,我們可以輕松地執(zhí)行創(chuàng)建(Create)、讀取(Read)、更新(Update)和刪除(Delete)這些基本的數(shù)據(jù)庫操作,而無需編寫復(fù)雜的 SQL 查詢語句。
5、關(guān)聯(lián)和查詢:
ActiveRecord 支持定義和使用關(guān)聯(lián)關(guān)系,比如一對(duì)一、一對(duì)多、多對(duì)多等關(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)目中已注入對(duì)應(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操作測(cè)試
/**
* 測(cè)試查詢所有
*/
@Test
public void testSelectAll() {
System.out.println(("----- selectAll method test ------"));
User user = new User();
List<User> userList = user.selectAll();
userList.forEach(System.out::println);
}
/**
* 測(cè)試新增
*/
@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());
}
/**
* 測(cè)試單條查詢
*/
@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());
}
/**
* 測(cè)試修改
*/
@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());
}
/**
* 測(cè)試刪除
*/
@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 工具類
說明:對(duì)selectList查詢后的結(jié)果用Stream流進(jìn)行了一些封裝,使其可以返回一些指定結(jié)果,簡潔了api的調(diào)用需要項(xiàng)目中已注入對(duì)應(yīng)實(shí)體的BaseMapper
測(cè)試代碼示例
@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);
}
/**
* 測(cè)試查詢 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);
});
}
/**
* 測(cè)試查詢 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);
});
}
/**
* 測(cè)試查詢 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);
});
}
/**
* 測(cè)試查詢 group 返回為Map<屬性,分組后對(duì)集合進(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);
});
}
/**
* 測(cè)試查詢 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)目中已注入對(duì)應(yīng)實(shí)體的BaseMapper對(duì)于參數(shù)為Wrapper的,需要在Wrapper中傳入Entity或者EntityClass供尋找對(duì)應(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring AOP攔截-三種方式實(shí)現(xiàn)自動(dòng)代理詳解
這篇文章主要介紹了Spring AOP攔截-三種方式實(shí)現(xiàn)自動(dòng)代理詳解,還是比較不錯(cuò)的,這里分享給大家,供需要的朋友參考。2017-11-11
SpringMVC結(jié)合天氣api實(shí)現(xiàn)天氣查詢
這篇文章主要為大家詳細(xì)介紹了SpringMVC結(jié)合天氣api實(shí)現(xiàn)天氣查詢,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
Apache 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)對(duì)象的方法,是在程序運(yùn)行時(shí)根據(jù)需要?jiǎng)討B(tài)的創(chuàng)建目標(biāo)類的代理對(duì)象。本文將通過案例詳細(xì)講解一下Java動(dòng)態(tài)代理的原理及實(shí)現(xiàn),需要的可以參考一下2022-07-07
maven profile動(dòng)態(tài)選擇配置文件詳解
這篇文章主要介紹了maven profile動(dòng)態(tài)選擇配置文件詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
apollo與springboot集成實(shí)現(xiàn)動(dòng)態(tài)刷新配置的教程詳解
這篇文章主要介紹了apollo與springboot集成實(shí)現(xiàn)動(dòng)態(tài)刷新配置,本文分步驟給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06
JavaFx實(shí)現(xiàn)登錄成功跳轉(zhuǎn)到程序主頁面
這篇文章主要為大家詳細(xì)介紹了JavaFx實(shí)現(xiàn)登錄成功跳轉(zhuǎn)到程序主頁面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06
SpringBoot整合Mybatis-Plus+Druid實(shí)現(xiàn)多數(shù)據(jù)源配置功能
本文主要講解springboot?+mybatisplus?+?druid?實(shí)現(xiàn)多數(shù)據(jù)源配置功能以及一些必要的準(zhǔn)備及代碼說明,具有一定的參考價(jià)值,感興趣的小伙伴可以借鑒一下2023-06-06
Spring 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

