mybatis的xml中不寫(xiě)if 使用代碼拼接

在mybatis中的xml寫(xiě)sql的時(shí)候如果查詢的條件非常多就會(huì)多出很多行的代碼
這里介紹一下我的想法,最近想到的,實(shí)踐了一下是可行的,和xml的if拼接是一樣的

使用javapot實(shí)現(xiàn)動(dòng)態(tài)拼接代碼

  1. 讀取文件
 public static String root = "com.finish.mp.";
    public static String boPackage = "t1.bo";
    public static String enumPath = "com.finish.mp.sysenum";

    @Test
    public void autoQueryPage() throws Exception {
        File file = new File(T2.class.getResource("/").getPath());
        String parent = new File(file.getParent()).getParent();
        String rootPath = parent + "\\src\\main\\java\\" + root.replace(".", "\\");
        File[] fileBO = new File(rootPath + boPackage.replace(".", "\\")).listFiles();

        TypeSpec.Builder classSpec = TypeSpec.classBuilder("Page2Sql")
                .addModifiers(Modifier.PUBLIC);
        List<String> collect = Arrays.stream(fileBO).map(file1 -> file1.getName().split("\\.")[0]).collect(Collectors.toList());
        for (String s : collect) {
            Class<?> bo = Class.forName(root + boPackage + "." + s);
            MethodSpec bo2sql = createMethod(bo);
            classSpec.addMethod(bo2sql);
        }
        TypeSpec build = classSpec.build();
        File file1 = new File(rootPath + "\\utils");
        if (!file1.exists()) {
            file1.mkdirs();
        }
        JavaFile.builder("", build).build().writeTo(file1);

    }
  1. 編寫(xiě)注解 劃線的不是這個(gè)里面的


    image.png
  2. 在指定的字段使用注解


    image.png
  3. 編寫(xiě)生成方法的javapot代碼 這里的dr是邏輯刪除
         private MethodSpec createMethod(Class<?> bo) throws Exception {
        String boName = toLowerCaseFirstOne(bo.getSimpleName());
        StringBuilder s = new StringBuilder(boName);
        boName = s.delete(s.length() - 2, s.length()).toString();
        MethodSpec.Builder builder = MethodSpec.methodBuilder(toLowerCaseFirstOne(boName) + "2Sql")
                .addParameter(ParameterSpec.builder(bo, boName).build())
                .returns(String.class)
                .addModifiers(Modifier.PUBLIC, Modifier.STATIC);
        builder.addStatement("StringBuilder st = new StringBuilder()");
        builder.addStatement("st.append(\"where t.dr = 0\")");
        Field[] fields1 = bo.getSuperclass().getDeclaredFields();
        Field[] fields2 = bo.getDeclaredFields();

        List<Field> fields = new ArrayList<>();
        fields.addAll(Arrays.asList(fields1));
        fields.addAll(Arrays.asList(fields2));
        for (Field field : fields) {
            field.setAccessible(true);
            TableField annotation = field.getAnnotation(TableField.class);
            Like like = field.getAnnotation(Like.class);
            LeftLike leftLike = field.getAnnotation(LeftLike.class);
            RightLike rightLike = field.getAnnotation(RightLike.class);
//這里注解名字改了,就是大于小于和開(kāi)閉區(qū)間的意思
            LessThan endTime = field.getAnnotation(LessThan.class);
            GreaterThan startTime = field.getAnnotation(GreaterThan.class);
            SqlIgnore sqlIgnore = field.getAnnotation(SqlIgnore.class);
            if (sqlIgnore != null) {
                continue;
            }
            String name = field.getName();
            if (annotation != null) {
                name = annotation.value();
            }
            String s1 = boName + ".get" + toUpperCaseFirstOne(field.getName());
            if (!field.getType().getName().contains(enumPath)) {
                if (field.getType() == String.class) {
                    builder.addCode("if(" + s1 + "()!=null&&! \"\".equals(" + s1 + "())){");
                    if (like != null) {
                        builder.addStatement("st.append(\" and t." + name + " = \").append(\"'%\").append(" + s1 + "()).append(\"%'\")");
                    } else if (leftLike != null) {
                        builder.addStatement("st.append(\" and t." + name + " = \").append(\"'%\").append(" + s1 + "()).append(\"'\")");
                    } else if (rightLike != null) {
                        builder.addStatement("st.append(\" and t." + name + " = \").append(\"'\").append(" + s1 + "()).append(\"%'\")");
                    } else if (endTime != null) {
                        if (endTime.value() == 1) {
                            builder.addStatement("st.append(\" and t." + name + " < \").append(\"'\").append(" + s1 + "()).append(\"'\")");
                        } else {
                            builder.addStatement("st.append(\" and t." + name + " <= \").append(\"'\").append(" + s1 + "()).append(\"'\")");
                        }
                    } else if (startTime != null) {
                        if (startTime.value() == 1) {
                            builder.addStatement("st.append(\" and t." + name + " > \").append(\"'\").append(" + s1 + "()).append(\"'\")");
                        } else {
                            builder.addStatement("st.append(\" and t." + name + " >= \").append(\"'\").append(" + s1 + "()).append(\"'\")");
                        }
                    } else {
                        builder.addStatement("st.append(\" and t." + name + " = \").append(\"'\").append(" + s1 + "()).append(\"'\")");
                    }/* else {
                        builder.addStatement("st.append(\" and t." + name + " = \").append(\"'\").append(" + s1 + "()).append(\"%'\")");
                    }*/
                } else if (field.getType().getName().contains("java")) {
                    builder.addCode("if(" + s1 + "()!=null){");
                    builder.addStatement("st.append(\" and t." + name + " = \").append(" + s1 + "())");
                }
            } else {
                builder.addCode("if(" + s1 + "()!=null){");
                builder.addStatement("st.append(\" and t." + name + " = \").append(" + s1 + "().getIndex())");
            }
            builder.addCode("}");
        }
        builder.addStatement("return st.toString()");

        return builder.build();
    }
  1. 生成樣例 這里沒(méi)有加上包 手動(dòng)加下


    image.png
  2. 代碼實(shí)踐


    image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。