项目(jht项目)中用到了在xml文件中定义sql脚本。属于properties类型的,刚开始不明白为什么要用xml来定义,而不是直接在.properties文件定义呢?
百度后发现一个说法是:想必大家都用过*.properties文件,作为配置文件。但是,如果该文件写入了中文,待编译后内容就会成为乱码,使用native命令也好、使用ant执行编码转换也好,多少有点麻烦,与其如此,我们不如直接使用properties的xml格式。
代码结构:
sql.xml文件用于配置sql语句:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>SQL脚本</comment>
<entry key="sql_get_park_ticket_discount">
<![CDATA[SELECT * FROM discount]]>
</entry>
<entry key="sql_get_park_in_list">
<![CDATA[SELECT * FROM TABLE_NAME]]>
</entry>
</properties>
SqlConfig.java用于取xml中的sql工具类:
package utils;
import java.io.IOException;
import java.util.InvalidPropertiesFormatException;
import java.util.Properties;
public class SqlConfig {
private Properties properties = new Properties();
private static volatile SqlConfig sqlConfig = null;
/**
* 使用双重锁的单例模式维持一个sqlConfig对象
* @return
*/
public static SqlConfig getInstance(){
if (null == sqlConfig) {
synchronized (SqlConfig.class) {
if(null == sqlConfig){
sqlConfig = new SqlConfig();
}
}
}
return sqlConfig;
}
/**
* 定义获取根据sql名字来获取sql的方法
* @param key
* @return
*/
public String getSql(String key){
return properties.getProperty(key);
}
/**
* 将构造函数私有化
*/
private SqlConfig(){
try {
initSqlXml("sql.xml");
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 加载sql.xml配置文件
* @param filePathName
* @throws InvalidPropertiesFormatException
* @throws IOException
*/
private void initSqlXml(String filePathName) throws InvalidPropertiesFormatException, IOException {
properties.loadFromXML(this.getClass().getClassLoader().getResourceAsStream(filePathName));
}
}
Test.java用于测试:
package test;
import utils.SqlConfig;
public class Test {
public static void main(String[] args) {
System.out.println(SqlConfig.getInstance().getSql("sql_get_park_ticket_discount"));
}
}
测试结果:
SELECT * FROM discount
要关注的问题:
1.用.xml文件配置属性相对于用.properties的好处
2.Properties文件的xml格式(dtd是什么,为什么要用?,见另外一篇博文的介绍)
3.读取xml文件的方法
XML文件中的<![CDATA[]]>是什么意思?
答:在XML文档中的所有文本都会被解析器解析,只有在CDATA部件之内的文本会被解析器忽略。比如文本内容中使用“<”这样的特殊字符时,XML使用解析错误。要对"<"进行转义(<)才能正常解析。
所以,不单只是在XML中,还有在脚本或样式表,如果在中使用特殊字符(例如 < 或 &)或实体引用(例如 < 或 &)或程序代码,则需要将脚本或样式表的内容标记为 CDATA(字符数据)节,在CDATA内部的所有内容都会被解析器忽略,这样就能够正常解析。
参考文章:http://snowolf.iteye.com/blog/404762