目录

MyBatis Plus 简介

入门案例

MP 简介

MP 的CRUD

新增

删除

修改在进行

根据ID查询

查询所有

分页功能

设置分页参数

设置分页拦截器

优化启动

取消mbatisPlusBanner

取消SpringBanner

DQL 编程控制

构建条件查询

多条件构建

null 判定

查询投影

查询指定字段

聚合查询

分组查询

查询条件

等值查询

范围查询

模糊查询

排序查询

映射匹配兼容性

表字段与实体属性名称不同

实体类中有表中不存在的属性

隐藏字段

@TableFiled 总结

表名与实体类名不同

DML编程控制

id生成策略控制

数据库ID自增

INPUT策略

ASSIGN_ID 策略

ASSIGN_UUID策略

雪花算法

id生成策略对比

删除数据

批量删除

逻辑删除(软删除)

乐观锁(重要)

概念

实现思路

实现步骤

MP自动生成组件代码

引入自动生成代码的依赖

添加配置

在测试类中添加代码


====点波关注吧=======

MyBatis Plus 简介

MybatisPlus(简称MP)是基于MyBatis框架基础上开发的增强型工具,旨在简化开发、提供效率。至于简化在哪里,我们先看一个案例然后再来详细探究MyBatisPlus。

入门案例

前面的课程中我们使用的SpringBoot整合了mybatis,那么这次我们用SpringBoot来整合MybatisPlus,我们先新建一个springBoot整合mybatis的项目出来。

  • 创建项目SpringBoot项目时可以勾选mysql驱动依赖,其他的依赖视情况而定。

由于MP并未被收录到idea的系统内置配置,无法直接选择加入,需要手动在pom.xml中配置添加

<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>

添加MP的相关配置信息

resources默认生成的是properties配置文件,可以将其替换成yml文件,并在文件中配置数据库连接的相关信息:application.yml

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/study
    username: root
    password: 123456


mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  • 创建实体类
package com.moxuan.boot_mp.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Hero {
    private Long id;
    private String hname;
    private String job;
    private Integer level;
    private String sex;
}
  • 创建Dao接口
package com.moxuan.boot_mp.dao;

import com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.moxuan.boot_mp.entity.Hero;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Repository;


public interface HeroDao extends BaseMapper<Hero> {


}
  • 在启动类上添加@MapperScan 注解
package com.moxuan.boot_mp;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
// 配置Dao扫描路径
@MapperScan("com.moxuan.boot_mp.dao")
public class BootMpApplication {

    public static void main(String[] args) {
        SpringApplication.run(BootMpApplication.class, args);
    }

}

Dao接口要想被容器扫描到,有两种解决方案:

  • 方案一:在Dao接口上添加@Mapper注解,并且确保Dao处在引导类所在包或其子包中该方案的缺点是需要在每一Dao接口中添加注解
  • 方案二:在引导类上添加@MapperScan注解,其属性为所要扫描的Dao所在包该方案的好处是只需要写一次,则指定包下的所有Dao接口都能被扫描到,@Mapper就可以不写。
  • 编写测试类
@SpringBootTest
class BootMpApplicationTests {


    @Autowired
    private HeroDao dao;

    @Test
    public void testGetAll(){
        List<Hero> heroList = dao.selectList(null);
        System.out.println(heroList);
    }
}

说明:

userDao注入的时候下面有红线提示的原因是什么?

  • UserDao是一个接口,不能实例化对象
  • 只有在服务器启动IOC容器初始化后,由框架创建DAO接口的代理对象来注入
  • 现在服务器并未启动,所以代理对象也未创建,IDEA查找不到对应的对象注入,所以提示报红
  • 一旦服务启动,就能注入其代理对象,所以该错误提示不影响正常运行。

测试结果:

跟之前整合MyBatis相比,你会发现我们不需要在DAO接口中编写方法和SQL语句了,只需要继承BaseMapper接口即可。整体来说简化很多。

MP 简介

MyBatisPlus(简称MP)是基于MyBatis框架基础上开发的增强型工具,旨在简化开发提高效率

通过刚才的案例,相信大家能够体会简化开发和提高效率这两个方面的优点。

MyBatisPlus的官网为:https://mp.baomidou.com/

从这张图中我们可以看出MP旨在成为MyBatis的最好搭档,而不是替换MyBatis,所以可以理解为MP是MyBatis的一套增强工具,它是在MyBatis的基础上进行开发的,我们虽然使用MP但是底层依然是MyBatis的东西,也就是说我们也可以在MP中写MyBatis的内容

MP的特性:

  • 无侵入:只做增强不做改变,不会对现有工程产生影响
  • 强大的 CRUD 操作:内置通用 Mapper,少量配置即可实现单表CRUD 操作
  • 支持 Lambda:编写查询条件无需担心字段写错
  • 支持主键自动生成
  • 内置分页插件
  • ……

MP 的CRUD

对于标准的CRUD功能都有哪些以及MP都提供了哪些方法可以使用呢?

我们先来看张图:

新增

在进行新增之前,我们可以分析下新增的方法:

int insert (T t)

  • T:泛型,新增用来保存新增数据
  • int:返回值,新增成功后返回1,没有新增成功返回的是0
@Test
public void testSave(){
    Hero hero = new Hero();
    hero.setHname("陈平安");
    hero.setJob("保安");
    hero.setSex("男");
    hero.setLevel(12);

    dao.insert(hero);
}

添加数据后,会自动帮我们生成主键。

删除

在进行删除之前,我们可以分析下删除的方法:

int deleteById (Serializable id)

int:返回值类型,数据删除成功返回1,未删除数据返回0。

@Test
public void testDelete(){
    dao.deleteById(1710316113105047553L);
}

修改在进行

修改之前,我们可以分析下修改的方法:

int updateById(T t);

  • T:泛型,需要修改的数据内容,注意因为是根据ID进行修改,所以传入的对象中需要有ID属性值
  • int:返回值,修改成功后返回1,未修改数据返回0
@Test
public void testUpdate(){
    Hero hero = new Hero();
    hero.setId(1L);
    hero.setJob("坦克");
    dao.updateById(hero);
}

说明:修改的时候,会自动只修改实体对象中有值的字段。

根据ID查询

在进行根据ID查询之前,我们可以分析下根据ID查询的方法:

T selectById (Serializable id)

  • Serializable:参数类型,主键ID的值
  • T:根据ID查询只会返回一条数据
@Test
public  void testGetById(){
    Hero hero = dao.selectById(2L);
    System.out.println(hero);
}

查询所有

在进行查询所有之前,我们可以分析下查询所有的方法:

List<T> selectList(Wrapper<T> queryWrapper)

  • Wrapper:用来构建条件查询的条件,目前我们没有可直接传为Null
  • List<T>:因为查询的是所有,所以返回的数据是一个集合
@Test
public void testGetAll(){
    List<Hero> heroList = dao.selectList(null);
    System.out.println(heroList);
}

分页功能

基础的增删改查就已经学习完了,刚才我们在分析基础开发的时候,有一个分页功能还没有实现,在MP中如何实现分页功能,就是咱们接下来要学习的内容。

分页查询使用的方法是:

IPage<T> selectPage(IPage<T> page, Wrapper<T> queryWrapper)

  • IPage:用来构建分页查询条件
  • Wrapper:用来构建条件查询的条件,目前我们没有可直接传为Null
  • IPage:返回值,你会发现构建分页条件和方法的返回值都是IPage

IPage是一个接口,我们需要找到它的实现类来构建它,具体的实现类,可以进入到IPage类中按ctrl+h,会找到其有一个实现类为Page。

设置分页参数

@Test
public void testSelectPage(){
    IPage<Hero> page = new Page<>(1,3);
    dao.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已经为我们提供好了,我们只需要将其配置成Spring管理的bean对象即可。

package com.moxuan.boot_mp.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MybatisPlusConfig {

    /**
     * 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题(该属性会在旧插件移除后一同移除)
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        //向Mybatis过滤器链中添加分页拦截器
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        //还可以添加i他的拦截器
        return interceptor;
    }


}

注意这个属于配置类,所以类上方需要添加@Configuration.

运行效果:

优化启动

测试的时候,控制台打印的日志比较多,速度有点慢而且不利于查看运行结果,所以接下来我们把这个日志处理下:

取消mbatisPlusBanner

application.yml添加如下内容:

取消SpringBanner

application.yml添加如下内容:

其他的可以不用再做优化了,一般会被用来方便我们查看程序运行的结果,也可以帮助我们调错。

DQL 编程控制

增删改查四个操作中,查询是非常重要的也是非常复杂的操作

测试的时候,控制台打印的日志比较多,速度有点慢而且不利于查看运行结果,所以接下来我们把这个日志处理下:

构建条件查询

在进行查询的时候,我们的入口是在Wrapper这个类上,因为它是一个接口,所以我们需要去找它对应的实现类,关于实现类也有很多,说明我们有多种构建查询条件对象的方式

看一下下面的案例:

@Test
void testGetAllDQL(){
    QueryWrapper qw = new QueryWrapper();
    qw.lt("level",3);
    List<Hero> userList = dao.selectList(qw);
    System.out.println(userList);
}
  • lt: 小于(<),最终的sql语句为:

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部