|
|
|
@ -19,10 +19,13 @@ import com.baomidou.mybatisplus.plugins.parser.tenant.TenantSqlParser;
|
|
|
|
|
import net.sf.jsqlparser.expression.Expression;
|
|
|
|
|
import net.sf.jsqlparser.expression.LongValue;
|
|
|
|
|
|
|
|
|
|
// 表示这是一个配置类,Spring会扫描这个类并将其中带有@Bean注解的方法返回的对象注册为Bean
|
|
|
|
|
@Configuration
|
|
|
|
|
// 配置MyBatis Mapper接口的扫描路径,会扫描指定包及其子包下的所有Mapper接口,方便Spring与MyBatis整合时能找到对应的Mapper
|
|
|
|
|
@MapperScan("com.tamguo.modules.*.dao*")
|
|
|
|
|
public class MybatisPlusConfig {
|
|
|
|
|
|
|
|
|
|
// 创建并返回一个PerformanceInterceptor实例,用于拦截MyBatis执行的SQL语句,可用于性能监控,例如记录SQL执行时间等
|
|
|
|
|
@Bean
|
|
|
|
|
public PerformanceInterceptor performanceInterceptor() {
|
|
|
|
|
return new PerformanceInterceptor();
|
|
|
|
@ -31,53 +34,67 @@ public class MybatisPlusConfig {
|
|
|
|
|
/**
|
|
|
|
|
* mybatis-plus分页插件<br>
|
|
|
|
|
* 文档:http://mp.baomidou.com<br>
|
|
|
|
|
* 此方法创建并配置一个PaginationInterceptor实例,用于实现MyBatis Plus的分页功能,同时还进行了与多租户相关的一些配置。
|
|
|
|
|
*/
|
|
|
|
|
@Bean
|
|
|
|
|
public PaginationInterceptor paginationInterceptor() {
|
|
|
|
|
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
|
|
|
|
|
paginationInterceptor.setLocalPage(true);// 开启 PageHelper 的支持
|
|
|
|
|
// 设置开启PageHelper的支持,以便更好地兼容一些分页相关的操作习惯等情况
|
|
|
|
|
paginationInterceptor.setLocalPage(true);
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* 【测试多租户】 SQL 解析处理拦截器<br>
|
|
|
|
|
* 这里固定写成住户1实际情况你可以从cookie读取,因此数据看不到 【 麻花藤 】 这条记录( 注意观察 SQL )<br>
|
|
|
|
|
* 以下代码是配置多租户相关的SQL解析拦截逻辑,用于在执行SQL时根据租户规则对SQL语句进行处理。
|
|
|
|
|
*/
|
|
|
|
|
List<ISqlParser> sqlParserList = new ArrayList<>();
|
|
|
|
|
TenantSqlParser tenantSqlParser = new TenantSqlParser();
|
|
|
|
|
|
|
|
|
|
// 设置租户处理器,用于定义获取租户ID、租户ID对应的列名以及判断是否过滤表等逻辑
|
|
|
|
|
tenantSqlParser.setTenantHandler(new TenantHandler() {
|
|
|
|
|
// 返回租户ID对应的表达式,这里固定返回值为1L,表示租户ID为1
|
|
|
|
|
@Override
|
|
|
|
|
public Expression getTenantId() {
|
|
|
|
|
return new LongValue(1L);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 返回租户ID在数据库表中对应的列名,此处为"course_id"
|
|
|
|
|
@Override
|
|
|
|
|
public String getTenantIdColumn() {
|
|
|
|
|
return "course_id";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 判断是否对指定表进行过滤,这里返回true表示需要进行过滤操作,具体过滤逻辑可根据实际情况调整
|
|
|
|
|
@Override
|
|
|
|
|
public boolean doTableFilter(String tableName) {
|
|
|
|
|
// 这里可以判断是否过滤表
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 将配置好的租户SQL解析器添加到SQL解析器列表中
|
|
|
|
|
sqlParserList.add(tenantSqlParser);
|
|
|
|
|
|
|
|
|
|
// 将包含租户相关配置的SQL解析器列表设置到分页拦截器中,使得分页拦截器在处理SQL时能应用多租户逻辑
|
|
|
|
|
paginationInterceptor.setSqlParserList(sqlParserList);
|
|
|
|
|
|
|
|
|
|
// 以下过滤方式与 @SqlParser(filter = true) 注解等效
|
|
|
|
|
// 配置SQL解析过滤器,用于根据具体的MappedStatement的ID来决定是否对SQL进行过滤,这里是针对特定的自定义查询进行过滤
|
|
|
|
|
// paginationInterceptor.setSqlParserFilter(new ISqlParserFilter() {
|
|
|
|
|
// @Override
|
|
|
|
|
// public boolean doFilter(MetaObject metaObject) {
|
|
|
|
|
// MappedStatement ms = PluginUtils.getMappedStatement(metaObject);
|
|
|
|
|
// // 过滤自定义查询此时无租户信息约束【 麻花藤 】出现
|
|
|
|
|
// // 过滤自定义查询此时无租户信息约束【 麻花藤 】出现,即如果是指定的这个查询方法,则返回true表示过滤该查询,不应用租户相关逻辑
|
|
|
|
|
// if ("com.baomidou.springboot.mapper.UserMapper.selectListBySQL".equals(ms.getId())) {
|
|
|
|
|
// return true;
|
|
|
|
|
// }
|
|
|
|
|
// return false;
|
|
|
|
|
// }
|
|
|
|
|
// });
|
|
|
|
|
|
|
|
|
|
return paginationInterceptor;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 创建并返回一个MetaObjectHandler实例,用于在执行MyBatis相关操作时,自动填充一些公共字段等元数据处理逻辑,具体填充逻辑在返回的MyMetaObjectHandler类中实现
|
|
|
|
|
@Bean
|
|
|
|
|
public MetaObjectHandler metaObjectHandler() {
|
|
|
|
|
return new MyMetaObjectHandler();
|
|
|
|
@ -85,6 +102,7 @@ public class MybatisPlusConfig {
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 注入sql注入器
|
|
|
|
|
* 此方法创建并返回一个ISqlInjector实例,这里使用的是LogicSqlInjector,用于实现一些逻辑删除等特定的SQL注入功能(MyBatis Plus特性相关)。
|
|
|
|
|
*/
|
|
|
|
|
@Bean
|
|
|
|
|
public ISqlInjector sqlInjector() {
|
|
|
|
|