Mybatis-plus入门基础

105 阅读3分钟

Mybatis-plus基础

1.引入依赖

必要依赖:

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.3</version>
</dependency><dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
    <version>3.5.2</version>
</dependency>
<!--引入mybatis自动配置-->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-autoconfigure</artifactId>
    <version>2.1.1</version>
</dependency>

多数据源扩展依赖:

<!-- mybatis-plus 多数据源 -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
    <version>3.5.0</version>
</dependency>

测试依赖:

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter-test</artifactId>
    <version>3.5.3.1</version>
</dependency>

2.配置和启动

mybatis-plus:
  type-aliases-package: com.ruoyi.**.domain
  mapper-locations: classpath*:mapper/**/*Mapper.xml
  
#plus多数据源配置
# Spring配置
spring:
  datasource:
    dynamic:
      primary: master #设置默认的数据源或者数据源组,默认值即为master
      strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
      datasource:
        master:
          url: jdbc:mysql://localhost:3306/ry?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&rewriteBatchedStatements=true
          username: root
          password: root
        slave_1:
          url: jdbc:mysql://localhost:3306/ry?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&rewriteBatchedStatements=true
          username: root
          password: root

在启动类上加注解:

//注意只能扫描mapper接口所在的包,不然有可能会为servic层接口创建代理对象
@MapperScan("com.ruoyi.**.mapper")

或在每一个Mapper接口上加上@Mapper注解

3.CURD接口

service接口

public interface ISysUserService extends IService<SysUser>

service实现类

public class SysUserServiceImpl extends ServiceImpl<SysUserMapper,SysUser> implements ISysUserService

mapper接口:

public interface SysUserMapper extends BaseMapper<SysUser>

详见官网:CRUD 接口 | MyBatis-Plus (baomidou.com)

4.注解

常用注解:

@TableName("sys_user")
@TableField("nickname")
@TableField(exist = false) //实体类排除表中不存在的字段
@TableId("user_id",type=IdType.AUTO)//AUTO ASSIGN_ID(默认雪花算法) ASSIGN_UUID(默认UUID)

注解 | MyBatis-Plus (baomidou.com)

5.分页

添加分页插件

@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
    MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
    return interceptor;
}

构建分页对象

//方式一:
Page<SysUser> page = new Page<>();
page.setCurrent(2L);//当前第几页
page.setSize(10L);//每页多少条数据
//方式二:
Page<SysUser> page = new Page<>(2,10);

内置分页方法:

//BaseMapper中:
Page<T> P selectPage(P page, Wrapper<T> queryWrapper);
Page<T> P selectMapsPage(P page, Wrapper<T> queryWrapper);
​
//ServiceImpl中:
// 无条件分页查询
IPage<T> page(IPage<T> page);
// 条件分页查询
IPage<T> page(IPage<T> page, Wrapper<T> queryWrapper);
// 无条件分页查询
IPage<Map<String, Object>> pageMaps(IPage<T> page);
// 条件分页查询
IPage<Map<String, Object>> pageMaps(IPage<T> page, Wrapper<T> queryWrapper);

6.逻辑删除

只对自动注入的 sql 起效:

  • 插入: 不作限制
  • 查找: 追加 where 条件过滤掉已删除数据,如果使用 wrapper.entity 生成的 where 条件也会自动追加该字段
  • 更新: 追加 where 条件防止更新到已删除数据,如果使用 wrapper.entity 生成的 where 条件也会自动追加该字段
  • 删除: 转变为 更新

例如:

  • 删除: update user set deleted=1 where id = 1 and deleted=0
  • 查找: select id,name,deleted from user where deleted=0

步骤一:

mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: flag # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
      logic-delete-value: 1 # 逻辑已删除值(默认为 1)
      logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)

步骤二:

@TableLogic
private Integer deleted;

7.通用枚举配置

方式一: 使用 @EnumValue 注解枚举属性 完整示例

public enum GradeEnum {
​
    PRIMARY(1, "小学"),  SECONDORY(2, "中学"),  HIGH(3, "高中");
​
    GradeEnum(int code, String descp) {
        this.code = code;
        this.descp = descp;
    }
​
    @EnumValue//标记数据库存的值是code
    @JsonValue
    private final int code;
    //。。。
}

方式二: 枚举属性,实现 IEnum 接口如下:

public enum AgeEnum implements IEnum<Integer> {
    ONE(1, "一岁"),
    TWO(2, "二岁"),
    THREE(3, "三岁");
​
    @JsonValue
    private int value;
    private String desc;
​
    @Override
    public Integer getValue() {
        return this.value;
    }
}

实体属性使用枚举类型:

public class User {
    /**
     * 名字
     * 数据库字段: name varchar(20)
     */
    private String name;
​
    /**
     * 年龄,IEnum接口的枚举处理
     * 数据库字段:age INT(3)
     */
    private AgeEnum age;
​
​
    /**
     * 年级,原生枚举(带{@link com.baomidou.mybatisplus.annotation.EnumValue}):
     * 数据库字段:grade INT(2)
     */
    private GradeEnum grade;
}

如何序列化枚举值为前端返回值?

使用@JsonValue注解处理:

@EnumValue//标记数据库存的值是code
@JsonValue
private final int code;

8.自动填充

创建和更新时间

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
​
    @Override
    public void insertFill(MetaObject metaObject) {
        // 起始版本 3.3.0(推荐使用)
        this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
    }
​
    @Override
    public void updateFill(MetaObject metaObject) {
        // 起始版本 3.3.0(推荐)
        this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
    }
}

实体类:

@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime; //注意字段类型和MetaObjectHandler实现类中的类型一致
@TableField(fill = FieldFill.UPDATE)
private LocalDateTime updateTime;