jfinal arp 自动装载sql文件

package com.dwk.kit.sql;

import cn.hutool.log.Log;
import cn.hutool.log.LogFactory;
import com.jfinal.kit.PathKit;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;


import java.io.IOException;
import java.nio.file.*;


/**
 * Created by dwk on 2019/6/27
 * 用于自动装载sql文件
 */
public class SqlAutoLoadKit {
    private static final Log log = LogFactory.get();


    /**
     * @param arp
     */
    public static void autoLoad(ActiveRecordPlugin arp) {
        autoLoad(arp, PathKit.getRootClassPath() + arp.getEngine().getBaseTemplatePath());
    }


    public static void autoLoad(ActiveRecordPlugin arp, String path) {
        Path p = Paths.get(path);
        try {
            //自动装载
            Files.walkFileTree(p, new SqlVisitor(arp));
            log.info("SQL文件自动装载成功!");
        } catch (IOException e) {
            log.error("SQL文件自动装载异常!请检查SQL路径");
            throw new RuntimeException("SQL文件自动装载异常!请检查SQL路径");
        }
    }
}
package com.dwk.kit.sql;

import cn.hutool.core.io.FileUtil;
import cn.hutool.log.Log;
import cn.hutool.log.LogFactory;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;

import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.FileVisitor;
import java.nio.file.Path;
import java.nio.file.attribute.BasicFileAttributes;

/**
 * @author Administrator
 */
public class SqlVisitor implements FileVisitor<Path> {
    private static final Log log = LogFactory.get();
    private static final String SQL_EXT = "sql";
    private ActiveRecordPlugin arp;

    public SqlVisitor(ActiveRecordPlugin arp) {
        this.arp = arp;
    }

    @Override
    public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) {
        return FileVisitResult.CONTINUE;
    }

    @Override
    public FileVisitResult visitFile(Path sqlPath, BasicFileAttributes attrs) {
        if (SQL_EXT.equalsIgnoreCase(FileUtil.extName(sqlPath.toString()))) {
            log.info("loading {}", sqlPath.getFileName().toString());
            arp.addSqlTemplate(sqlPath.getFileName().toString());
        }
        return FileVisitResult.CONTINUE;
    }

    @Override
    public FileVisitResult visitFileFailed(Path file, IOException exc) {
        return FileVisitResult.TERMINATE;
    }

    @Override
    public FileVisitResult postVisitDirectory(Path dir, IOException exc) {
        return FileVisitResult.CONTINUE;
    }
}

使用

//多个sql文件自动装载
SqlAutoLoadKit.autoLoad(arp);


评论区

JFinal

2019-12-27 17:46

代码十分简洁,头像十分喜感,分享十分有用,赞

小李子a

2019-12-30 10:08

这种方法我试过了,在boot项目中,在eclipse上可以正常运行,但是打包后,java -jar运行,还是报错

chcode

2019-12-30 12:00

@小李子a 基于官方打包方式,jar可能不能使用

Psbye

2020-01-01 22:42

使用 Reflections 来扫描更健康~ 适用于官方打包!

邓小杰

2020-01-02 21:57

@小李子a 是不是扫描不到sql文件

小李子a

2020-01-03 09:15

@邓小杰 在eclipse里运行可以扫描到,但是打jar包之后就扫描不到了

chcode

2020-01-03 20:21

@小李子a jar是一个压缩文件,不是目录,以上方法行不通

邓小杰

2020-01-03 21:06

@小李子a 我之前就是这样 然后就改成了手动加载sql文件

小李子a

2020-01-06 09:57

@chcode 对,所以一直在郁闷,试了很多种方法,都不行,就只能手动把所有sql文件都#include()进去