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