This commit is contained in:
2023-06-21 17:16:46 +08:00
parent 44fb832e64
commit 48001595d2
28 changed files with 201 additions and 79 deletions

View File

@ -0,0 +1,33 @@
package com.qiaoba.common.base.utils;
import cn.hutool.core.util.ClassUtil;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
/**
* 注解Util
*
* @author ailanyin
* @version 1.0
* @since 2023/6/21 9:53
*/
public class AnnotationUtil extends cn.hutool.core.annotation.AnnotationUtil {
public static boolean hasAnnotation(String referenceMethod, Class<? extends Annotation> annotation) {
// com.qiaoba.common.base.utils.AnnotationUtil.hasAnnotation
StringBuilder sb = new StringBuilder(referenceMethod);
int index = sb.lastIndexOf(".");
// com.qiaoba.common.base.utils.AnnotationUtil
String clazzName = sb.substring(0, index);
// hasAnnotation
String methodName = sb.substring(index + 1, sb.length());
Class<?> clazz = ClassUtil.loadClass(clazzName);
for (Method method : clazz.getDeclaredMethods()) {
if (methodName.equals(method.getName())) {
return hasAnnotation(method, annotation);
}
}
return false;
}
}

View File

@ -0,0 +1,16 @@
package com.qiaoba.common.database.annotations;
import java.lang.annotation.*;
/**
* 只查询一条数据
*
* @author ailanyin
* @version 1.0
* @since 2023/6/21 10:10
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SelectOneRow {
}

View File

@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerIntercept
import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
import com.qiaoba.common.base.context.BaseContext;
import com.qiaoba.common.database.interceptors.SchemaInterceptor;
import com.qiaoba.common.database.interceptors.SelectOneRowInterceptor;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.StringValue;
import org.springframework.context.annotation.Bean;
@ -45,6 +46,7 @@ public class MybatisPlusConfig {
return IGNORE_TABLES.contains(tableName);
}
}));
interceptor.addInnerInterceptor(new SelectOneRowInterceptor());
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return interceptor;
}

View File

@ -47,12 +47,4 @@ public class PageQuery implements Serializable {
return new Page<>(pageNum, pageSize);
}
/**
* 只查第一条数据
*
* @return page
*/
public static Page limit1() {
return new Page<>(1, 1);
}
}

View File

@ -0,0 +1,53 @@
package com.qiaoba.common.database.interceptors;
import com.baomidou.mybatisplus.core.toolkit.PluginUtils;
import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.pagination.DialectFactory;
import com.baomidou.mybatisplus.extension.plugins.pagination.DialectModel;
import com.baomidou.mybatisplus.extension.plugins.pagination.dialects.IDialect;
import com.baomidou.mybatisplus.extension.toolkit.JdbcUtils;
import com.qiaoba.common.base.utils.AnnotationUtil;
import com.qiaoba.common.database.annotations.SelectOneRow;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.ParameterMapping;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
/**
* 查询一条
* 因为Oracle 不支持 limit 1 写法, 故调用MP的分页方言处理
*
* @author ailanyin
* @version 1.0
* @since 2023/6/21 8:53
*/
public class SelectOneRowInterceptor implements InnerInterceptor {
@Override
public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {
if (AnnotationUtil.hasAnnotation(ms.getId(), SelectOneRow.class)) {
String buildSql = boundSql.getSql();
IDialect dialect = DialectFactory.getDialect(JdbcUtils.getDbType(executor));
DialectModel model = dialect.buildPaginationSql(buildSql, 0, 1);
replaceSql(ms, boundSql, model);
}
}
private void replaceSql(MappedStatement ms, BoundSql boundSql, DialectModel model) {
PluginUtils.MPBoundSql mpBoundSql = PluginUtils.mpBoundSql(boundSql);
final Configuration configuration = ms.getConfiguration();
List<ParameterMapping> mappings = mpBoundSql.parameterMappings();
Map<String, Object> additionalParameter = mpBoundSql.additionalParameters();
model.consumers(mappings, configuration, additionalParameter);
mpBoundSql.sql(model.getDialectSql());
mpBoundSql.parameterMappings(mappings);
}
}