vue原理(四)效果圖
MyBatisPlus
MP是基於mybatis基礎上開發的增強型工具,維勒簡化mybatis開發,提高效率
因為企業中最常用的是SpringBoot所以我們主要研究基於SpringBoot使用Mybatis
快速入門
首先建立boot專案,你發現沒有MP對應的啟動依賴,於是我們要自己配,選好mysql的,點選完成(注意第一件事是更改Maven路徑)
手動匯入必要依賴
<!-- 新增MyBatisPlus依賴--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.2</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.16</version> </dependency>
隨後配置好資料來源
接著寫好domain(get,set,tostring)
接著就可以完成dao介面層了
之前springboot專案我們寫dao介面是要自己去寫裡面的抽象方法再在介面上用@Mapper宣告,現在用了MP之後我們只用繼承BaseMapper並且傳入對應實體類,再用@Mapper宣告就可以進行測試了
@Mapper
public interface UserDao extends BaseMapper<User> {
}
@SpringBootTest class MyBatisPlusQuickstarApplicationTests { @Autowired private UserDao userDao; @Test void testGetAll() { List<User> userList = userDao.selectList(null); System.out.println(userList); } }
這直接可以返回所有資料(注意這裡只有單表才可以多表要進行配置)
MyBatisPlus介紹
詳細接受和教程直接看官網https://baomidou.com/,這是國人寫的而且教程適合新手,建議看完
標準資料層開發
在以上快速入門的基礎上來測試MP自帶的介面(注意在不配置具體表的情況下單表的資料庫才能直接測)
@SpringBootTest class MyBatisPlusQuickstarApplicationTests { @Autowired private UserDao userDao; @Test void testSave(){ User user=new User(); user.setUsername("zhangsan"); user.setEmail("[email protected]"); user.setPassword("sbsbsb"); int insert = userDao.insert(user); System.out.println(insert); } @Test void testDelete(){ userDao.deleteById(4); } @Test void testUpdate(){ User user=new User(); user.setId(6); user.setUsername("老六"); int i = userDao.updateById(user); System.out.println(i); } @Test void testGeiById(){ User user = userDao.selectById(6); System.out.println(user); } }
補充個簡化實體類開發的依賴lombok(小辣椒)
首先匯入依賴(因為是springboot專案版本號就不寫了)
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
//用lombok建立實體類,就只用自己宣告屬性就可以了
@Setter
@Getter
@ToString
public class User {
private int id;
private String username;
private String email;
private String password;
還有的相關注解
@Setter
@Getter
@ToString
@NoArgsConstructor//無參構造方法
@AllArgsConstructor//有參構造方法
@EqualsAndHashCode//equals方法
@Date最常用相當於以上全部註解
標準分頁功能製作
首先我們要開啟mp這個功能就要到攔截器中新增分頁的攔截器
接著就可以測試其自帶的分頁介面了
// 測試分頁功能介面
@Test
void testGetByPage(){
IPage page=new Page(1,2);
userDao.selectPage(page,null);
System.out.println("當前頁碼值;"+page.getCurrent());
System.out.println("每頁顯示數;"+page.getSize());
System.out.println("總頁數;"+page.getPages());
System.out.println("總條數;"+page.getTotal());
System.out.println("資料;"+page.getRecords());
}
這裡要看底層實現可以到方法中去看也可以開啟mp的日誌
開啟方式如下
到我們的yml配置檔案中配置
# 開啟mp的日誌(輸出到控制檯的日誌)
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
要開啟其他方式的日誌需要其他的配置(一般做測試將日誌關了,遇到問題才打開)
條件查詢
條件查詢三種格式
首先日誌檔案較多導致我們不容易直接看到結果,我們現在配置檔案中簡化下日誌的顯示
方式一:
@Test
void testGetAll() {
//按條件查詢
QueryWrapper qw=new QueryWrapper();//wrapper介面實現查詢的實現類
//新增條件
qw.lt("id",3);//id小於3的所有資料
List<User> userList = userDao.selectList(qw);
System.out.println(userList);
}
方式二:lambda格式的條件查詢
// 方式二:lambda格式的條件查詢(要在實現類中用泛型指定資料庫對應的實體類)
QueryWrapper<User> qw=new QueryWrapper<User>();
qw.lambda().lt(User::getId,4);
List<User> userList = userDao.selectList(qw);
System.out.println(userList);
方式三:用LambdaQueryWrapper實現類簡化方式二
// 方式三,簡化方式二
LambdaQueryWrapper<User> lqw=new LambdaQueryWrapper<User>();
lqw.lt(User::getId,3);
List<User> userList = userDao.selectList(qw);
System.out.println(userList);
多條件查詢直接加條件就好了
// 多條件查詢id在1-3之間的資料
LambdaQueryWrapper<User> lqw=new LambdaQueryWrapper<User>();
//lqw.lt(User::getId,3);
//lqw.gt(User::getId,1);
lqw.lt(User::getId,3).gt(User::getId,1);
//and多條件直接寫成這種鏈式語句
List<User> userList = userDao.selectList(lqw);
System.out.println(userList);
}
// 多條件查詢id在2-3之外的資料
LambdaQueryWrapper<User> lqw=new LambdaQueryWrapper<User>();
lqw.lt(User::getId,2).or().gt(User::getId,3);
//or()
List<User> userList = userDao.selectList(lqw);
System.out.println(userList);
條件查詢null值處理
原始方法用if判斷條件是否為空(不推薦,會導致程式碼出現多個if語句)
推薦使用條件控制引數的方式
只有前面的條件判斷為true,後面的語句才有效
查詢投影
設定查詢結果的樣式
就是設定要顯示的列
查詢條件
主要就是一些方法的使用
其餘的方法去看官文
條件構造器 | MyBatis-Plus (baomidou.com)
對映匹配相容性
當表列名和我們實體類的列名不一致的時候
編碼中添加了資料庫中沒有定義的屬性
採用預設查詢開放了所有欄位的檢視許可權(包括密碼這種不能顯示的資料,只用返回的json裡面有就能被想辦法獲取)
表名和實體類名字不對應(這樣mp不知道我們到底要查哪張表,這就是之前我們說的只能查單表的資料庫)
在實體類上用@TableName繫結對應的表名
一個數據庫中所有的表中都有相同的字首,我們也可以直接配置全域性配置,將所有的實體類字首都加上,這裡假設所有表的字首都是tb_
db-config:
table-prefix: tb_
這樣就不用在實體類上使用@TableName註解了
id生成策略(主鍵生成)
全部策略請看官文
主鍵策略 | MyBatis-Plus (baomidou.com)
預設策略auto
我們一般到配置檔案中直接更改預設的策略
db-config:
id-type: assign_id
多資料操作(刪除&查詢)
邏輯刪除
建議使用全域性配置邏輯欄位
一代配置了邏輯查詢,則用mp的刪除操作就變成了update操作,只是將對應的邏輯欄位變成已刪除標記
mp的查詢所有也變成只查詢邏輯欄位是未刪除的資料
要想查全部只有自己寫sql語句進行查詢
樂觀鎖
之前jdbc,和web開發也講過,遇到並發現象帶來的資源同時搶佔問題,我們就要給資源上鎖,免得同一個資源被多執行緒搶佔
MP中通過攔截器可以實現樂觀鎖(只能解決中小型執行緒出現的問題)
一個樂觀鎖開發如下
version讓同一個資源只能讓一個執行緒操作,操作時拿到資料對應version,使其加1,其他執行緒也相對這個資料進行操作的時候發現version和資料提供的version對不上,則不能完成操作
程式碼生成器(瞭解)
首先建立好boot專案,匯入所需依賴,以下是需要手動匯入的
<!-- 新增MyBatisPlus依賴-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.2</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.16</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
<!-- 程式碼生成器-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.4.1</version>
</dependency>
<!--velocity模板引擎,使用其提供的模板-->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.3</version>
</dependency>
執行你發現彈出了生成好的目錄
裡面的檔案是根據資料庫實現的,但是生成位置是預設位置,我們可以建立個管理類去更改其配置
一般配置所需程式碼如下
package com.ember;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
public class CodeGenerator {
public static void main(String[] args) {
//1.獲取程式碼生成器的物件
AutoGenerator autoGenerator = new AutoGenerator();
//設定資料庫相關配置
DataSourceConfig dataSource = new DataSourceConfig();
dataSource.setDriverName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/mybatisplus_db?serverTimezone=UTC");
dataSource.setUsername("root");
dataSource.setPassword("root");
autoGenerator.setDataSource(dataSource);
//設定全域性配置
GlobalConfig globalConfig = new GlobalConfig();
globalConfig.setOutputDir(System.getProperty("user.dir")+"/mybatisplus_04_generator/src/main/java"); //設定程式碼生成位置
globalConfig.setOpen(false); //設定生成完畢後是否開啟生成程式碼所在的目錄
globalConfig.setAuthor("黑馬程式設計師"); //設定作者
globalConfig.setFileOverride(true); //設定是否覆蓋原始生成的檔案
globalConfig.setMapperName("%sDao"); //設定資料層介面名,%s為佔位符,指代模組名稱
globalConfig.setIdType(IdType.ASSIGN_ID); //設定Id生成策略
autoGenerator.setGlobalConfig(globalConfig);
//設定包名相關配置
PackageConfig packageInfo = new PackageConfig();
packageInfo.setParent("com.aaa"); //設定生成的包名,與程式碼所在位置不衝突,二者疊加組成完整路徑
packageInfo.setEntity("domain"); //設定實體類包名
packageInfo.setMapper("dao"); //設定資料層包名
autoGenerator.setPackageInfo(packageInfo);
//策略設定
StrategyConfig strategyConfig = new StrategyConfig();
strategyConfig.setInclude("tbl_user"); //設定當前參與生成的表名,引數為可變引數
strategyConfig.setTablePrefix("tbl_"); //設定資料庫表的字首名稱,模組名 = 資料庫表名 - 字首名 例如: User = tbl_user - tbl_
strategyConfig.setRestControllerStyle(true); //設定是否啟用Rest風格
strategyConfig.setVersionFieldName("version"); //設定樂觀鎖欄位名
strategyConfig.setLogicDeleteFieldName("deleted"); //設定邏輯刪除欄位名
strategyConfig.setEntityLombokModel(true); //設定是否啟用lombok
autoGenerator.setStrategy(strategyConfig);
//2.執行生成操作
autoGenerator.execute();
}
}
根據需求配置好了就執行就好了