一、MybatisPlus快速入门

379 阅读5分钟

一,介绍

MyBatis-Plus 是 MyBatis 的一个增强工具,旨在简化 MyBatis 的开发流程并提供更多功能特性。它为开发者提供了更高效、简便的开发体验,以下是 MyBatis-Plus 的一些主要特点和功能:

主要特点:

  1. 无侵入性:MyBatis-Plus 在增强 MyBatis 的功能的同时,不对其原有功能进行侵入,使得开发者可以无缝地将其集成到现有项目中。
  2. 丰富的 CRUD 操作:提供了一系列便捷的 CRUD 操作方法,包括批量插入、批量删除、批量更新等,减少了重复代码的编写。
  3. 代码生成器:支持代码生成,可以根据数据库表生成实体类、Mapper 接口、Service 接口及实现类、Controller 类等,极大提高了开发效率。
  4. 条件构造器:提供了多种条件构造器,用于动态构建查询条件,使得复杂查询变得更加简单直观。
  5. 分页插件:内置分页插件,支持多种数据库的分页查询,并且可以方便地与前端分页组件集成。
  6. 性能优化插件:包括 SQL 执行分析插件、全表更新与删除阻断插件等,帮助开发者在开发过程中发现潜在的性能问题和风险操作。

主要功能:

  1. 通用 Mapper:提供了一些通用的 CRUD 方法,如 insertdeleteByIdupdateByIdselectById 等,减少了 Mapper 接口中重复代码的编写。
  2. 条件构造器:通过 Wrapper 类,开发者可以使用链式调用的方式构建复杂的查询条件,例如 QueryWrapperUpdateWrapper 等。
  3. 自动填充:支持数据库字段的自动填充,如插入时的创建时间、更新时间等,通过注解可以轻松实现。
  4. 逻辑删除:提供逻辑删除功能,可以通过配置实现对记录的逻辑删除,而不是物理删除。
  5. 乐观锁:支持乐观锁机制,通过版本号控制并发更新,防止数据被覆盖。
  6. 多租户:支持多租户功能,通过拦截器实现不同租户的数据隔离。

**多租户(Multi-Tenancy)是指在同一个系统或应用程序中,为多个客户(租户)提供隔离的数据和配置环境。**每个租户的数据和操作彼此独立,不会相互影响。多租户架构在SaaS(Software as a Service)应用中非常常见,能够让多个客户共享同一个应用程序和数据库,同时保证数据的安全性和隔离性。

二,快速入门

  1. 导包(这个依赖集成了mybatis和mybatis-plus两个包)

    <!--这个是SpringBoot2的-->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.5.7</version>
    </dependency>
    <!--这个是SpringBoot3的-->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
        <version>3.5.7</version>
    </dependency>
    
  2. 编写配置文件(和mybatis的区别就是前面是mybatis-plus)

    spring:
      datasource:
        username: root
        password: 123456
        url: jdbc:mysql://localhost:33.6/mytest?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
        driver-class-name: com.mysql.cj.jdbc.Driver
        type: com.alibaba.druid.pool.DruidDataSource
    mybatis-plus:
      #开启类别命名自动扫描
      typeAliasesPackage: com.normaling.**.domain
      #开启mapper扫描路径
      mapperLocations: classpath*:mapper/**/*Mapper.xml
      configuration:
        #指定mybatis日志输出的位置,这里是输出到控制台
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
        #开启小驼峰命名转换。将column=a_column--->aColumn
        map-underscore-to-camel-case: true
    
  3. 创建数据库表

    DROP TABLE IF EXISTS `user`;
    CREATE TABLE `user`
    (
        id BIGINT NOT NULL COMMENT '主键ID',
        name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
        age INT NULL DEFAULT NULL COMMENT '年龄',
        email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
        PRIMARY KEY (id)
    );
    DELETE FROM `user`;
    INSERT INTO `user` (id, name, age, email) VALUES
    (1, 'Jone', 18, 'test1@baomidou.com'),
    (2, 'Jack', 20, 'test2@baomidou.com'),
    (3, 'Tom', 28, 'test3@baomidou.com'),
    (4, 'Sandy', 21, 'test4@baomidou.com'),
    (5, 'Billie', 24, 'test5@baomidou.com');
    
  4. 创建数据库表对应的java对象

    @Data
    public class User {
        private Long id;
        private String name;
        private Integer age;
        private String email;
    }
    
  5. 自定义Mapper接口集成MybatisPlus提供的BaseMapper,里面的泛型类型,就是我们数据库映射的java对象。

    @Mapper
    public interface UserMapper extends BaseMapper<User> {
    
    }
    
  6. 在测试类中测试方法

    @SpringBootTest(classes=SpringBootMyTestDemoApplication.class)
    public class UserDaoTest {
    
        @Autowired
        private UserMapper userMapper;
    
        @Test
        public void testSelect() {
            System.out.println(("----- selectAll method test ------"));
            List<User> userList = userMapper.selectList(null);
            Assert.isTrue(5 == userList.size(), "");
            userList.forEach(System.out::println);
        }
    }
    

三,常用注解

image-20240713153254292

如果我们的java类遵顼上述约定,就不需要加注解,如果不遵循,需要按照如下注解手动指定字段和属性的映射。

MybatisPlus中比较常见的注解:

  • @TableName:指定表名

  • @TableId:指定表的主键

    @TableId属性:

    • value:用来映射这个字段与表字段
    • type:用来指定数据库表id插入时的策略,通过IdType的枚举类来指定,内容为:
      • AUTO:数据库自增,如果我们表字段也是自增长,需要这边手动指定一下。要不然默认采用雪花算法的id
      • INPUT:通过SET方法手动输入
      • ASSIGN_ID:分配ID,接口IdentifierGenerator方法nextId来生成id,默认实现类为:DefaultIdentifierGenerator雪花算法。
      • ASSIGN_UUID,根据UUID来生成ID
  • @TableFiled:指定表的普通字段,使用它的情况:

    • 成员变量名与数据库字段名不一致
    • 成员变量名以is开头,且是布尔值
    • 成员变量名与数据库关键字冲突,例如:order需要加上转义字符,例如:@TableField("order`")
    • 如果成员变量不是数据库字段,需要特殊处理:@TableField(exist=false)

举例:

@TableName("user")
public class User {
    @TableId(value="id",type= IdType.ASSIGN_ID)
    private Long id;
    @TableField("name")
    private String name;
    @TableField("age")
    private Integer age;
    @TableField("email")
    private String email;
}

四,常用配置

我们在配置yml文件的时候,mybatis-plus和mybatis保持一致,是在mybatis的基础上扩展了配置

mybatis-plus:
  #开启类别命名自动扫描
  type-aliases-package: com.normaling.**.domain
  #开启mapper扫描路径
  mapper-locations: classpath*:mapper/**/*Mapper.xml
  configuration:
    #指定mybatis日志输出的位置,这里是输出到控制台
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    #开启小驼峰命名转换。将column=a_column--->aColumn
    map-underscore-to-camel-case: true
    #是否开启二级缓存
    cache-enabled: true
  global-config:
    db-config:
      id-type: assign_id #id为雪花算法生成
      update-strategy: not_null #更新策略:只更新非空字段
  • 可以看到,上述配置单词之间是-分隔的,实际上用驼峰命名可也以,没啥区别。

  • global-config是mybatis这边的扩展

    • 上图我们通过了type属性指定了主键id增长的方式,如果我们不设置,可以通过这边全局配置来指定。
  • 上述大部分配置其实mybatisPlus已经设置好了,我们只需要设置如下

    mybatis-plus:
      #开启类别命名自动扫描
      type-aliases-package: com.normaling.**.domain
      global-config:
        db-config:
          id-type: assign_id #id为雪花算法生成
          update-strategy: not_null #更新策略:只更新非空字段