欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MyBatis-Plus快速入门-(干货满满+超详细)

程序员文章站 2022-03-26 22:17:53
文章目录一、MyBatis VS JPA二、MyBatis-Plus简介三、MyBatis-Plus快速入门1、lombok简介及安装2、入门小案例四、基本使用1、通用传统模式简介及通用mapper新增方法2、常用注解3、排除非表字段的三种方式五、MyBatis-Plus查询方法一、MyBatis VS JPAJPA: java持久层API,可以理解为一种规范,Hibernate就是其具体一个实现。(目前比较常用的是SpringDataJpa,它是Spring提供的一套简化开发的框架,按照约定好的方法命...

一、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增强工具,只做增强,不作改变,简化开发,提高效率。
MyBatis-Plus快速入门-(干货满满+超详细)

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插件:
MyBatis-Plus快速入门-(干货满满+超详细)
MyBatis-Plus快速入门-(干货满满+超详细)
然后在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-Plus快速入门-(干货满满+超详细)
运行是成功的,我们可以发现相对于使用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);
    }

运行结果:
MyBatis-Plus快速入门-(干货满满+超详细)
倘若大家观察得仔细可以发现主键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抽象类:提供了很多条件构造器。

MyBatis-Plus快速入门-(干货满满+超详细)
MyBatis-Plus快速入门-(干货满满+超详细)

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。
MyBatis-Plus快速入门-(干货满满+超详细)

范围条件构造器:between,非空条件构造器:isNotNull。
MyBatis-Plus快速入门-(干货满满+超详细)
模糊右通配符条件构造器:likeRight,或条件构造器:or。
大于等于条件构造器:ge,升序条件构造器:orderAsc。
降序条件构造器:orderDesc。

MyBatis-Plus快速入门-(干货满满+超详细)
Mysql函数
date_format(日期,‘格式’):将日期按照格式进行插入或者返回。
例如: date_format(now(),’%Y-%m-%d’)。

MyBatis-Plus快速入门-(干货满满+超详细)

动态条件构造器:apply,范围条件构造器:insql。
注意: 如果{0}替换为实际值,可能会造成sql注入。
MyBatis-Plus快速入门-(干货满满+超详细)
and括号条件构造器:and()

MyBatis-Plus快速入门-(干货满满+超详细)
注意:怕有些小伙伴不了解这个是什么:wq -> wq.xxx这种类型的表达式,这个是java8引入的lambda表达式的语法,箭头左边是变量名,箭头右边是自己编写的代码逻辑,如果感兴趣你可以了解一下java的lambda表达式,当然打印方式也是lambda表达式

or括号条件构造器:or()

MyBatis-Plus快速入门-(干货满满+超详细)

非and开头的条件构造器:nested()

MyBatis-Plus快速入门-(干货满满+超详细)

In条件构造器:In(column,Collection)

MyBatis-Plus快速入门-(干货满满+超详细)

last条件构造器:last(sql)。注意:有sql注入风险。确保参数没有风险再使用。

MyBatis-Plus快速入门-(干货满满+超详细)

3、select不列出全部字段

select不列出全部字段

select(String …columns)

MyBatis-Plus快速入门-(干货满满+超详细)
如果返回的字段数量很多,此时采用如下的select,也可以放置在后面

select(Class entityClass,Predicate predicate)

第一个参数为实体类对象;
第二个参数相当于排除返回的字段.

MyBatis-Plus快速入门-(干货满满+超详细)

4、condition作用

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

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

条件构造器(abstractWrapper)中 condition(构造的方法的boolean类型参数) 作用。

如下:like方法调用重载的方法,重载方法中第一个参数。

MyBatis-Plus快速入门-(干货满满+超详细)

作用:该条件是否加入最后生成的sql中。
使用方法:如果为true就加入,如果false就不加入。
使用场景:类似于动态的sql拼接。

传统使用:

MyBatis-Plus快速入门-(干货满满+超详细)

mp方式:

MyBatis-Plus快速入门-(干货满满+超详细)

5、实体作为条件构造器构造方法的参数

创建条件构造器时传入实体对象

private SharedString sqlSelect = new SharedString();

public QueryWrapper() {
    this(null);
}

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

QueryWrapper一个参数的构造方法,如果传入一个部不为null的对象,默认会进行进行等值比较,也就是where后拼接条件。

注意:通过entity参数生成的等值和QueryWrapper的条件构造方法生成的没有任何关系。
MyBatis-Plus快速入门-(干货满满+超详细)

举例验证:
MyBatis-Plus快速入门-(干货满满+超详细)
MyBatis-Plus快速入门-(干货满满+超详细)
注意:使用时要慎重,因为他们都会在sql中进行拼接。

使用场景:如果允许使用实体类去接受参数,那么就可以不用调用条件构造器,而是直接使用构造方法传入参数即可。

特殊操作:可以通过在实体类上添加注解,指定该属性使用那种操作,默认使用等值。

SqlCondition类:定义了一些常量,包括等值、不等于、like、左边like、右边like。
MyBatis-Plus快速入门-(干货满满+超详细)
如果提供的常量无法满足需求,就可以自己在注解中编写常量表达式,例如小于。
MyBatis-Plus快速入门-(干货满满+超详细)

6、AllEq用法

Alleq(Map<R,V> params)

使用方法:传入一个map集合对象,就会按照等值进行操作。key为字段名称,value为字段值。如果字段的值为null,那么sql就会拼接为is null这种形式。
MyBatis-Plus快速入门-(干货满满+超详细)
如果传入的null,想要忽略掉,也就是不进行拼接,那么就传入第二个参数为false。
MyBatis-Plus快速入门-(干货满满+超详细)

allEq的第二种方法,参数1为过滤函数,它是一个函数式接口。
MyBatis-Plus快速入门-(干货满满+超详细)

上图就是判断name是不等于name,如果不等于就返回true,就会过滤掉,所以没有拼接name。也可以判断值。注意需要考虑类型的问题
MyBatis-Plus快速入门-(干货满满+超详细)

7、其他使用条件构造器的方法

其他以条件构造器的方法

1、selectMap:List集合的泛型不再是实体,而是map集合。其中key表示字段名,value表示字段值。
MyBatis-Plus快速入门-(干货满满+超详细)
MyBatis-Plus快速入门-(干货满满+超详细)

使用场景1:当实体类属性非常多时,不易查看。如果返回的是一个实体类,那么即使我们设定了返回字段,那么它的值为null,但是属性仍然存在。如果返回的是Map类型,当指定了返回字段时,那么没返回的就不会存在。
MyBatis-Plus快速入门-(干货满满+超详细)
MyBatis-Plus快速入门-(干货满满+超详细)

使用场景2:当返回的不是一条一条记录时,也就是返回的字段不在实体类属性中,比如一些统计,像平均值,最大值,最小值这样的。
MyBatis-Plus快速入门-(干货满满+超详细)
MyBatis-Plus快速入门-(干货满满+超详细)

2、selectObject:List集合的泛型不再是实体,而是Object,只返回第一个字段的值。其他的会被舍弃。
MyBatis-Plus快速入门-(干货满满+超详细)
MyBatis-Plus快速入门-(干货满满+超详细)
MyBatis-Plus快速入门-(干货满满+超详细)
使用场景:只返回一列时可以使用它。

3、selectCount:查询符合条件的总记录数的。

注意:使用它时,就不能指定返回的列了,因为它会在后面拼接COUNT(1)。
MyBatis-Plus快速入门-(干货满满+超详细)
MyBatis-Plus快速入门-(干货满满+超详细)
MyBatis-Plus快速入门-(干货满满+超详细)

4、selectOne:查询符合条件的数据,只会返回一条数据。

注意: 查询的结果必须是一条或者查不到(多于1条就会报错)。
MyBatis-Plus快速入门-(干货满满+超详细)
MyBatis-Plus快速入门-(干货满满+超详细)
MyBatis-Plus快速入门-(干货满满+超详细)

8、lambda条件构造器

lambda条件构造器(类似mp条件构造器,防误写)

lambda条件构造器使用场景:

不需要我们手动在构造条件时去书写字段名称。
MyBatis-Plus快速入门-(干货满满+超详细)
lambda条件构造器使用方法:
MyBatis-Plus快速入门-(干货满满+超详细)
lambda条件构造器的创建有3种方式

1、通过查询构造器QueryWrapper创建

2、通过new直接创建lambda条件构造器

3、通过构造器工具类Wrappers创建(此时需要泛型)
MyBatis-Plus快速入门-(干货满满+超详细)
4、3.0.7新增的创建lambda条件构造器,通过LambdaQueryChainWrapper,并且需要一个Mapper接口作为参数(通过源码可以,它是对普通查询构造器的再次封装,源码中仍然是通过Mapper接口去调用)。
MyBatis-Plus快速入门-(干货满满+超详细)
MyBatis-Plus快速入门-(干货满满+超详细)

六、自定义SQL及分页查询

1、使用条件构造器的自定义sql

使用场景:当使用条件构造器去构造sql的方法不能满足需求时(前提:mybatisplus版本大于3.0.7)。

使用方法:

注意:${ew.customSqlsegment}可以使条件构造器构造的sql被执行。
MyBatis-Plus快速入门-(干货满满+超详细)
MyBatis-Plus快速入门-(干货满满+超详细)
mybatis-plus配置xml文件路径(springboot项目):
MyBatis-Plus快速入门-(干货满满+超详细)

不过由于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插件

MyBatis-Plus快速入门-(干货满满+超详细)
BaseMapper提供了两个分页方法:
MyBatis-Plus快速入门-(干货满满+超详细)
这两个方法主要区别如下图,返回的数据是实体类型,还是map类型。
IPage.java:
MyBatis-Plus快速入门-(干货满满+超详细)

MyBatis-Plus快速入门-(干货满满+超详细)

b、分页使用
MyBatis-Plus快速入门-(干货满满+超详细)
MyBatis-Plus快速入门-(干货满满+超详细)
分页map形式

MyBatis-Plus快速入门-(干货满满+超详细)
MyBatis-Plus快速入门-(干货满满+超详细)

使用分页时,不查询总记录数:第三个参数为true表示查询总记录数,否则就不查询。
Page.class:
MyBatis-Plus快速入门-(干货满满+超详细)
MyBatis-Plus快速入门-(干货满满+超详细)
MyBatis-Plus快速入门-(干货满满+超详细)

当分页查询查询的是多表时使用分页:
MyBatis-Plus快速入门-(干货满满+超详细)
MyBatis-Plus快速入门-(干货满满+超详细)
MyBatis-Plus快速入门-(干货满满+超详细)
倘若需要多表联查,可以在xml文件里编写多表联查的SQL,一样可以实现其功能ヾ(◍°∇°◍)ノ゙
如:
MyBatis-Plus快速入门-(干货满满+超详细)
MyBatis-Plus快速入门-(干货满满+超详细)
在xml里编写需要的多表查询语句即可。

七、更新与删除

1、mybatis-plus更新

1、根据id更新

使用场景:根据实体类主键属性进行更新,其他属性有值就更新。

使用方法:如下
MyBatis-Plus快速入门-(干货满满+超详细)
MyBatis-Plus快速入门-(干货满满+超详细)
2、以条件构造器作为参数进行更新

使用场景:更新条件为其他时。

使用方法:如下
MyBatis-Plus快速入门-(干货满满+超详细)
MyBatis-Plus快速入门-(干货满满+超详细)
条件构造器传入实体时的使用(和QueryWrapper类似),它会将实体属性作为更新的条件。
MyBatis-Plus快速入门-(干货满满+超详细)
3、条件构造器中set方法使用

如果更新少量字段可使用如下方式:
MyBatis-Plus快速入门-(干货满满+超详细)

lambda方式更新:
MyBatis-Plus快速入门-(干货满满+超详细)
通过构造器链进行直接更新:
MyBatis-Plus快速入门-(干货满满+超详细)

2、mybatis-plus删除方法

1、根据id删除方法——deleteById(前提:实体类主键属性上有@TableId注解)
MyBatis-Plus快速入门-(干货满满+超详细)
MyBatis-Plus快速入门-(干货满满+超详细)

2、普通删除方法
MyBatis-Plus快速入门-(干货满满+超详细)
MyBatis-Plus快速入门-(干货满满+超详细)
MyBatis-Plus快速入门-(干货满满+超详细)
MyBatis-Plus快速入门-(干货满满+超详细)

3、以条件构造器为参数删除方法
MyBatis-Plus快速入门-(干货满满+超详细)

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

1、ActiveRecord模式

简介:活动记录,领域模型模式,直接通过实体操作数据库(java的一个实体类对应数据库的一张表,而一个实例对应表中一行记录)

MP中AR模式的实现(两个前提:实体类需要继承Model;mapper接口实现BaseMapper)
MyBatis-Plus快速入门-(干货满满+超详细)
MyBatis-Plus快速入门-(干货满满+超详细)
直接用实体即可操作数据库:
MyBatis-Plus快速入门-(干货满满+超详细)
insertOrUpdate():
如果实体的主键不是null,那么就会先查询,如果有记录就更新,没有就插入。是null直接进行插入。
MyBatis-Plus快速入门-(干货满满+超详细)
MyBatis-Plus快速入门-(干货满满+超详细)

注意:如下图方法删除不存在的也返回true.
MyBatis-Plus快速入门-(干货满满+超详细)
MyBatis-Plus快速入门-(干货满满+超详细)
至于其他方法的使用介绍,可以查看Model.java源码٩(๑❛ᴗ❛๑)۶

2、主键策略

mp的主键策略定义在了IdTyoe的枚举类中:(下面是源码)
MyBatis-Plus快速入门-(干货满满+超详细)MyBatis-Plus快速入门-(干货满满+超详细)
局部策略:
在主键字段配置@TableId(type=IdType.AUTO)
MyBatis-Plus快速入门-(干货满满+超详细)
全局策略:
在application.yaml配置中添加:
MyBatis-Plus快速入门-(干货满满+超详细)
注意: 局部策略优于全局策略

3、基本配置

可在查看官网地址:https://mybatis.plus/
MyBatis-Plus快速入门-(干货满满+超详细)

九、通用的Service

MyBatis-Plus快速入门-(干货满满+超详细)
MyBatis-Plus快速入门-(干货满满+超详细)
详情可查看IService.java的源码。
下面是部分方法的使用:

1、基本方法

MyBatis-Plus快速入门-(干货满满+超详细)
因为数据数大于1,所以默认返回第一条
MyBatis-Plus快速入门-(干货满满+超详细)

2、批量操作操作

不指定
MyBatis-Plus快速入门-(干货满满+超详细)
指定
MyBatis-Plus快速入门-(干货满满+超详细)
MyBatis-Plus快速入门-(干货满满+超详细)

3、链式调用方法

查询:
MyBatis-Plus快速入门-(干货满满+超详细)
MyBatis-Plus快速入门-(干货满满+超详细)
更新:
MyBatis-Plus快速入门-(干货满满+超详细)
MyBatis-Plus快速入门-(干货满满+超详细)
删除:
MyBatis-Plus快速入门-(干货满满+超详细)
关于MyBatis-Plus的详细快速入门的学习就到这里,Thanks♪(・ω・)ノ

本文地址:https://blog.csdn.net/weixin_45537947/article/details/111399311