Skip to content

数据访问模块:MyBatis-Plus

简介

continew-starter-data-mp 是 ContiNew Starter 数据访问模块针对 MyBatis-Plus 框架的默认处理。

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

主要特性

  • 版本锁定:涉及依赖已进行版本锁定,使用时无需配置版本
  • 默认配置:已配置分页插件(启用溢出处理)、防全表更新与删除插件、MyBatis 默认配置(自动驼峰命名规则、日志配置)、SQL 打印及性能分析配置(p6spy)
  • Mapper 扫描包配置:只需要在配置文件中指定 Mapper 接口扫描包配置
  • 通用查询注解:一个注解搞定繁琐的 QueryWrapper 拼接
  • 数据权限:支持引入自定义数据权限插件
  • 扩展 BaseMapper

配置示例

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

yaml
--- ### MyBatis Plus 配置
mybatis-plus:
  ## 扩展配置
  extension:
    enabled: true
    # Mapper 接口扫描包配置
    mapper-package: ${project.base-package}.**.mapper
    # 数据权限配置
    data-permission:
      enabled: true
    # 分页插件配置
    pagination:
      enabled: true
      db-type: MYSQL
  ## 其他配置略
  # ...

温馨提示

下方 MyBatis Plus 配置已经在本模块中进行了默认配置,使用者无需再进行配置,如需要更改,可进行覆盖配置。

yaml
mybatis-plus:
  # 启动时是否检查 MyBatis XML 文件的存在(默认:false 不检查)
  check-config-location: true
  ## MyBatis 原生支持配置
  configuration:
    # 是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN(下划线命名)到经典 Java 属性名 aColumn(驼峰命名)的类似映射
    map-underscore-to-camel-case: true
    # MyBatis 自动映射时未知列或未知属性处理策略,通过该配置可指定 MyBatis 在自动映射过程中遇到未知列或者未知属性时如何处理
    auto-mapping-unknown-column-behavior: NONE
    # 日志配置(关闭,单纯使用 p6spy 分析)
    log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl

通用查询注解

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.charles7c.continew.starter.data.mybatis.plus.query.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
LIKELIKE '%值%',例如:WHERE nickname LIKE '%s%'
LIKE_LEFTLIKE '%值',例如:WHERE nickname LIKE '%s'
LIKE_RIGHTLIKE '值%',例如: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

数据权限

基于 MyBatis Plus 提供的数据权限插件,提供了数据权限处理器默认实现,详情请查看:top.charles7c.continew.starter.data.mybatis.plus.datapermission.DataPermissionHandlerImpl

如需使用,只需要在配置中开启,并通过实现 top.charles7c.continew.starter.data.mybatis.plus.datapermission.DataPermissionFilter 提供当前登录用户信息即可。

yaml
--- ### MyBatis Plus 配置
mybatis-plus:
  ## 扩展配置
  extension:
    enabled: true
    # 数据权限配置(默认:关闭)
    data-permission:
      enabled: true

DataPermissionFilter 实现类示例如下:

java
public class DataPermissionFilterImpl implements DataPermissionFilter {

    @Override
    public boolean isFilter() {
        LoginUser loginUser = LoginHelper.getLoginUser();
        return null != loginUser && !loginUser.isAdmin();
    }

    @Override
    public DataPermissionCurrentUser getCurrentUser() {
        LoginUser loginUser = LoginHelper.getLoginUser();
        if (null == loginUser) {
            throw new IllegalArgumentException("Current user is not allowed to be empty.");
        }
        DataPermissionCurrentUser currentUser = new DataPermissionCurrentUser();
        currentUser.setUserId(Convert.toStr(loginUser.getId()));
        currentUser.setDeptId(Convert.toStr(loginUser.getDeptId()));
        currentUser.setRoles(loginUser.getRoles().stream()
            .map(r -> new DataPermissionCurrentUser.CurrentUserRole(Convert.toStr(r.getId()),
                DataScope.valueOf(r.getDataScope().name())))
            .collect(Collectors.toSet()));
        return currentUser;
    }
}

在 Spring 容器中提供你的实现。

java
@Configuration
public class MybatisPlusConfiguration {

    /**
     * 数据权限过滤器
     */
    @Bean
    public DataPermissionFilter dataPermissionFilter() {
        return new DataPermissionFilterImpl();
    }
}

温馨提示

如果你不想使用 Starter 提供的默认数据权限处理器实现,但仍想基于 MyBatis Plus 提供的数据权限插件来实现数据权限,可自行重写 DataPermissionHandler,并将 Bean 注入到 Spring 容器即可,Starter 组件会自动识别加载数据权限插件。

配置好数据权限后,可以通过注解 @DataPermission 来灵活的为指定 Mapper 接口方法添加数据权限处理。

java
public interface DataPermissionMapper<T> extends BaseMapper<T> {

    @Override
    @DataPermission
    List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

    @Override
    @DataPermission
    List<T> selectList(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
}

核心依赖

依赖描述
mybatis-plus-spring-boot3-starterMyBatis Plus(MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,简化开发、提高效率)
dynamic-datasource-spring-boot3-starterDynamic Datasource(基于 Spring Boot 的快速集成多数据源的启动器)
p6spyP6Spy(SQL 性能分析组件)
continew-starter-core