DBUtils学习----QueryLoader类

来源:互联网 发布:戚薇淘宝店不开了吗 编辑:程序博客网 时间:2024/06/13 23:33

负责将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 之外的任何单字符。要匹配 . ,请使用 \. + 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+
原创粉丝点击