项目(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