Skip to content

MyBatis-Plus

最后更新: 7 天前
实践版本: v2.13.4

简介

continew-starter-data-mp 是 ContiNew Starter 数据访问模块针对 MyBatis-Plus 框架的增强实现,提供了一系列便捷功能,简化数据访问层开发,提高开发效率。

MyBatis Plus

MyBatis-Plus 是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

主要特性

  • 默认配置优化:增加样板化配置,并预配置常用组件,包括:
    • 分页插件(启用溢出处理)
    • 防全表更新与删除插件
    • MyBatis 默认配置(自动驼峰命名规则、日志配置)
    • SQL 打印及性能分析配置(p6spy)
  • 简化 Mapper 扫描:只需在配置文件中指定 Mapper 接口扫描包路径
  • 通用查询注解:通过一个注解即可完成繁琐的 QueryWrapper 拼接
  • 插件自动注入:Spring 容器中的插件会自动注入到 MyBatis Plus 拦截器中
  • 提供 IService 及其实现:优化 MP 默认提供的 IService 接口及其实现类
  • 扩展 BaseMapper:提供更丰富的基础方法,满足常见业务需求
  • 提供 ID 生成器:集成 COSID 提供分布式 ID 生成器
  • BaseEnum 支持:支持 BaseEnum 枚举字段转换

快速开始

引入依赖

pom.xml
xml
<dependency>
    <groupId>top.continew.starter</groupId>
    <artifactId>continew-starter-data-mp</artifactId>
</dependency>

添加配置

配置示例

配置详情请查看:top.continew.starter.data.autoconfigure.MyBatisPlusExtensionProperties

application.yml
yaml
--- ### MyBatis Plus 配置
mybatis-plus:
  # Mapper XML 文件目录配置
  mapper-locations: classpath*:/mapper/**/*Mapper.xml
  # 类型别名扫描包配置
  type-aliases-package: ${application.base-package}.**.model
  ## MyBatis 配置
  configuration:
    # MyBatis 自动映射策略
    # NONE:不启用 PARTIAL:只对非嵌套 resultMap 自动映射 FULL:对所有 resultMap 自动映射
    auto-mapping-behavior: PARTIAL
  ## 全局配置
  global-config:
    banner: true
    db-config:
      # 主键类型(默认 assign_id,表示自行赋值)
      # auto 代表使用数据库自增策略(需要在表中设置好自增约束)
      id-type: ASSIGN_ID
  ## 扩展配置
  extension:
    enabled: true
    # Mapper 接口扫描包配置
    mapper-package: ${application.base-package}.**.mapper
    # ID 生成器配置
    id-generator:
      type: COSID
    # 分页插件配置
    pagination:
      enabled: true
      db-type: MYSQL

已提供样板化配置,如需修改,直接覆盖即可。

application.yml
yaml
--- ### MyBatis Plus 配置(https://baomidou.com/pages/56bac0/#%E5%9F%BA%E6%9C%AC%E9%85%8D%E7%BD%AE)
mybatis-plus:
  # 启动时是否检查 MyBatis XML 文件的存在(默认:false 不检查)
  check-config-location: true
  ## MyBatis 原生支持配置
  configuration:
    # 是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN(下划线命名)到经典 Java 属性名 aColumn(驼峰命名)的类似映射
    # 此属性在 MyBatis 中原默认值为 false,在 MyBatis-Plus 中,此属性也将用于生成最终的 SQL 的 select body,如果您的数据库命名符合规则无需使用 @TableField 注解指定数据库字段名
    map-underscore-to-camel-case: true
    # MyBatis 自动映射时未知列或未知属性处理策略,通过该配置可指定 MyBatis 在自动映射过程中遇到未知列或者未知属性时如何处理
    # NONE:不做任何处理 (默认值);WARNING:以日志的形式打印相关警告信息;FAILING:当作映射失败处理,并抛出异常和详细信息
    auto-mapping-unknown-column-behavior: NONE
    # 日志配置
    # 默认:org.apache.ibatis.logging.slf4j.Slf4jImpl
    # 更详细(会有性能损耗):org.apache.ibatis.logging.stdout.StdOutImpl
    # 关闭(可单纯使用 p6spy 分析):org.apache.ibatis.logging.nologging.NoLoggingImpl
    log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl

通用查询注解

通过 @Query 注解可以快速构建查询条件,避免繁琐的 QueryWrapper 拼接。

java
@Data
@Schema(description = "部门查询条件")
public class DeptQuery implements Serializable {

    @Serial
    private static final long serialVersionUID = 1L;

    /**
     * 部门名称
     */
    @Schema(description = "部门名称", example = "测试部")
    private String name;

    /**
     * 状态
     */
    @Schema(description = "状态(1:启用;2:禁用)", example = "1")
    private Integer status;
}

// 构建 QueryWrapper
LambdaQueryWrapper<DeptDO> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.like(StrUtil.isNotBlank(query.getName()), DeptDO::getName, query.getName());
queryWrapper.eq(null != query.getStatus(), DeptDO::getStatus, query.getStatus());
java
@Data
@Schema(description = "部门查询条件")
public class DeptQuery implements Serializable {

    @Serial
    private static final long serialVersionUID = 1L;

    /**
     * 部门名称
     */
    @Schema(description = "部门名称", example = "测试部")
    @Query(type = QueryType.LIKE)
    private String name;

    /**
     * 状态
     */
    @Schema(description = "状态(1:启用;2:禁用)", example = "1")
    @Query
    private Integer status;
}

// 构建 QueryWrapper
QueryWrapper<DeptDO> queryWrapper = QueryWrapperHelper.build(query);

查询类型枚举类:top.continew.starter.data.enums.QueryType

类型描述
EQ等于 =,例如:WHERE age = 18
NE不等于 !=,例如:WHERE age != 18
GT大于 >,例如:WHERE age > 18
GE大于等于 >=,例如:WHERE age >= 18
LT小于 <,例如:WHERE age < 18
LE小于等于 <=,例如:WHERE age <= 18
BETWEEN范围查询,例如:WHERE age BETWEEN 10 AND 18
LIKE模糊查询,例如:WHERE nickname LIKE '%s%'
LIKE_LEFT左模糊查询,例如:WHERE nickname LIKE '%s'
LIKE_RIGHT右模糊查询,例如:WHERE nickname LIKE 's%'
IN包含查询,例如:WHERE age IN (10, 20, 30)
NOT_IN不包含查询,例如:WHERE age NOT IN (20, 30)
IS_NULL空值查询,例如:WHERE email IS NULL
IS_NOT_NULL非空查询,例如:WHERE email IS NOT NULL

核心依赖

依赖描述
top.continew.starter:continew-starter-data-core数据访问模块 - 核心模块
cn.hutool:hutool-dbHutool 数据库模块(在 JDBC 基础上封装的数据库操作工具类,通过包装,使用 ActiveRecord 思想操作数据库)
com.baomidou:mybatis-plus-spring-boot3-starterMyBatis Plus(MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,简化开发、提高效率)
com.baomidou:mybatis-plus-jsqlparserMyBatis Plus jsqlparser 适配(包含原扩展模块内容)
p6spy:p6spyP6Spy(SQL 性能分析组件)
me.ahoo.cosid:cosid-spring-boot-starter(optional)CosId(通用、灵活、高性能的分布式 ID 生成器)

参考资料

  1. MyBatis Plus 官方文档:https://baomidou.com/