add
This commit is contained in:
@ -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;
|
||||
}
|
||||
}
|
@ -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 {
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
Reference in New Issue
Block a user