数据访问模块:MyBatis-Plus
简介
continew-starter-data-mp
是 ContiNew Starter 数据访问模块针对 MyBatis-Plus 框架的默认处理。
<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
。
--- ### 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 配置已经在本模块中进行了默认配置,使用者无需再进行配置,如需要更改,可进行覆盖配置。
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
通用查询注解
@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());
@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 |
LIKE | LIKE '%值%',例如:WHERE nickname LIKE '%s%' |
LIKE_LEFT | LIKE '%值',例如:WHERE nickname LIKE '%s' |
LIKE_RIGHT | LIKE '值%',例如: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
提供当前登录用户信息即可。
--- ### MyBatis Plus 配置
mybatis-plus:
## 扩展配置
extension:
enabled: true
# 数据权限配置(默认:关闭)
data-permission:
enabled: true
DataPermissionFilter 实现类示例如下:
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 容器中提供你的实现。
@Configuration
public class MybatisPlusConfiguration {
/**
* 数据权限过滤器
*/
@Bean
public DataPermissionFilter dataPermissionFilter() {
return new DataPermissionFilterImpl();
}
}
温馨提示
如果你不想使用 Starter 提供的默认数据权限处理器实现,但仍想基于 MyBatis Plus 提供的数据权限插件来实现数据权限,可自行重写 DataPermissionHandler
,并将 Bean 注入到 Spring 容器即可,Starter 组件会自动识别加载数据权限插件。
配置好数据权限后,可以通过注解 @DataPermission
来灵活的为指定 Mapper 接口方法添加数据权限处理。
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-starter | MyBatis Plus(MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,简化开发、提高效率) |
dynamic-datasource-spring-boot3-starter | Dynamic Datasource(基于 Spring Boot 的快速集成多数据源的启动器) |
p6spy | P6Spy(SQL 性能分析组件) |
continew-starter-core |