mybatis-plus的基本使用

230 阅读5分钟

简介

mybatis-plus是一个mybatis的增强工具,在mybatis的基础上只做增强不做改变,为简化开发,提高效率而生;mybait-plus提供了通用的mappper和service,可以在不编写sql的情况下,快速的实现对单表的crud,批量,逻辑删除,分页等操作;

Pasted image 20221206230214.png

官方文档

官方文档

特性

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
  • 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
  • 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
  • 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
  • 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
  • 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
  • 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
  • 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
  • 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
  • 内置性能分析插件:可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
  • 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作

Pasted image 20221206231506.png

搭建测试项目

依赖

<dependencies>  
   <!--springboot 启动-->  
   <dependency>  
      <groupId>org.springframework.boot</groupId>  
      <artifactId>spring-boot-starter</artifactId>  
   </dependency>  
  
   <!--lombok 代码简化-->  
   <dependency>  
      <groupId>org.projectlombok</groupId>  
      <artifactId>lombok</artifactId>  
      <optional>true</optional>  
   </dependency>  
   <!-- springboot test 启动-->  
   <dependency>  
      <groupId>org.springframework.boot</groupId>  
      <artifactId>spring-boot-starter-test</artifactId>  
      <scope>test</scope>  
   </dependency>  
   <!-- 测试类  -->  
   <dependency>  
      <groupId>org.junit.platform</groupId>  
      <artifactId>junit-platform-launcher</artifactId>  
      <scope>test</scope>  
   </dependency>  
   <!--mysql 连接-->  
   <dependency>  
      <groupId>mysql</groupId>  
      <artifactId>mysql-connector-java</artifactId>  
      <version>8.0.30</version>  
      <scope>runtime</scope>  
   </dependency>  
  
   <!--Mybatis-Plus依赖-->  
   <dependency>  
      <groupId>com.baomidou</groupId>  
      <artifactId>mybatis-plus-boot-starter</artifactId>  
      <version>3.5.2</version>  
   </dependency>  
  
  
</dependencies>

mybatis yml配置文件


# mybatis-plus相关配置  
mybatis-plus:  
  configuration:  
    # 打印mybatis-plus生成的sql  
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl  
    # 设置mybatis-plus的全局配置  
  global-config:  
    db-config:  
      ## 表名前缀  
      table-prefix: t_
      ## 设置统一的主键生成策略
      id-type:auto
  # 扫描通用枚举
  type-enums-package: com.atguigu.mybatisplus.enums
  

代码部分

启动类

@SpringBootApplication  
@MapperScan( "com.syh.mybatisplus04.mapper")  
public class MybatisPlus04Application {  
   public static void main(String[] args) {  
      SpringApplication.run(MybatisPlus04Application.class, args);  
   }  
}

接口

//@Mapper  
@Repository  
public interface UserMapper extends BaseMapper<User> {  
}

测试类

@SpringBootTest  
public class MybatisMyplusTest01 {  
    @Autowired  
    private UserMapper userMapper;  
    @Test  
    public  void  selectList(){  
        List<User> users = userMapper.selectList(null);  
        users.forEach(System.out::println);  
    }
}

常用注解

@Mapper

在接口类上添加了@Mapper,在编译之后会生成相应的接口实现类。添加位置:接口类上面

@MapperScan("")

指定要变成实现类的接口所在的包,包下面的所有接口在编译之后都会生成相应的实现类。添加位置:是在Springboot启动类上面添加

@TableName("")

指定数据库的表名

@TableId

  • @TableId(value="uid") --uid 表示表中字段
  • @TableId(value="uid" , type=IdType.AUTO) type属性用来定义主键策略;默认ldType.ASSIGN_ID (默认),通过雪花算法生成id;ldType.AUTO :使用数据库的自增策略,注意,该类型请确保数据库设置了id自增,否则无效
  • 将属性所对应的字段指定为主键
  • mybatis-plus 默认将id做为主键

@TableField("")

指定属性所对应的字段名

@TableLogic

效果:在字段上加上这个注解再执行BaseMapper的删除方法时,删除方法就会变成修改

** 逻辑删除**

物理删除: 真实删除,将对应数据从数据库中删除,之后查询不到此条被删除的数据 逻辑删除:假删除,将对应数据中代表是否被删除字段的状态修改为“被删除状态”,之后在数据库中仍旧能看到此条数据记录 使用场景: 可以进行数据恢复 ** 实现逻辑删除** step1: 数据库中创建逻辑删除状态列,设置默认值为0

例:
  实体类:
       @TableLogic
      private Integer del;

   service层:
      调用BaseMapper的deleteById(id);

   执行是效果:

      加@TableLogic的情况下
      走 Update 表名 set 加注解的列=值 where del=值
       不加@TableLogic的情况下
      走 delete from 表名 where del=值

   @TableLogic注解参数

    value = "" 默认的原值
    delval = "" 删除后的值
    @TableLogic(value="原值",delval="改值")

雪花算法

在研究研究,挺厉害的

Wapper

Pasted image 20221209220831.png

wapper介绍 :

Wrapper : 条件构造抽象类,最顶端父类 AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件 QueryWrapper : Entity 对象封装操作类,不是用lambda语法 UpdateWrapper : Update 条件封装,用于Entity对象更新操作 AbstractLambdaWrapper : Lambda 语法使用 Wrapper统一处理解析 lambda 获取 column。 LambdaQueryWrapper :看名称也能明白就是用于Lambda语法使用的查询Wrapper LambdaUpdateWrapper : Lambda 更新封装Wrapper

例子:

**Lambda 实现类 **

在开发中尽量使用lambada语法,防止写错和代码修改

@Test  
public  void  selectList(){  
    LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();  
    queryWrapper.in(User::getId,"10007");  
    List<User> users = userMapper.selectList(queryWrapper);  
    users.forEach(System.out::println);  
}

**condition 条件判断 **

使用前

@Test  
public void isNotEmptyTest(){  
    String name = "name0";  
    LambdaQueryWrapper<User> userQueryWrapper = Wrappers.lambdaQuery();  
    if(StringUtils.isNotEmpty(name)){  
        userQueryWrapper.likeRight(User::getName, name );  
    }  
    List<User> users = userMapper.selectList(userQueryWrapper);  
    System.out.println(users);  
}

使用后

@Test  
public void conditionTest(){  
    String name = "name0";  
    LambdaQueryWrapper<User> userQueryWrapper = Wrappers.lambdaQuery();  
    // 等同于if判空
    userQueryWrapper.likeRight(StringUtils.isNotEmpty(name),User::getName, name );  
    List<User> users = userMapper.selectList(userQueryWrapper);  
    System.out.println(users);  
}

常用的方法

Pasted image 20221211220129.png

MybatisPlusInterceptor

分页插件

乐观锁悲观锁

Pasted image 20221211174923.png

代码生成

代码生成器

不是太好用,还是用mabatisX生成比较号

  1. 引入依赖
<!--mybatis-plius 逆向工程-->  
<dependency>  
   <groupId>com.baomidou</groupId>  
   <artifactId>mybatis-plus-generator</artifactId>  
   <version>3.5.3</version>  
</dependency>  
<!--freemarker 模板引擎-->  
<dependency>  
   <groupId>org.freemarker</groupId>  
   <artifactId>freemarker</artifactId>  
</dependency>

快速生成

FastAutoGenerator.create("url", "username", "password")
    .globalConfig(builder -> {
        builder.author("baomidou") // 设置作者
            .enableSwagger() // 开启 swagger 模式
            .fileOverride() // 覆盖已生成文件
            .outputDir("D://"); // 指定输出目录
    })
    .packageConfig(builder -> {
        builder.parent("com.baomidou.mybatisplus.samples.generator") // 设置父包名
            .moduleName("system") // 设置父包模块名
            .pathInfo(Collections.singletonMap(OutputFile.xml, "D://")); // 设置mapperXml生成路径
    })
    .strategyConfig(builder -> {
        builder.addInclude("t_simple") // 设置需要生成的表名
            .addTablePrefix("t_", "c_"); // 设置过滤表前缀
    })
    .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
    .execute();

MybatisX

官方文档上说的很详细,看一下直接用就好 官方文档提供的说明

多数据源

参考

csdn1 bilibili 官方文档