当前位置: 首页 > 工具软件 > QueryLoader > 使用案例 >

DBUtils学习----QueryLoader类

端木淇
2023-12-01

负责将SQL语句注册到内存中,并保证不会重复注册相同SQL语句(起到缓存SQL语句的作用)

package org.apache.commons.dbutils;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.regex.Pattern;

/**
 * QueryLoader 是一系列查询的注册表,这样就不会将相同查询的多个副本加载到内存中
 * 这个实现加载带有查询名称(别名)到SQL语句映射的properties属性文件
 * 这个类是线程安全的
 */
public class QueryLoader {

    /**
     * 该类的单例
     */
    private static final QueryLoader instance = new QueryLoader();

    /**
     * 匹配扩展名为 xml 的文件
     */
    private static final Pattern dotXml = Pattern.compile(".+\\.[xX][mM][lL]");

    /**
     * 返回该类的一个实例
     */
    public static QueryLoader instance() {
        return instance;
    }

    /**
     * 外层Map的key是存放文件的路径,而value是内层的Map,内层Map存放每一条SQL语句的key和value
     */
    private final Map<String, Map<String, String>> queries = new HashMap<String, Map<String, String>>();

    /**
     * QueryLoader 的唯一类的 protected 构造函数,不能使用 new 来实例化
     */
    protected QueryLoader() {
        super();
    }

    /**
     * 加载查询名称到SQL语句的映射
     * 这些映射会被缓存,因此后续请求从相同的路径加载查询将返回缓存的映射
     * 加载的属性文件可以是面向行的,也可以是 XML 格式的
     * XML格式的属性文件必须使用 *.xml 文件扩展名
     *
     * path:类加载器将用于查找文件的路径
     * 文件访问出错抛出 IOException 异常
     * 如果类加载器不能在给定的路径找到文件,则抛出 IllegalArgumentException 异常
     * XML 属性文件无效则抛出 java.util.InvalidPropertiesFormatException 异常
     * 返回 查询名称到SQL语句的映射
     */
    public synchronized Map<String, String> load(String path) throws IOException {
		// 试着到成员属性queries中取
        Map<String, String> queryMap = this.queries.get(path);

		//判断是否已经存在
        if (queryMap == null) {
            queryMap = this.loadQueries(path);// 使用默认的实现将SQL语句加载到Map中
            this.queries.put(path, queryMap);// 放入queries中
        }

        return queryMap;
    }

    protected Map<String, String> loadQueries(String path) throws IOException {
        // 将 classpath 路径下的资源文件读入到输入流对象中。路径字符串格式应该以"/"打头
		InputStream in = getClass().getResourceAsStream(path);

        if (in == null) {
            throw new IllegalArgumentException(path + " not found.");
        }

        Properties props = new Properties();
        try {
            if (dotXml.matcher(path).matches()) {
                props.loadFromXML(in);
            } else {
                props.load(in);
            }
        } finally {
            in.close();
        }

		// 将Properties对象直接拷贝给HashMap,为了更好的性能保证
        @SuppressWarnings({ "rawtypes", "unchecked" })
        HashMap<String, String> hashMap = new HashMap(props);// loadQueries()的每一次调用都会创建出一个新的HashMap对象
        return hashMap;
    }

    /**
     * 从缓存中删除给定路径的查询
     */
    public synchronized void unload(String path) {
        this.queries.remove(path);
    }

}

使用:

@Test
    public void testQueryLoader() {
        Pattern dotXml = Pattern.compile(".+\\.[xX][mM][lL]");
        String path = "E:\\t00ls\\Ditto\\Language\\Danish.xml";
        System.out.println(dotXml.matcher(path).matches());
        try {
            Map<String, String> map = QueryLoader.instance().load("/sql.properties");
            System.out.println(map.get("JDBC.QUERY_STRING"));

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

sql.properties

JDBC.QUERY_STRING=SELECT * FROM persons WHERE id = ?

private static final Pattern dotXml = Pattern.compile(".+\\.[xX][mM][lL]");

特别字符描述
.匹配除换行符 \n 之外的任何单字符。要匹配 . ,请使用 \.
+匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+
 类似资料: