1,MyBatisPlus入門案例與簡介
1. 入門案例
-
MybatisPlus(簡稱MP)是基于MyBatis框架基礎(chǔ)上開發(fā)的增強(qiáng)型工具,旨在簡化開發(fā)、提供效率。
-
開發(fā)方式
- 基于MyBatis使用MyBatisPlus
- 基于Spring使用MyBatisPlus
- 基于SpringBoot使用MyBatisPlus
SpringBoot剛剛我們學(xué)習(xí)完成,它能快速構(gòu)建Spring開發(fā)環(huán)境用以整合其他技術(shù),使用起來是非常簡單,對于MP的學(xué)習(xí),我們也基于SpringBoot來構(gòu)建學(xué)習(xí)。
學(xué)習(xí)之前,我們先來回顧下,SpringBoot整合Mybatis的開發(fā)過程:
- 創(chuàng)建SpringBoot工程
- 勾選配置使用的技術(shù),能夠?qū)崿F(xiàn)自動添加起步依賴包
- 設(shè)置dataSource相關(guān)屬性(JDBC參數(shù))
·
- 定義數(shù)據(jù)層接口映射配置
我們可以參考著上面的這個實(shí)現(xiàn)步驟把SpringBoot整合MyBatisPlus來快速實(shí)現(xiàn)下,具體的實(shí)現(xiàn)步驟為:
步驟1:創(chuàng)建數(shù)據(jù)庫及表
create database if not exists mybatisplus_db character set utf8;
use mybatisplus_db;
CREATE TABLE user (
id bigint(20) primary key auto_increment,
name varchar(32) not null,
password varchar(32) not null,
age int(3) not null ,
tel varchar(32) not null
);
insert into user values(1,'Tom','tom',3,'18866668888');
insert into user values(2,'Jerry','jerry',4,'16688886666');
insert into user values(3,'Jock','123456',41,'18812345678');
步驟2:創(chuàng)建SpringBoot工程
步驟3:勾選配置使用技術(shù)
說明:
- 由于MP并未被收錄到idea的系統(tǒng)內(nèi)置配置,無法直接選擇加入,需要手動在pom.xml中配置添加
步驟4:pom.xml補(bǔ)全依賴
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.16</version>
</dependency>
說明:
-
druid數(shù)據(jù)源可以加也可以不加,SpringBoot有內(nèi)置的數(shù)據(jù)源,可以配置成使用Druid數(shù)據(jù)源
-
從MP的依賴關(guān)系可以看出,通過依賴傳遞已經(jīng)將MyBatis與MyBatis整合Spring的jar包導(dǎo)入,我們不需要額外在添加MyBatis的相關(guān)jar包
步驟5:添加MP的相關(guān)配置信息
resources默認(rèn)生成的是properties配置文件,可以將其替換成yml文件,并在文件中配置數(shù)據(jù)庫連接的相關(guān)信息:application.yml
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatisplus_db?serverTimezone=UTC
username: root
password: root
說明:serverTimezone是用來設(shè)置時區(qū),UTC是標(biāo)準(zhǔn)時區(qū),和咱們的時間差8小時,所以可以將其修改為Asia/Shanghai
步驟6:根據(jù)數(shù)據(jù)庫表創(chuàng)建實(shí)體類
public class User {
private Long id;
private String name;
private String password;
private Integer age;
private String tel;
//setter...getter...toString方法略
}
步驟7:創(chuàng)建Dao接口
@Mapper
public interface UserDao extends BaseMapper<User>{
}
步驟8:編寫引導(dǎo)類
@SpringBootApplication
//@MapperScan("com.itheima.dao")
public class Mybatisplus01QuickstartApplication {
public static void main(String[] args) {
SpringApplication.run(Mybatisplus01QuickstartApplication.class, args);
}
}
說明: Dao接口要想被容器掃描到,有兩種解決方案:
- 方案一:在Dao接口上添加
@Mapper
注解,并且確保Dao處在引導(dǎo)類所在包或其子包中- 該方案的缺點(diǎn)是需要在每一Dao接口中添加注解
- 方案二:在引導(dǎo)類上添加
@MapperScan
注解,其屬性為所要掃描的Dao所在包- 該方案的好處是只需要寫一次,則指定包下的所有Dao接口都能被掃描到,
@Mapper
就可以不寫。
- 該方案的好處是只需要寫一次,則指定包下的所有Dao接口都能被掃描到,
步驟9:編寫測試類
@SpringBootTest
class MpDemoApplicationTests {
@Autowired
private UserDao userDao;
@Test
public void testGetAll() {
List<User> userList = userDao.selectList(null);
System.out.println(userList);
}
}
說明:
userDao注入的時候下面有紅線提示的原因是什么?
-
UserDao是一個接口,不能實(shí)例化對象
-
只有在服務(wù)器啟動IOC容器初始化后,由框架創(chuàng)建DAO接口的代理對象來注入
-
現(xiàn)在服務(wù)器并未啟動,所以代理對象也未創(chuàng)建,IDEA查找不到對應(yīng)的對象注入,所以提示報紅
-
一旦服務(wù)啟動,就能注入其代理對象,所以該錯誤提示不影響正常運(yùn)行。
查看運(yùn)行結(jié)果:
跟之前整合MyBatis相比,你會發(fā)現(xiàn)我們不需要在DAO接口中編寫方法和SQL語句了,只需要繼承BaseMapper
接口即可。整體來說簡化很多。
2. MybatisPlus簡介
MyBatisPlus(簡稱MP)是基于MyBatis框架基礎(chǔ)上開發(fā)的增強(qiáng)型工具,旨在簡化開發(fā)、提高效率
通過剛才的案例,相信大家能夠體會簡化開發(fā)和提高效率這兩個方面的優(yōu)點(diǎn)。
MyBatisPlus的官網(wǎng)為:https://mp.baomidou.com/
說明:
官方文檔中有一張很多小伙伴比較熟悉的圖片:
從這張圖中我們可以看出MP旨在成為MyBatis的最好搭檔,而不是替換MyBatis,所以可以理解為MP是MyBatis的一套增強(qiáng)工具,它是在MyBatis的基礎(chǔ)上進(jìn)行開發(fā)的,我們雖然使用MP但是底層依然是MyBatis的東西,也就是說我們也可以在MP中寫MyBatis的內(nèi)容。
對于MP的學(xué)習(xí),大家可以參考著官方文檔來進(jìn)行學(xué)習(xí),里面都有詳細(xì)的代碼案例。
MP的特性:
- 無侵入:只做增強(qiáng)不做改變,不會對現(xiàn)有工程產(chǎn)生影響
- 強(qiáng)大的 CRUD 操作:內(nèi)置通用 Mapper,少量配置即可實(shí)現(xiàn)單表CRUD 操作
- 支持 Lambda:編寫查詢條件無需擔(dān)心字段寫錯
- 支持主鍵自動生成
- 內(nèi)置分頁插件
- ……
2,標(biāo)準(zhǔn)數(shù)據(jù)層開發(fā)
在這一節(jié)中我們重點(diǎn)學(xué)習(xí)的是數(shù)據(jù)層標(biāo)準(zhǔn)的CRUD(增刪改查)的實(shí)現(xiàn)與分頁功能。代碼比較多,我們一個個來學(xué)習(xí)。
1. 標(biāo)準(zhǔn)CRUD使用
對于標(biāo)準(zhǔn)的CRUD功能都有哪些以及MP都提供了哪些方法可以使用呢?
我們先來看張圖:
對于這張圖的方法,我們挨個來演示下:
首先說下,案例中的環(huán)境就是咱們?nèi)腴T案例的內(nèi)容,第一個先來完成新增
功能
2. 新增
在進(jìn)行新增之前,我們可以分析下新增的方法:
int insert (T t)
-
T:泛型,新增用來保存新增數(shù)據(jù)
-
int:返回值,新增成功后返回1,沒有新增成功返回的是0
在測試類中進(jìn)行新增操作:
@SpringBootTest
class Mybatisplus01QuickstartApplicationTests {
@Autowired
private UserDao userDao;
@Test
void testSave() {
User user = new User();
user.setName("熱愛編程的小白白");
user.setPassword("root");
user.setAge(21);
user.setTel("111111111111111");
userDao.insert(user);
}
}
執(zhí)行測試后,數(shù)據(jù)庫表中就會添加一條數(shù)據(jù)。
但是數(shù)據(jù)中的主鍵ID,有點(diǎn)長,那這個主鍵ID是如何來的?我們更想要的是主鍵自增,應(yīng)該是4才對,這個是我們后面要學(xué)習(xí)的主鍵ID生成策略,這塊的這個問題,我們暫時先放放。
3. 刪除
在進(jìn)行刪除之前,我們可以分析下刪除的方法:
int deleteById (Serializable id)
-
Serializable:參數(shù)類型
- 思考:參數(shù)類型為什么是一個序列化類?
從這張圖可以看出,
* String和Number是Serializable的子類,
* Number又是Float,Double,Integer等類的父類,
* 能作為主鍵的數(shù)據(jù)類型都已經(jīng)是Serializable的子類,
* MP使用Serializable作為參數(shù)類型,就好比我們可以用Object接收任何數(shù)據(jù)類型一樣。
- int:返回值類型,數(shù)據(jù)刪除成功返回1,未刪除數(shù)據(jù)返回0。
在測試類中進(jìn)行新增操作:
@SpringBootTest
class Mybatisplus01QuickstartApplicationTests {
@Autowired
private UserDao userDao;
@Test
void testDelete() {
userDao.deleteById(1652872713464844290L);
}
}
4. 修改
在進(jìn)行修改之前,我們可以分析下修改的方法:
int updateById(T t);
-
T:泛型,需要修改的數(shù)據(jù)內(nèi)容,注意因?yàn)槭歉鶕?jù)ID進(jìn)行修改,所以傳入的對象中需要有ID屬性值
-
int:返回值,修改成功后返回1,未修改數(shù)據(jù)返回0
在測試類中進(jìn)行新增操作:
@SpringBootTest
class Mybatisplus01QuickstartApplicationTests {
@Autowired
private UserDao userDao;
@Test
void testUpdate() {
User user = new User();
user.setId(1L);
user.setName("Tom888");
user.setPassword("tom888");
userDao.updateById(user);
}
}
說明: 修改的時候,只修改實(shí)體對象中有值的字段。
5. 根據(jù)ID查詢
在進(jìn)行根據(jù)ID查詢之前,我們可以分析下根據(jù)ID查詢的方法:
T selectById (Serializable id)
- Serializable:參數(shù)類型,主鍵ID的值
- T:根據(jù)ID查詢只會返回一條數(shù)據(jù)
在測試類中進(jìn)行新增操作:
@SpringBootTest
class Mybatisplus01QuickstartApplicationTests {
@Autowired
private UserDao userDao;
@Test
void testGetById() {
User user = userDao.selectById(2L);
System.out.println(user);
}
}
6. 查詢所有
在進(jìn)行查詢所有之前,我們可以分析下查詢所有的方法:
List<T> selectList(Wrapper<T> queryWrapper)
- Wrapper:用來構(gòu)建條件查詢的條件,目前我們沒有可直接傳為Null
- List:因?yàn)椴樵兊氖撬校苑祷氐臄?shù)據(jù)是一個集合
在測試類中進(jìn)行新增操作:
@SpringBootTest
class Mybatisplus01QuickstartApplicationTests {
@Autowired
private UserDao userDao;
@Test
void testGetAll() {
List<User> userList = userDao.selectList(null);
System.out.println(userList);
}
}
我們所調(diào)用的方法都是來自于DAO接口繼承的BaseMapper類中。里面的方法有很多,我們后面會慢慢去學(xué)習(xí)里面的內(nèi)容。
7. Lombok
代碼寫到這,我們會發(fā)現(xiàn)DAO接口類的編寫現(xiàn)在變成最簡單的了,里面什么都不用寫。反過來看看模型類的編寫都需要哪些內(nèi)容:
- 私有屬性
- setter…getter…方法
- toString方法
- 構(gòu)造函數(shù)
雖然這些內(nèi)容不難,同時也都是通過IDEA工具生成的,但是過程還是必須得走一遍,那么對于模型類的編寫有沒有什么優(yōu)化方法?就是我們接下來要學(xué)習(xí)的Lombok。
概念
- Lombok,一個Java類庫,提供了一組注解,簡化POJO實(shí)體類開發(fā)。
使用步驟
步驟1:添加lombok依賴
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<!--<version>1.18.12</version>-->
</dependency>
注意: 版本可以不用寫,因?yàn)镾pringBoot中已經(jīng)管理了lombok的版本。
步驟2:安裝Lombok的插件
新版本IDEA已經(jīng)內(nèi)置了該插件,如果刪除setter和getter方法程序有報紅,則需要安裝插件
如果在IDEA中找不到lombok插件,可以訪問如下網(wǎng)站
https://plugins.jetbrains.com/plugin/6317-lombok/versions
根據(jù)自己IDEA的版本下載對應(yīng)的lombok插件,下載成功后,在IDEA中采用離線安裝的方式進(jìn)行安裝。
步驟3:模型類上添加注解
Lombok常見的注解有:
- @Setter:為模型類的屬性提供setter方法
- @Getter:為模型類的屬性提供getter方法
- @ToString:為模型類的屬性提供toString方法
- @EqualsAndHashCode:為模型類的屬性提供equals和hashcode方法
- @Data:是個組合注解,包含上面的注解的功能
- @NoArgsConstructor:提供一個無參構(gòu)造函數(shù)
- @AllArgsConstructor:提供一個包含所有參數(shù)的構(gòu)造函數(shù)
Lombok的注解還有很多,上面標(biāo)紅的三個是比較常用的,其他的大家后期用到了,再去補(bǔ)充學(xué)習(xí)。
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Long id;
private String name;
private String password;
private Integer age;
private String tel;
}
說明:
Lombok只是簡化模型類的編寫,我們之前的方法也能用,比如有人會問:我如果只想要有name和password的構(gòu)造函數(shù),該如何編寫?
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Long id;
private String name;
private String password;
private Integer age;
private String tel;
public User(String name, String password) {
this.name = name;
this.password = password;
}
}
這種方式是被允許的。
8. 分頁功能
基礎(chǔ)的增刪改查就已經(jīng)學(xué)習(xí)完了,剛才我們在分析基礎(chǔ)開發(fā)的時候,有一個分頁功能還沒有實(shí)現(xiàn),在MP中如何實(shí)現(xiàn)分頁功能,就是咱們接下來要學(xué)習(xí)的內(nèi)容。
分頁查詢使用的方法是:
IPage<T> selectPage(IPage<T> page, Wrapper<T> queryWrapper)
- IPage:用來構(gòu)建分頁查詢條件
- Wrapper:用來構(gòu)建條件查詢的條件,目前我們沒有可直接傳為Null
- IPage:返回值,你會發(fā)現(xiàn)構(gòu)建分頁條件和方法的返回值都是IPage
IPage是一個接口,我們需要找到它的實(shí)現(xiàn)類來構(gòu)建它,具體的實(shí)現(xiàn)類,可以進(jìn)入到IPage類中按ctrl+h,會找到其有一個實(shí)現(xiàn)類為Page
。
步驟1:調(diào)用方法傳入?yún)?shù)獲取返回值
@SpringBootTest
class Mybatisplus01QuickstartApplicationTests {
@Autowired
private UserDao userDao;
//分頁查詢
@Test
void testSelectPage(){
//1 創(chuàng)建IPage分頁對象,設(shè)置分頁參數(shù),1為當(dāng)前頁碼,3為每頁顯示的記錄數(shù)
IPage<User> page=new Page<>(1,2);
//2 執(zhí)行分頁查詢
userDao.selectPage(page,null);
//3 獲取分頁結(jié)果
System.out.println("當(dāng)前頁碼值:"+page.getCurrent());
System.out.println("每頁顯示數(shù):"+page.getSize());
System.out.println("一共多少頁:"+page.getPages());
System.out.println("一共多少條數(shù)據(jù):"+page.getTotal());
System.out.println("數(shù)據(jù):"+page.getRecords());
}
}
步驟2:設(shè)置分頁攔截器
這個攔截器MP已經(jīng)為我們提供好了,我們只需要將其配置成Spring管理的bean對象即可。
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
//1 創(chuàng)建MybatisPlusInterceptor攔截器對象
MybatisPlusInterceptor mpInterceptor=new MybatisPlusInterceptor();
//2 添加分頁攔截器
mpInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return mpInterceptor;
}
}
說明: 上面的代碼記不住咋辦呢?
這些內(nèi)容在MP的官方文檔中有詳細(xì)的說明,我們可以查看官方文檔類配置
步驟3:運(yùn)行測試程序
如果想查看MP執(zhí)行的SQL語句,可以修改application.yml配置文件,
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印SQL日志到控制臺
打開日志后,就可以在控制臺打印出對應(yīng)的SQL語句,開啟日志功能性能就會受到影響,調(diào)試完后記得關(guān)閉。
筆記來自:黑馬程序員SSM框架教程
2,「Java核心技術(shù)大會 2023」6月重磅啟動,邀你共同探討Java生態(tài)
大會簡介
人工智能在22年、23年的再次爆發(fā)讓Python成為編程語言里最大的贏家;云原生的持續(xù)普及令Go、Rust等新生的語言有了進(jìn)一步叫板傳統(tǒng)技術(shù)體系的資本與底氣。我們必須承認(rèn)在近幾年里,Java陣營的確受到了前所未有的挑戰(zhàn),出現(xiàn)了更多更強(qiáng)大的競爭者。
但是,迄今Java仍然有著非常龐大的開發(fā)者生態(tài),仍是使用人數(shù)最多的編程語言,仍是服務(wù)端應(yīng)用、大數(shù)據(jù)應(yīng)用、企業(yè)級產(chǎn)品的首選。
本屆技術(shù)大會由國內(nèi)Java技術(shù)傳播領(lǐng)軍機(jī)構(gòu)機(jī)械工業(yè)出版社華章分社發(fā)起,周志明、李三紅、楊曉峰三位大會主席,與近30位國內(nèi)外頂級專家將從Java語言、平臺和趨勢,Java應(yīng)用開發(fā)和系統(tǒng)架構(gòu),以及Java性能優(yōu)化等方面帶來8大專場,24場主題分享。2023年6月25日-7月1日,讓我們相約「 Java核心技術(shù)大會 」!
PART 1 特邀啟動專場
PART 2 Java語言、平臺和趨勢專場
PART 3 Java應(yīng)用開發(fā)專場
PART 4 Java應(yīng)用與系統(tǒng)架構(gòu)專場
PART 5 Java應(yīng)用性能優(yōu)化專場
PART 6 大數(shù)據(jù)與數(shù)據(jù)庫專場
PART 7 云原生與Serverless專場
PART 8 AI驅(qū)動的Java編程專場
「Java核心技術(shù)大會 2023」
Core Java Week
2023年6月25日-7月1日
邀您相約
共同深入探討 Java 生態(tài)!
直播預(yù)約:視頻號“IT閱讀排行榜
現(xiàn)場參與更有
- 贏取Java核心技術(shù) 紙書&視頻課
- 帶走CoreJava限量周邊
- 鎖定購物袋超秒福利
- 加入交流群,向?qū)<艺埥?、學(xué)習(xí)
- 第一時間獲取PPT等增值資源
文章來源:http://www.zghlxwxcb.cn/news/detail-498936.html
3,文末福利
? 《Java核心技術(shù)卷Ⅰ》和《Java核心技術(shù)卷Ⅱ》任選其一免費(fèi)包郵送出!
?活動時間:截止到 2023-06-26 20:00:00
? 抽獎方式:利用程序進(jìn)行抽獎。
?參與方式:關(guān)注博主、點(diǎn)贊、收藏、評論區(qū)評論 “ 人生苦短,我愛java”
?本次活動一共贈書5本,評論區(qū)抽取5位小伙伴免費(fèi)送出??!
? 活動截止時間: 2023-06-26 20:00:00
?中獎名單?
代碼前哨站
封奚澤優(yōu)
舒一笑
弘弘弘弘~
想辦法搞懂Java的小孫文章來源地址http://www.zghlxwxcb.cn/news/detail-498936.html
到了這里,關(guān)于【MyBatis-Plus】入門案例與簡介的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!