1. 程式人生 > 其它 >vue原理(四)效果圖

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();
    }
}

根據需求配置好了就執行就好了