springboot学习第10期 - mybatis-plus

61 阅读2分钟

前面提到 spring data jpa,但是在国内受欢迎的还是 mybatis-plus。

依赖引入

<!-- Spring Boot 3 必须选 spring-boot3-starter -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
    <version>3.5.12</version>
</dependency>

<!-- MySQL 驱动 -->
<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <version>8.4.0</version>
</dependency>

配置

配置数据库相关即可

spring.datasource.url=jdbc:mysql://localhost:3306/helloword
spring.datasource.username=root
spring.datasource.password=lkjhgfds
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

创建实体

假如已经存在如下表格:

CREATE TABLE tbl_user (
  // 主键自增
  id            bigint unsigned auto_increment primary key,

  // 业务字段
  username      varchar(50)  not null unique,
  password      char(60)     not null,
  email         varchar(100) not null unique,

  // 逻辑删除
  is_deleted   tinyint(1) unsigned not null default 0,

  // 审计字段
  created_at   datetime not null default current_timestamp,
  updated_at   datetime not null default current_timestamp on update current_timestamp,

  // 审计字段(可选)
  created_by  varchar(50)  not null default 'system',
  updated_by  varchar(50)  not null default 'system'
);

需要创建Java对象与之一一映射:

@Data
@TableName("tbl_user")
public class User extends BaseEntity {

    // 自增
    @TableId(type = IdType.AUTO)
    private Long id;

    private String username;
    private String password;
    private String email;
}

将审计字段抽离出来作为父类:

@Data
public class BaseEntity {

    /** 创建人 */
    @TableField(fill = FieldFill.INSERT)
    private String createdBy;

    /** 创建时间 */
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createdAt;

    /** 更新人 */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private String updatedBy;

    /** 更新时间 */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updatedAt;

    /** 逻辑删除(0 未删 1 已删) */
    @TableLogic
    private Boolean isDeleted;
}

创建Mapper

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

这里注意是接口,有两种方式注入bean:

1、每个Mapper接口都使用注解 @Mapper。

2、统一在主类上添加 MapperScan 注解。

使用

@Slf4j
@RestController
@RequestMapping("/api/hello")
@Validated
@RequiredArgsConstructor
public class HelloController {

    private final UserMapper userMapper;

    @GetMapping
    public List<User> hello() {
        List<User> users = userMapper.selectList(null);

        return users;
    }
}

分页

想要使用分页功能,还需要引入欸外依赖:

<dependency>
  <groupId>com.baomidou</groupId>
  <artifactId>mybatis-plus-jsqlparser</artifactId>
  <version>3.5.12</version> <!-- 与你使用的 MyBatis-Plus 主版本一致 -->
</dependency>

并且需要添加欸外配置:

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

然后直接调用 selectPage 即可:

@GetMapping("/page")
public Page<User> hello2() {

    Page<User> userPage = userMapper.selectPage(new Page<>(1, 10), null);

    return userPage;
}

审计

前面实例中演示的审计字段其实还没有完全结束,还需要定义这些字段的填充规则,需要增加如下的配置:

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        this.strictInsertFill(metaObject, "createdAt", LocalDateTime.class, LocalDateTime.now());
        this.strictInsertFill(metaObject, "createdBy", String.class, getCurrentUser());
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        this.strictUpdateFill(metaObject, "updatedAt", LocalDateTime.class, LocalDateTime.now());
        this.strictUpdateFill(metaObject, "updatedBy", String.class, getCurrentUser());
    }

    private String getCurrentUser() {
        // 从 Spring Security、ThreadLocal、JWT 等获取当前登录用户ID
        return "system"; // 示例值
    }
}

然后新增或者修改字段的时候,会自动更改数据库里面的值,不需要手动设置。

更多

待补充