主頁 > 軟體設計 > MyBatis-Plus快速入門-(干貨滿滿+超詳細)

MyBatis-Plus快速入門-(干貨滿滿+超詳細)

2021-01-17 10:15:38 軟體設計

文章目錄

    • 一、MyBatis VS JPA
    • 二、MyBatis-Plus簡介
    • 三、MyBatis-Plus快速入門
      • 1、lombok簡介及安裝
      • 2、入門小案例
    • 四、基本使用
      • 1、通用傳統模式簡介及通用mapper新增方法
      • 2、常用注解
      • 3、排除非表欄位的三種方式
    • 五、MyBatis-Plus查詢方法
      • 1、普通查詢
      • 2、條件構造器查詢
      • 3、select不列出全部欄位
      • 4、condition作用
      • 5、物體作為條件構造器構造方法的引數
      • 6、AllEq用法
      • 7、其他使用條件構造器的方法
      • 8、lambda條件構造器
    • 六、自定義SQL及分頁查詢
      • 1、使用條件構造器的自定義sql
      • 2、分頁查詢
    • 七、更新與洗掉
      • 1、mybatis-plus更新
      • 2、mybatis-plus洗掉方法
    • 八、AR模式、主鍵策略和基本配置
      • 1、ActiveRecord模式
      • 2、主鍵策略
      • 3、基本配置
    • 九、通用的Service
      • 1、基本方法
      • 2、批量操作操作
      • 3、鏈式呼叫方法

一、MyBatis VS JPA

JPA:
java持久層API,可以理解為一種規范,Hibernate就是其具體一個實作,(目前比較常用的是SpringDataJpa,它是Spring提供的一套簡化開發的框架,按照約定好的方法命名規則,撰寫dao層介面,就可以在不撰寫實作情況下執行資料庫操作,還提供了除CRUD以外的功能,例如分頁、排序、復雜查詢等等,SpringDataJpa可以理解為對JPA的再次封裝,底層仍舊是Hibernate)

Mybatis優勢:
1、SQL陳述句可以自由控制,更靈活、性能較高,
2、SQL與代碼分離,易于閱讀和維護,
3、提供XML標簽,支持撰寫動態SQL陳述句,

JPA優勢:
JPA移植性比較好(Hibernate方言)
提供了很多CRUD方法、開發效率高(不用撰寫sql陳述句)
物件化程度更高(面向物件開發思想)

Mybatis劣勢:
簡單CRUD操作需要撰寫SQL陳述句(單表仍需要撰寫Mapper介面方法和xml的sql)
XML中有大量sql需維護
mybatis自身功能有限

二、MyBatis-Plus簡介

Mybatis-plus簡介:Mybatis增強工具,只做增強,不作改變,簡化開發,提高效率,
在這里插入圖片描述

MP在mybatis啟動的時候,它在mybatis的xml和注解注入之后,緊接著反射分析物體,然后注入到底層容器中,就是注入crud之類的,注入之前MP會進行判斷,是否已經注入同樣的方法,如果已經注入,就不在注入,它的注入時機在容器啟動時,所以MP使用crud、本身是無性能損耗的,

官網地址:https://mybatis.plus/

1、Crab:Mybatisplus3.0教學版,(MP核心程式員作品)

2、Crab:WEB極速開發框架,(MP專案負責人作品)

github專案地址:https://github.com/baomidou/mybatis-plus

碼云專案地址:https://gitee.com/baomidou/mybatis-plus

Mybatis-plus特點:

1、無侵入:Mybatis-Plus 在 Mybatis 的基礎上進行擴展,只做增強不做改變,引入 Mybatis-Plus 不會對您現有的 Mybatis 構架產生任何影響,而且 MP 支持所有 Mybatis 原生的特性

2、依賴少:僅僅依賴 Mybatis 以及 Mybatis-Spring

3、損耗小:啟動即會自動注入基本CRUD,性能基本無損耗,直接面向物件操作

4、通用CRUD操作:內置通用 Mapper、通用 Service,僅僅通過少量配置即可實作單表大部分 CRUD 操作,更有強大的條件構造器,滿足各類使用需求

5、多種主鍵策略:支持多達4種主鍵策略(內含分布式唯一ID生成器),可自由配置,完美解決主鍵問題

6、支持ActiveRecord:支持 ActiveRecord 形式呼叫,物體類只需繼承 Model 類即可實作基本 CRUD 操作

7、支持代碼生成:采用代碼或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 層代碼,支持模板引擎,更有超多自定義配置等您來使用(P.S. 比 Mybatis 官方的 Generator 更加強大!)
支持自定義全域通用操作:支持全域通用方法注入( Write once, use anywhere )

8、內置分頁插件:基于Mybatis物理分頁,開發者無需關心具體操作,配置好插件之后,寫分頁等同于寫基本List查詢

9、內置性能分析插件:可輸出Sql陳述句以及其執行時間,建議開發測驗時啟用該功能,能有效解決慢查詢

10、內置全域攔截插件:提供全表 delete 、 update 操作智能分析阻斷,預防誤操作

三、MyBatis-Plus快速入門

1、lombok簡介及安裝

lombok作用:提高開發效率,通過注解形式使javabean生成get、set、有引數、無引數、toString等方法,無需手動實作,

倘若不使用lombok可以使用的注解有:
注解介紹:

下面只是介紹了幾個常用的注解,更多的請參見: https://projectlombok.org/features/index.html

@Getter / @Setter

可以作用在類上和屬性上,放在類上,會對所有的非靜態(non-static)屬性生成Getter/Setter方法,放在屬性上,會對該屬性生成Getter/Setter方法,并可以指定Getter/Setter方法的訪問級別,

@EqualsAndHashCode

默認情況下,會使用所有非瞬態(non-transient)和非靜態(non-static)欄位來生成equals和hascode方法,也可以指定具體使用哪些屬性,

@ToString

生成toString方法,默認情況下,會輸出類名、所有屬性,屬性會按照順序輸出,以逗號分割,

@NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor

無參構造器、部分引數構造器、全參構造器,當我們需要多載多個構造器的時候,Lombok就無能為力了,

@Data

@ToString, @EqualsAndHashCode, 所有屬性的@Getter, 所有non-final屬性的@Setter和@RequiredArgsConstructor的組合,通常情況下,我們使用這個注解就足夠了,

IDEA安裝lombok插件:
在這里插入圖片描述
在這里插入圖片描述
然后在maven的pom.xml引入依賴:

  <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.16.10</version>
  </dependency>

2、入門小案例

步驟:
建庫建表===>引入依賴===>配置===>編碼===>測驗

建一個mp名的資料庫,在建一個user表:

#創建資料庫
#使用查看全文
create table user (  id BIGINT(20) PRIMARY key not null comment '主鍵', 
name varchar(30) default null comment '姓名',
age int(11) default null comment '年齡', 
email varchar(50) default null comment '郵箱',   
manager_id BIGINT(20) default null comment '直屬上級id',   
create_time DATETIME default null comment '創建時間',  
CONSTRAINT manager_fk foreign key (manager_id)          
REFERENCES user (id)) ENGINE=INNODB CHARSET=UTF8;
 
#資料初始化
INSERT INTO user (id,name,age,email,manager_id,create_time)
VALUES (1087982257332887553, '豬頭', 20, 'boss@baomidou.com', NULL, 
'2019-01-11 14:20:20'),            
(1088248166370832385,'小懶豬',20,'wtf@baomidou.com', 1087982257332887553,
'2019-02-05 11:12:22'),            
(1088250446457389058,'小白',18,'lyw@baomidou.com', 1088248166370832385,
'2019-02-14 08:31:16'),            
(1094590409767661570,'小黑',21,'zyq@baomidou.com', 1088248166370832385,
'2019-01-14 09:15:15'),            
(1094592041087729666,'小可耐',22,'lhm@baomidou.com', 1088248166370832385,
'2019-01-14 09:48:16');

然后建一個Spring Initializr工程:

pom.xml依賴:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.1.4</version>
    </dependency>

    <!-- Lombok -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>

    <!-- Mybatis-Plus啟動器 -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.1.0</version>
    </dependency>

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

創一個application.yaml,進行配置:

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mp?useSSL=false&serverTimezone=GMT%2B8
    username: root
    password: 1214

撰寫物體類:
entity/User.java:

@Data
@EqualsAndHashCode(callSuper = false)
@TableName("user")
public class User {

    /**
     * 主鍵
     */
    private Long id;

    /**
     * 姓名
     */
    @TableField(value = "name", condition = SqlCondition.LIKE)
    private String name;

    /**
     * 年齡
     */
    @TableField(condition = "%s&lt;#{%s}")
    private Integer age;

    /**
     * 郵箱
     */
    private String email;

    /**
     * 直屬上級id
     */
    private Long managerId;

    /**
     * 創建時間
     */
    private Date createTime;

    /*
     * 備注(不與資料庫欄位對應) # transient 不參與序列化
     */
    @TableField(exist = false)
    private String remark;

}

撰寫dao介面:
UserMapper.java:

public interface UserMapper extends BaseMapper<User> {
}

在啟動類中添加注解:@MapperScan(“com.mp.first_mp.dao”)進行掃描

最后就是撰寫測驗類:

@RunWith(SpringRunner.class)
@SpringBootTest
public class SimpleTest {

    @Autowired
    private UserMapper userMapper;

    @Test
    public void select() {
        List<User> list = userMapper.selectList(null);
        Assert.assertEquals(5, list.size());
        list.forEach(System.out::println);
    }
}

查看效果:
在這里插入圖片描述
運行是成功的,我們可以發現相對于使用MyBatis來說,MyBatis-plus不用撰寫xml檔案撰寫那些繁瑣的SQL陳述句,簡單快速的MyBatis-plus的就到這里,若還有興趣就繼續看下去吧ヾ(?°?°?)ノ゙

四、基本使用

1、通用傳統模式簡介及通用mapper新增方法

相信對SSM比較熟系的小伙伴應該對SSM傳統編程模式都比較熟系:

介面中寫抽象方法===>XML或注解寫SQL===>Service中呼叫介面===>Controller中呼叫

為了方便大家觀察,在application.yaml多增加應該日志的輸出:

logging:
  level:
    root: warn
    com.mp.first_mp.dao: trace
  pattern:
    console: '%p%m%n'

進行測驗:

@Test
    public void insertTest() {
        User user = new User();
        user.setName("小灰");
        user.setAge(20);
        user.setEmail("1980757771@qq.com");
        user.setManagerId(1088248166370832385L);
        user.setCreateTime(new Date());
        int rows = userMapper.insert(user);
        System.out.println("影響記錄數:" + rows);
    }

運行結果:
在這里插入圖片描述
倘若大家觀察得仔細可以發現主鍵id并沒有設定自增,那為什么沒有出現報錯呢???

原來MP的默認主鍵策略是基于雪花演算法的自增主鍵,在MP的原始碼中有雪花演算法的實作代碼,

額~~~可能有小伙伴不知道什么是雪花演算法,大家可以看看這位博主寫的文章:雪花演算法的原理和實作Java

2、常用注解

mybatis-plus:

主鍵采用雪花演算法生成值的前提是物體類的主鍵屬性名稱必須為id,

mybatis-plus:

資料表欄位帶有_的可以自動映射到駝峰式命名的屬性上(t_user——》tUser),

注解:

1.資料庫名不同,在類上增加@TableName(“mp_user”)
2.主鍵ID的駝峰一般無法識別,在主鍵屬性上增加@TableId
3.屬性與欄位名不相同,在屬性上增加@TableField(“name”)

@TableName(“資料庫表名”):

使用場景物體類名稱和資料表名不一致時,通過它指定表名,此時就可以使用mp的單表操作,

@TableId(“主鍵名”):

使用場景物體類屬性名稱和資料表主鍵不是id時,通過它宣告該屬性為主鍵,就可以采用雪花演算法生成主鍵值操作,

@TableField(“欄位名”):

使用場景物體類屬性名稱和資料表欄位名不一致時,通過它指定資料表欄位名稱,就可以和物體類屬性對應,

3、排除非表欄位的三種方式

使用場景: 物體類中的某個屬性不對應表中的任何欄位,只是用于保存臨時資料,或者臨時組裝的資料,

使用方式

1、 transient修飾物體類屬性(修飾的屬性不會被序列化),

缺陷:有些需求需要序列化該欄位,

2、 static修飾屬性(前提手動實作get、set方法,Lombok對靜態屬性不會提供get、set方法),

缺陷:每個物件的屬性值一致,

3、 @TableField(exist=false),這個注解用來表示資料表中不存在該欄位,默認是true,

五、MyBatis-Plus查詢方法

1、普通查詢

普通查詢:使用方式為實作BaseMapper介面物件呼叫該方法,

1、T selectById(Serializable id):使用場景為通過主鍵查詢,只要該主鍵型別實作了Serialzable介面即可,

@Test
public void selectById() {
    User user = userMapper.selectById(6);
    System.out.println(user);
}

2、List selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList):使用場景為通過主鍵的集合去批量查詢,前提主鍵的型別實作了Serializable介面,

@Test
public void selectBatchById() {
    List<Long> userListId = Arrays.asList(1L, 2L, 3L);
    List<User> userList = userMapper.selectBatchIds(userListId);
    userList.forEach(System.out::println);
}

3、List selectByMap(@Param(Constants.COLUMN_MAP) Map<String,Object> columnMap):使用場景為傳入一個Map集合,key為表欄位,value為表欄位值,

注意:Map的key為資料表的欄位名,不是物體類屬性名,

@Test
public void selectByMap() {
    Map<String, Object> userMap = new HashMap<>();
    userMap.put("age", 20);
    List<User> userList = userMapper.selectByMap(userMap);
    userList.forEach(System.out::println);
}

2、條件構造器查詢

BaseMapper以條件構造器(Wrapper)為引數的查詢方法

AbstractWrapper抽象類:提供了很多條件構造器,

http://img2.sycdn.imooc.com/5f8db8a700015a9507830434.jpghttp://img1.sycdn.imooc.com/5f8db8c00001cddf08570416.jpg
在這里插入圖片描述

List selectList(@Param(Constans.WRAPPER) Wrapper queryWrapper):
使用場景:對于一些有特殊條件的查詢,比如模糊查詢、條件查詢等,
使用方法:QueryWrapper為查詢條件構造器,它是AbstractWrapper的一個子類,
生成條件構造器
方式一:QueryWrapper queryWrapper=new QueryWrapper();
方式二:QueryWrapper query=Wrappers.query();

注意: 條件構造器AbstractWrapper的條件構造器方法key都為資料表欄位,value為實際值,例如:like(Column,value)、gt(Column,value)等,

模糊條件構造器:like,小于條件構造器:lt,
在這里插入圖片描述

范圍條件構造器:between,非空條件構造器:isNotNull,
在這里插入圖片描述
模糊右通配符條件構造器:likeRight,或條件構造器:or,
大于等于條件構造器:ge,升序條件構造器:orderAsc,
降序條件構造器:orderDesc,

http://img1.sycdn.imooc.com/5f8dc3100001837607420320.jpg
Mysql函式
date_format(日期,‘格式’):將日期按照格式進行插入或者回傳,
例如: date_format(now(),’%Y-%m-%d’),

http://img4.sycdn.imooc.com/5f8ef2a20001f50504130219.jpg

動態條件構造器:apply,范圍條件構造器:insql,
注意: 如果{0}替換為實際值,可能會造成sql注入,
http://img2.sycdn.imooc.com/5f8eff88000122cf12320275.jpg
and括號條件構造器:and()

http://img1.sycdn.imooc.com/5f90504f00011ec413440280.jpg
注意: 怕有些小伙伴不了解這個是什么:wq -> wq.xxx這種型別的運算式,這個是java8引入的lambda運算式的語法,箭頭左邊是變數名,箭頭右邊是自己撰寫的代碼邏輯,如果感興趣你可以了解一下java的lambda運算式,當然列印方式也是lambda運算式

or括號條件構造器:or()

http://img1.sycdn.imooc.com/5f9051760001f86908160381.jpg

非and開頭的條件構造器:nested()

http://img2.sycdn.imooc.com/5f9052d3000138e107640356.jpg

In條件構造器:In(column,Collection)

http://img1.sycdn.imooc.com/5f90548e0001a0e807960357.jpg

last條件構造器:last(sql),注意:有sql注入風險,確保引數沒有風險再使用,

http://img1.sycdn.imooc.com/5f9055330001271e08440374.jpg

3、select不列出全部欄位

select不列出全部欄位

select(String …columns)

在這里插入圖片描述
如果回傳的欄位數量很多,此時采用如下的select,也可以放置在后面

select(Class entityClass,Predicate predicate)

第一個引數為物體類物件;
第二個引數相當于排除回傳的欄位.

在這里插入圖片描述

4、condition作用

如果使用的是IDEA需要添加依賴pom.xml:

<dependency>
        <groupId>commons-lang</groupId>
        <artifactId>commons-lang</artifactId>
        <version>2.6</version>
    </dependency>

條件構造器(abstractWrapper)中 condition(構造的方法的boolean型別引數) 作用,

如下:like方法呼叫多載的方法,多載方法中第一個引數,

http://img1.sycdn.imooc.com/5f941dbd0001f72a05250160.jpg

作用:該條件是否加入最后生成的sql中,
使用方法:如果為true就加入,如果false就不加入,
使用場景:類似于動態的sql拼接,

傳統使用:

http://img4.sycdn.imooc.com/5f9420460001fc9108520519.jpg

mp方式:

http://img4.sycdn.imooc.com/5f9420e300011afe09010293.jpg

5、物體作為條件構造器構造方法的引數

創建條件構造器時傳入物體物件

private SharedString sqlSelect = new SharedString();

public QueryWrapper() {
    this(null);
}

public QueryWrapper(T entity) {
    super.setEntity(entity);
    super.initNeed();
}

QueryWrapper一個引數的構造方法,如果傳入一個部不為null的物件,默認會進行進行等值比較,也就是where后拼接條件,

注意:通過entity引數生成的等值和QueryWrapper的條件構造方法生成的沒有任何關系,
在這里插入圖片描述

舉例驗證:
http://img3.sycdn.imooc.com/5f94262a000121c409290352.jpg
http://img2.sycdn.imooc.com/5f94262100010ab111120201.jpg
注意:使用時要慎重,因為他們都會在sql中進行拼接,

使用場景:如果允許使用物體類去接受引數,那么就可以不用呼叫條件構造器,而是直接使用構造方法傳入引數即可,

特殊操作:可以通過在物體類上添加注解,指定該屬性使用那種操作,默認使用等值,

SqlCondition類:定義了一些常量,包括等值、不等于、like、左邊like、右邊like,
http://img4.sycdn.imooc.com/5f94279b00015dc407230558.jpg
如果提供的常量無法滿足需求,就可以自己在注解中撰寫常量運算式,例如小于,
http://img4.sycdn.imooc.com/5f942a420001d19007800551.jpg

6、AllEq用法

Alleq(Map<R,V> params)

使用方法:傳入一個map集合物件,就會按照等值進行操作,key為欄位名稱,value為欄位值,如果欄位的值為null,那么sql就會拼接為is null這種形式,
http://img4.sycdn.imooc.com/5f942bb700016fac05630085.jpg
如果傳入的null,想要忽略掉,也就是不進行拼接,那么就傳入第二個引數為false,
http://img2.sycdn.imooc.com/5f942ce30001b2e109700525.jpg

allEq的第二種方法,引數1為過濾函式,它是一個函式式介面,
在這里插入圖片描述

上圖就是判斷name是不等于name,如果不等于就回傳true,就會過濾掉,所以沒有拼接name,也可以判斷值,注意需要考慮型別的問題
在這里插入圖片描述

7、其他使用條件構造器的方法

其他以條件構造器的方法

1、selectMap:List集合的泛型不再是物體,而是map集合,其中key表示欄位名,value表示欄位值,
http://img1.sycdn.imooc.com/5f9572000001a16c10270198.jpg
http://img3.sycdn.imooc.com/5f9573d50001705711540205.jpg

使用場景1:當物體類屬性非常多時,不易查看,如果回傳的是一個物體類,那么即使我們設定了回傳欄位,那么它的值為null,但是屬性仍然存在,如果回傳的是Map型別,當指定了回傳欄位時,那么沒回傳的就不會存在,
http://img3.sycdn.imooc.com/5f9576290001d58e10510123.jpg
http://img4.sycdn.imooc.com/5f9576c20001f8b314280045.jpg

使用場景2:當回傳的不是一條一條記錄時,也就是回傳的欄位不在物體類屬性中,比如一些統計,像平均值,最大值,最小值這樣的,
http://img3.sycdn.imooc.com/5f957b8100017a1411010282.jpg
http://img2.sycdn.imooc.com/5f957b8d0001f6b406370069.jpg

2、selectObject:List集合的泛型不再是物體,而是Object,只回傳第一個欄位的值,其他的會被舍棄,
http://img1.sycdn.imooc.com/5f957d31000199d208730228.jpg
http://img3.sycdn.imooc.com/5f957e25000131e010490264.jpg
http://img4.sycdn.imooc.com/5f957e1b0001a2b413400360.jpg
使用場景:只回傳一列時可以使用它,

3、selectCount:查詢符合條件的總記錄數的,

注意:使用它時,就不能指定回傳的列了,因為它會在后面拼接COUNT(1),
http://img3.sycdn.imooc.com/5f958c2100015fd108430254.jpg
http://img2.sycdn.imooc.com/5f958da70001f85907960205.jpg
http://img4.sycdn.imooc.com/5f958db30001b98607000185.jpg

4、selectOne:查詢符合條件的資料,只會回傳一條資料,

注意: 查詢的結果必須是一潭訓者查不到(多于1條就會報錯),
http://img1.sycdn.imooc.com/5f958eae0001b76709360214.jpg
http://img4.sycdn.imooc.com/5f958fda0001a26708530321.jpg
http://img4.sycdn.imooc.com/5f958fe50001df8913700300.jpg

8、lambda條件構造器

lambda條件構造器(類似mp條件構造器,防誤寫)

lambda條件構造器使用場景:

不需要我們手動在構造條件時去書寫欄位名稱,
http://img3.sycdn.imooc.com/5fc23604000191c909560053.jpg
lambda條件構造器使用方法:
http://img1.sycdn.imooc.com/5fc236e80001837013630842.jpg
lambda條件構造器的創建有3種方式

1、通過查詢構造器QueryWrapper創建

2、通過new直接創建lambda條件構造器

3、通過構造器工具類Wrappers創建(此時需要泛型)
http://img4.sycdn.imooc.com/5fc2323e000189b110150217.jpg
4、3.0.7新增的創建lambda條件構造器,通過LambdaQueryChainWrapper,并且需要一個Mapper介面作為引數(通過原始碼可以,它是對普通查詢構造器的再次封裝,原始碼中仍然是通過Mapper介面去呼叫),
http://img1.sycdn.imooc.com/5fc23ace0001394f15670359.jpg
http://img4.sycdn.imooc.com/5fc23ae10001ed3614840336.jpg

六、自定義SQL及分頁查詢

1、使用條件構造器的自定義sql

使用場景:當使用條件構造器去構造sql的方法不能滿足需求時(前提:mybatisplus版本大于3.0.7),

使用方法:

注意:${ew.customSqlsegment}可以使條件構造器構造的sql被執行,
http://img1.sycdn.imooc.com/5fc302cb00019d7a09610327.jpg
http://img1.sycdn.imooc.com/5fc303c3000141f112020398.jpg
mybatis-plus配置xml檔案路徑(springboot專案):
在這里插入圖片描述

不過由于IDEA系列編輯器,XML檔案是不能放在 java 檔案夾中的,IDEA默認不會編譯原始碼檔案夾中的 XML檔案,所以可以通過在pom.xml中加入:

<build>
	<resources>
       <resource>
       <directory>src/main/java</directory>
          <includes>
              <include>**/*.xml</include>
          </includes>
       </resource>
    </resources>
</build>

即可在xml中進行撰寫SQL陳述句,

2、分頁查詢

分頁查詢

1、mybatis分頁查詢(mybatis的rowBounds實作的分頁不是物理分頁,可以理解為邏輯或者記憶體分頁)

拓展:記憶體分頁弊端,資料量大時占用過多記憶體,第一次查詢速度慢,

2、mybatis-plus插件實作物理分頁

a、配置mybatis-plus插件

http://img1.sycdn.imooc.com/5fc315ef00013b9807540354.jpg
BaseMapper提供了兩個分頁方法:
http://img1.sycdn.imooc.com/5fc309db0001932011160457.jpg
這兩個方法主要區別如下圖,回傳的資料是物體型別,還是map型別,
IPage.java:
在這里插入圖片描述

在這里插入圖片描述

b、分頁使用
在這里插入圖片描述
在這里插入圖片描述
分頁map形式

http://img4.sycdn.imooc.com/5fc312200001f80c13310319.jpg
http://img2.sycdn.imooc.com/5fc312300001da3c14050474.jpg

使用分頁時,不查詢總記錄數:第三個引數為true表示查詢總記錄數,否則就不查詢,
Page.class:
http://img4.sycdn.imooc.com/5fc312990001183507360114.jpg
http://img4.sycdn.imooc.com/5fc312e2000187b513530335.jpg
http://img1.sycdn.imooc.com/5fc312ff0001e0d413860403.jpg

當分頁查詢查詢的是多表時使用分頁:
http://img1.sycdn.imooc.com/5fc31572000183c912680363.jpg
在這里插入圖片描述
在這里插入圖片描述
倘若需要多表聯查,可以在xml檔案里撰寫多表聯查的SQL,一樣可以實作其功能ヾ(?°?°?)ノ゙
如:
在這里插入圖片描述
在這里插入圖片描述
在xml里撰寫需要的多表查詢陳述句即可,

七、更新與洗掉

1、mybatis-plus更新

1、根據id更新

使用場景:根據物體類主鍵屬性進行更新,其他屬性有值就更新,

使用方法:如下
在這里插入圖片描述
http://img1.sycdn.imooc.com/5fc3825e0001e99a06450311.jpg
2、以條件構造器作為引數進行更新

使用場景:更新條件為其他時,

使用方法:如下
在這里插入圖片描述
http://img2.sycdn.imooc.com/5fc3827e00015b2c09570334.jpg
條件構造器傳入物體時的使用(和QueryWrapper類似),它會將物體屬性作為更新的條件,
http://img3.sycdn.imooc.com/5fc3829f0001b3e609050392.jpg
3、條件構造器中set方法使用

如果更新少量欄位可使用如下方式:
http://img1.sycdn.imooc.com/5fc382e80001310913940247.jpg

lambda方式更新:
http://img1.sycdn.imooc.com/5fc383140001864612030260.jpg
通過構造器鏈進行直接更新:
http://img1.sycdn.imooc.com/5fc3833500017b1716720290.jpg

2、mybatis-plus洗掉方法

1、根據id洗掉方法——deleteById(前提:物體類主鍵屬性上有@TableId注解)
http://img4.sycdn.imooc.com/5fc64ceb0001da1c05620157.jpg
在這里插入圖片描述

2、普通洗掉方法
http://img1.sycdn.imooc.com/5fc64d920001ac6d05760260.jpg
http://img2.sycdn.imooc.com/5fc64d9a00013db708460172.jpg
在這里插入圖片描述
在這里插入圖片描述

3、以條件構造器為引數洗掉方法
在這里插入圖片描述

八、AR模式、主鍵策略和基本配置

1、ActiveRecord模式

簡介:活動記錄,領域模型模式,直接通過物體操作資料庫(java的一個物體類對應資料庫的一張表,而一個實體對應表中一行記錄)

MP中AR模式的實作(兩個前提:物體類需要繼承Model;mapper介面實作BaseMapper)
在這里插入圖片描述
在這里插入圖片描述
直接用物體即可操作資料庫:
在這里插入圖片描述
insertOrUpdate():
如果物體的主鍵不是null,那么就會先查詢,如果有記錄就更新,沒有就插入,是null直接進行插入,
在這里插入圖片描述
在這里插入圖片描述

注意:如下圖方法洗掉不存在的也回傳true.
在這里插入圖片描述
在這里插入圖片描述
至于其他方法的使用介紹,可以查看Model.java原始碼?(?????)?

2、主鍵策略

mp的主鍵策略定義在了IdTyoe的列舉類中:(下面是原始碼)
在這里插入圖片描述在這里插入圖片描述
區域策略:
在主鍵欄位配置@TableId(type=IdType.AUTO)
在這里插入圖片描述
全域策略:
在application.yaml配置中添加:
在這里插入圖片描述
注意: 區域策略優于全域策略

3、基本配置

可在查看官網地址:https://mybatis.plus/
在這里插入圖片描述

九、通用的Service

在這里插入圖片描述
在這里插入圖片描述
詳情可查看IService.java的原始碼,
下面是部分方法的使用:

1、基本方法

在這里插入圖片描述
因為資料數大于1,所以默認回傳第一條
在這里插入圖片描述

2、批量操作操作

不指定
在這里插入圖片描述
指定
在這里插入圖片描述
在這里插入圖片描述

3、鏈式呼叫方法

查詢:
在這里插入圖片描述
在這里插入圖片描述
更新:
在這里插入圖片描述
在這里插入圖片描述
洗掉:
在這里插入圖片描述
關于MyBatis-Plus的詳細快速入門的學習就到這里,Thanks?(・ω・)ノ

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/249786.html

標籤:其他

上一篇:IP-Prefix List配置案例

下一篇:SpringBoot請求映射原始碼分析(沒看過原始碼的小白也能懂,比針尖還細)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more