项⽬中SQL语句⽂件保存及提取⽅法
第⼗九章 SQL⽂保存⽅法
在开发JavaWeb应⽤程序的过程中可能经常需要使⽤到SQL语句来访问。为了屏蔽SQL注⼊带来的危险,在中通常使
⽤PreparedStatement,使⽤预编译的SQL语句。预编译的SQL语句是那些包含?的语句,使⽤PreparedStatement可以让数据库预先编译这些SQL模板,只有调⽤的时候套⽤必须的参数即可。
SQL⽂件的存放位置
那么在JavaWeb项⽬中预编译的SQL语句到底放在那⾥呢?
放在Java代码⾥肯定是不好的,为什么,有两点,第⼀,SQL语句放在Java代码⾥
太难看可,有不好的味道(参看Refactor),第⼆,每次SQL语句变更(可能经常发⽣)
都需要编译这些Java代码,⽐较烦。
那么SQL语句到底放在那⾥呢?根据这么多年的开发经验SQL⽂通常可以放在classes⽬录
下的⽂件中,存放SQL语句的⽂件有三种类型:properties⽂件,xml⽂件和txt⽂件。
在详细讨论⽂件格式之前,我们先讨论以下如何在Java类中得到这些⽂件的引⽤,以便从中得到需要的SQL语句。
使⽤Class的getResourceAsStream⽅法可以获得对⽂件引⽤的InputStream。例如:⽂件⽬录结构:
src
com
jpleasure
dao
SomeDao.java
SomeDao.properties
图片格式转换SomeDao.sql
// properties
public class SomeDao{
vlookup函数的七种用法public InputStream getInputStream() { Class().getClassLoader().
getResourceAsStream("com/jpleasure/dao/SomeDao.properties");
}
}
// xml
public class SomeDao{
public InputStream getInputStream() {
getResourceAsStream("com/jpleasure/dao/SomeDao.properties"); }
}
// txt(.sql)
public class SomeDao{
public InputStream getInputStream() {
getResourceAsStream("com/jpleasure/dao/SomeDao.properties"); }
}
Propertis⽂件
Properties ⽂件是Java⽀持的标准的属性⽂件(相当于Windows对ini⽂件的⽀持)。Properties ⽂件的格式为:
# 注释
# 定义key,并且与key对应的值为value
十进制165转十六进制key = value
可以使⽤java.util.Properties类来包装properties⽂件,使⽤如下
Properties props = new Properties();
try {
props.InputStream());
} catch(IOException ioex) {
// ⽂件不存在,或者格式问题等
}
String value = String("key")
注意上述格式中value不能换⾏,要想换⾏必须使⽤转义字符“/”。
在存储SQL的时候我们使⽤如下的格式,例如:
# 某业务,某操作SQL
xxx_0001 = select * from dual
# 某业务,其他操作SQL
xxx_0002 = /
select /
布洛芬和布洛芬缓释有啥区别* /
from /
dual
使⽤Properties⽂件的优点是:Java内置⽀持布需要⼿写⽂件解析代码,另外使⽤也⾮常简单。
缺点是:SQL语句不能直接编写,需要追加转义字符"/",⽆法将这样的SQL语句直接拷贝到数据库客户端中运⾏。
XML⽂件
使⽤XML⽂件保存SQL⽐较常⽤的格式为:
<sqls>
<sql id=”xxx_0001”>
Select
*
from
dual <!-- ⽂件注释 -->
</sql>
<sql id=”xxx_0001”>
…
</sql>
</sqls>
使⽤XML格式的⽂件保存SQL需要⾃⼰写⽂件解析代码,由于Java对XML提供了内置的⽀持,并且第三⽅的开源库也很多,并且⾮常容易使⽤所以从xml⽂件中解析SQL语句也没有什么困难。以下以jdom为例讲解如何解析上述的XML格式的SQL⽂件。
protected Map analysis() {
Map map = new HashMap();
DOMBuilder builder = new DOMBuilder();
Document doc = null;
try {
结构体定义和使用数据结构// 解析XML⽂件
doc = builder.InputStream());
// 获得根节点: <sqls>
Element element = RootElement();
// 获得所有根节点的⼦节点: <sql>节点列表
List sqlNodeList = Children("sql");
for (int i = 0; i < sqlNodeList.size(); i++) {
Element sqlNode = (Element) (i);
properties是什么文件// 获得SQL语句ID
String id = Attribute("id").getValue();
// 获得SQL语句内容
String sql = TextTrim();
map.put(id, sql);
}
} catch (JDOMException e) {
e.printStackTrace();
}
return map;
}
使⽤XML⽂件格式保存SQL语句据的时候需要注意,SQL语句中的⼤于(>)⼩于(<)和XML⽂件的格式冲突,有两种解决⽅法,
第⼀:使⽤全⾓的⼤于(>)⼩于(<)号。
第⼆:使⽤<![CDATA[ ]]>来包围所有的内容。
另外,通常情况下(不使⽤<![CDATA[ ]]>的时候)SQL的注释只能使⽤XML的注释格式(<!-- -->)。
使⽤XML格式的⽂件的有点:SQL语句可以正常书写,⽂件解析相对简单。
缺点:⼤于号,⼩于号的冲突;⽆法添加SQL注释(通常只能使⽤XML格式的注释)
TXT⽂件(以.SQL为后缀)
我们先说⼀下TXT⽂件(.sql⽂件)的格式
------------------------------------
--@ SQL-1
------------------------------------
SELECT
SYSDATE
FROM
DUAL(SQL)
------------------------------------
-
-@ SQL-2
-- 某某⽤途的SQL⽂
------------------------------------
SELECT
SYSDATE, ROWID -- 某某字段
FROM
DUAL(SQL) -- 某某表
使⽤txt格式的⽂件,⾮常的简单,和⼀般的写SQL语句⼀样,可以使⽤任何的SQL标准语法。只是有⼀个地⽅需要注意,就是每个SQL语句的头注释的地⽅加上⼀⾏特殊的内容⽤来标记SQL语句的ID:
--@ SQL-1
这样的⽂件解析⽐较困难,但是也不是不能做,解析代码如下:
protected Map analysis() {
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论