Search in sources :

Example 1 with Select

use of org.apache.ibatis.annotations.Select in project taskana by Taskana.

the class ArchitectureTest method notUseCurrentTimestampSqlFunction.

private static ArchCondition<JavaClass> notUseCurrentTimestampSqlFunction() {
    Function<JavaMethod, List<String>> getSqlStringsFromMethod = CheckedFunction.wrap((method) -> {
        List<String> values = new ArrayList<>();
        final Optional<Select> selectAnnotation = method.tryGetAnnotationOfType(Select.class);
        final Optional<Update> updateAnnotation = method.tryGetAnnotationOfType(Update.class);
        final Optional<Insert> insertAnnotation = method.tryGetAnnotationOfType(Insert.class);
        final Optional<Delete> deleteAnnotation = method.tryGetAnnotationOfType(Delete.class);
        final Optional<SelectProvider> selectProviderAnnotation = method.tryGetAnnotationOfType(SelectProvider.class);
        final Optional<UpdateProvider> updateProviderAnnotation = method.tryGetAnnotationOfType(UpdateProvider.class);
        final Optional<InsertProvider> insertProviderAnnotation = method.tryGetAnnotationOfType(InsertProvider.class);
        final Optional<DeleteProvider> deleteProviderAnnotation = method.tryGetAnnotationOfType(DeleteProvider.class);
        if (selectAnnotation.isPresent()) {
            values.addAll(Arrays.asList(selectAnnotation.get().value()));
        }
        if (updateAnnotation.isPresent()) {
            values.addAll(Arrays.asList(updateAnnotation.get().value()));
        }
        if (insertAnnotation.isPresent()) {
            values.addAll(Arrays.asList(insertAnnotation.get().value()));
        }
        if (deleteAnnotation.isPresent()) {
            values.addAll(Arrays.asList(deleteAnnotation.get().value()));
        }
        if (selectProviderAnnotation.isPresent()) {
            values.add(executeStaticProviderMethod(selectProviderAnnotation.get().type(), selectProviderAnnotation.get().method()));
        }
        if (updateProviderAnnotation.isPresent()) {
            values.add(executeStaticProviderMethod(updateProviderAnnotation.get().type(), updateProviderAnnotation.get().method()));
        }
        if (insertProviderAnnotation.isPresent()) {
            values.add(executeStaticProviderMethod(insertProviderAnnotation.get().type(), insertProviderAnnotation.get().method()));
        }
        if (deleteProviderAnnotation.isPresent()) {
            values.add(executeStaticProviderMethod(deleteProviderAnnotation.get().type(), deleteProviderAnnotation.get().method()));
        }
        return values;
    });
    return new ArchCondition<JavaClass>("not use the SQL function 'CURRENT_TIMESTAMP'") {

        @Override
        public void check(JavaClass javaClass, ConditionEvents events) {
            for (JavaMethod method : javaClass.getAllMethods()) {
                List<String> sqlStrings = getSqlStringsFromMethod.apply(method);
                if (sqlStrings.isEmpty() && !method.tryGetAnnotationOfType(SelectProvider.class).isPresent()) {
                    String message = String.format("Method '%s#%s' does not contain any MyBatis SQL annotation", javaClass.getName(), method.getName());
                    events.add(SimpleConditionEvent.violated(javaClass, message));
                }
                if (sqlStrings.stream().anyMatch(s -> s.contains("CURRENT_TIMESTAMP"))) {
                    String message = String.format("Method '%s#%s' uses 'CURRENT_TIMESTAMP' SQL function", javaClass.getName(), method.getName());
                    events.add(SimpleConditionEvent.violated(javaClass, message));
                }
            }
        }
    };
}
Also used : Delete(org.apache.ibatis.annotations.Delete) SelectProvider(org.apache.ibatis.annotations.SelectProvider) ArchCondition(com.tngtech.archunit.lang.ArchCondition) ArrayList(java.util.ArrayList) Update(org.apache.ibatis.annotations.Update) Insert(org.apache.ibatis.annotations.Insert) DeleteProvider(org.apache.ibatis.annotations.DeleteProvider) JavaMethod(com.tngtech.archunit.core.domain.JavaMethod) List(java.util.List) ArrayList(java.util.ArrayList) ConditionEvents(com.tngtech.archunit.lang.ConditionEvents) InsertProvider(org.apache.ibatis.annotations.InsertProvider) UpdateProvider(org.apache.ibatis.annotations.UpdateProvider) JavaClass(com.tngtech.archunit.core.domain.JavaClass) Select(org.apache.ibatis.annotations.Select)

Example 2 with Select

use of org.apache.ibatis.annotations.Select in project mybatis-pro by Dreamroute.

the class ClassUtil method getSpecialMethods.

/**
 * 返回Mapper接口的xxxBy开头的方法
 *
 * @param interfaceCls Mapper接口
 * @return findBy开头的方法的方法名字
 */
public static List<String> getSpecialMethods(Class<?> interfaceCls) {
    Method[] methods = interfaceCls.getDeclaredMethods();
    List<String> names = new ArrayList<>();
    for (Method m : methods) {
        String name = m.getName();
        boolean isBy = name.startsWith("findBy") || name.startsWith("deleteBy") || name.startsWith("countBy") || name.startsWith("existBy");
        boolean isAnnoCrud = hasAnnotation(m, Select.class) || hasAnnotation(m, Update.class) || hasAnnotation(m, Insert.class) || hasAnnotation(m, Delete.class);
        if (isBy && isAnnoCrud) {
            throw new MyBatisProException("接口方法" + interfaceCls.getName() + "." + name + "是[findBy, deleteBy, countBy, existBy]之一, 会被MybatisPro框架自动创建SQL语句,不能使用[@Select, @Update, @Insert, @Delete]来自定义SQL,请对方法重新命名");
        }
        if (isBy) {
            names.add(name);
        }
    }
    return names;
}
Also used : Delete(org.apache.ibatis.annotations.Delete) ArrayList(java.util.ArrayList) Select(org.apache.ibatis.annotations.Select) Method(java.lang.reflect.Method) Update(org.apache.ibatis.annotations.Update) MyBatisProException(com.github.dreamroute.mybatis.pro.core.exception.MyBatisProException)

Aggregations

ArrayList (java.util.ArrayList)2 Delete (org.apache.ibatis.annotations.Delete)2 Select (org.apache.ibatis.annotations.Select)2 Update (org.apache.ibatis.annotations.Update)2 MyBatisProException (com.github.dreamroute.mybatis.pro.core.exception.MyBatisProException)1 JavaClass (com.tngtech.archunit.core.domain.JavaClass)1 JavaMethod (com.tngtech.archunit.core.domain.JavaMethod)1 ArchCondition (com.tngtech.archunit.lang.ArchCondition)1 ConditionEvents (com.tngtech.archunit.lang.ConditionEvents)1 Method (java.lang.reflect.Method)1 List (java.util.List)1 DeleteProvider (org.apache.ibatis.annotations.DeleteProvider)1 Insert (org.apache.ibatis.annotations.Insert)1 InsertProvider (org.apache.ibatis.annotations.InsertProvider)1 SelectProvider (org.apache.ibatis.annotations.SelectProvider)1 UpdateProvider (org.apache.ibatis.annotations.UpdateProvider)1