ContiNew
数据访问

MyBatis Flex

continew-starter-data-mf:基于 MyBatis Flex 的数据访问增强,含扩展配置、@Query 通用查询、通用 Mapper/Service、数据权限方言与分页插件。

本文是 2.x 的归档文档(冻结于 v2.17.0)。该分支只接收勘误修正, 内容基本不再变动;文中的源码路径、配置项与版本号均以 2.17.x 为准,不建议用于新项目。

新项目请查看 3.x 最新文档。已在 2.17.x 上运行的项目,本文仍是可靠依据。

continew-starter-data-mf 是数据访问模块针对 MyBatis Flex 框架的增强实现,提供通用业务体系、声明式查询构建、数据权限与分页插件等能力。

引入依赖

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

模块会传递引入 com.mybatis-flex:mybatis-flex-spring-boot3-starter,mybatis-flex-processor(APT 注解处理器)以 provided scope 提供;me.ahoo.cosid:cosid-spring-boot-starter 为 optional,按需自行引入(见 continew-starter-data-mf/pom.xml)。

配置

扩展配置项前缀为 mybatis-flex.extension,属性类为 top.continew.starter.data.autoconfigure.MyBatisFlexExtensionProperties:

配置项说明默认值
mybatis-flex.extension.enabled是否启用本模块扩展(自动配置生效条件,无缺省匹配,必须显式配置为 true)false
mybatis-flex.extension.data-permission.enabled是否启用数据权限插件false
mybatis-flex.extension.pagination.enabled是否启用分页插件true
mybatis-flex.extension.pagination.db-type数据库类型(com.mybatisflex.core.dialect.DbType,如 MYSQL)未设置
mybatis-flex.extension.pagination.overflow分页溢出处理false
mybatis-flex.extension.pagination.max-limit单页分页条数限制,-1 表示无限制-1
# MyBatis Flex 扩展配置
mybatis-flex:
  extension:
    enabled: true
    # 数据权限插件配置
    data-permission:
      enabled: false
    # 分页插件配置
    pagination:
      enabled: true
      db-type: MYSQL
      overflow: false
      max-limit: -1

自动配置 MybatisFlexAutoConfiguration 的生效条件为 mybatis-flex.extension.enabled=true(@ConditionalOnProperty 未设 matchIfMissing)。未开启时 MyBatis Flex 本体仍由其官方 starter 装配,但本模块的扩展能力(事务管理、默认配置、数据权限方言)不生效。

启用扩展时,模块还会通过 default-data-mybatis-flex.yml 提供样板化默认配置:开启下划线转驼峰映射(map-underscore-to-camel-case: true)、未知列处理策略 NONE、关闭 MyBatis 自带日志,并配置主键为 flexId 生成器:

mybatis-flex:
  check-config-location: true
  configuration:
    map-underscore-to-camel-case: true
    auto-mapping-unknown-column-behavior: NONE
    log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl
  global-config:
    key-config:
      key-type: generator
      # flexId 主键生成器 com.mybatisflex.core.keygen.impl.FlexIDKeyGenerator
      value: flexId

通用查询注解

与 MyBatis Plus 实现共用 data-core 的 @Query 注解体系(注解属性与 QueryType 枚举见 MyBatis Plus 页),在查询条件类字段上标注后,通过 QueryWrapperHelper.build(query) 构建 MyBatis Flex 的 QueryWrapper,并支持传入 Spring Data Sort 排序对象:

@Data
public class DeptQuery implements Serializable {

    @Serial
    private static final long serialVersionUID = 1L;

    @Query(type = QueryType.LIKE)
    private String name;

    @Query
    private Integer status;
}

QueryWrapper queryWrapper = QueryWrapperHelper.build(query);

构建过程会对查询值做 SQL 注入校验、对排序字段做合法性校验(QueryWrapperHelper.java)。

通用 Mapper 与 Service

public interface DemoMapper extends BaseMapper<DemoDO> {
}

public interface DemoService extends IService<DemoDO> {
}

@Service
public class DemoServiceImpl extends ServiceImpl<DemoMapper, DemoDO> implements DemoService {
}

BaseMapper(top.continew.starter.data.base.BaseMapper)在 MyBatis Flex BaseMapper 之上扩展了 updateBatchById(批量更新)、query() / query(T entity)(链式查询)、currentEntityClass 等方法(BaseMapper.java:42-72)。

数据权限

数据权限基于 MyBatis Flex 方言(DataPermissionDialect)在 SQL 层按数据权限范围拼接查询过滤条件,在 Mapper 或 Service 方法上标注 @DataPermission 注解即可生效:

public interface UserMapper extends BaseMapper<UserDO> {

    @DataPermission
    List<UserDO> list(@Param("query") UserQuery query);
}

@DataPermission 注解属性(均有默认值,可按表结构覆盖):

属性说明默认值
tableAlias表别名""
id主键列名id
deptId部门 ID 列名dept_id
userId用户 ID 列名create_user
roleId角色 ID 列名(角色和部门关联表)role_id
deptTableAlias部门表名sys_dept
roleDeptTableAlias角色和部门关联表名sys_role_dept

支持的数据权限范围(top.continew.starter.data.datapermission.DataScope 枚举):

范围说明
ALL全部数据权限
DEPT_AND_CHILD本部门及以下数据权限
DEPT本部门数据权限
SELF仅本人数据权限
CUSTOM自定义数据权限
// 实现 DataPermissionFilter 接口并注册为 Bean
@Component
public class DataPermissionFilterImpl implements DataPermissionFilter {

    @Override
    public boolean isFilter() {
        // 返回 false 可整体跳过数据权限过滤(如超级管理员)
        return true;
    }

    @Override
    public DataPermissionCurrentUser getCurrentUser() {
        // 返回当前用户 ID、部门 ID、角色及其数据权限范围
        return currentUser;
    }
}
  • 开启数据权限(data-permission.enabled: true)后,必须提供 DataPermissionFilter 实现 Bean:自动配置类通过 @Resource 注入它并向 DialectFactory 注册方言(当前仅注册了 DbType.MYSQL),缺失该 Bean 会导致启动失败(MybatisFlexAutoConfiguration.java:54-63)。
  • 源码中 DataPermissionAspect(负责将方法上的 @DataPermission 注解信息传递给方言)未注册为 Spring Bean,需要在使用方项目中自行声明,例如:
@Bean
public DataPermissionAspect dataPermissionAspect() {
    return new DataPermissionAspect();
}

核心依赖

依赖描述
top.continew.starter:continew-starter-data-core数据访问模块 - 核心模块(@Query 查询注解体系)
com.mybatis-flex:mybatis-flex-spring-boot3-starterMyBatis Flex 框架本体
com.mybatis-flex:mybatis-flex-processorMyBatis Flex APT 注解处理器(provided)
me.ahoo.cosid:cosid-spring-boot-starterCosId 分布式 ID 生成器(optional,按需引入)

目录