JDBC操作SQL语句的注释和拼接

上网浏览帖子发现一个关于SQL中的in里面的参数动态添加的问题。

通常in里面的参数通过一个子查询获得与该参数相同类型或者可互转换的类型的一个字段信息。实际中经常会用到有个数组,该数组的内容正好是作为in里面的参数列表。通过SQL拼接的方式一定能够实现,即便看起来比较繁琐。

下面是通过预编译命令和参数占位的方式来实现:

Stringsql=”selecturlid,urlfromf_urlwhereurlin(?)”;pstmt=conn.prepareStatement(sql);pstmt.setString(1,”/index.jsp,/login.jsp”);rs=pstmt.executeQuery();

上面代码的意图看起来是执行如下SQL:

selecturlid,urlfromf_urlwhereurlin(‘/index.jsp’,’/login.jsp’)

实际上是:

selecturlid,urlfromf_urlwhereurlin(‘/index.jsp,/login.jsp’)

因此上面的方法是错误的!!!

另外PrepareStatment对象有一个void setArray (int parameterIndex, Array x)方法,万不可因为in里面的参数是同类型,看起来正好该方法满足需求,实时上这是对数据库中数组类型数据的支持,并不是作为此处使用。

上面就网上看到的一帖问题做个Mark。

关于JDBC中SQL语句的拼接注意事项:

下面是几个SQL字符串拼接的例子:

1.

Stringins=”‘/index.jsp’,’/login.jsp'”;Stringsql=”selecturlid,urlfromf_urlwhereurlin(“+ins+”)”;

注意到in里面的参数类型是varchar,因而在拼接的时候参数值需要用单引号(“’”)引住。

2.

Stringins=”10,11,12″;Stringsql=”selecturlid,urlfromf_urlwhereurlidin(“+ins+”)”;

注意到in里面的参数类型是int,因而直接拼接。

3.

StringBuildersb=newStringBuilder();Stringins=”10,11,12″;sb.append(“selecturlid,url”).append(“fromf_urlwhereurlidin(“).append(ins).append(“)”);

注意到在第二次调用append方法的时候,参数前面加了额外的空格,该空格将url和from分开,保证了SQL的正确性。

关于JDBC中SQL语句的注释:

通常在程序中直接拼写SQL语句的时候很少去写注释,原因是SQL写在代码里本身就是一种丑陋的方式。通过文件或者其它地方读取SQL,然后在程序中执行,这个时候SQL中的注释却有可能影响到其正确性,主要问题源于SQL的换行。

换行符:

1.windows中的换行符是\r\n,

2. linux/unix下的换行符是\n。

下面是在拼接SQL中使用注释的一些例子:

1.“–” 后的内容全部注释掉

Stringsql1=”selecturlid,urlfromf_url–注释”;

2.

Stringsql2=”selecturlid,urlfromf_url–注释\nwhereurlid>10″;

上面SQL注释内容之后使用了换行。程序实际执行的SQL是:

selecturlid,urlfromf_urlwhereurlid>10″;

3.

Stringsql2=”selecturlid,urlfromf_url\n–注释whereurlid<=10″;

上面SQL中先使用了换行然后“–”注释后面内容。程序实际执行的SQL是:

selecturlid,urlfromf_url

4.

Stringsql2=”selecturlid,–注释urlfromf_urlwhereurlid>10\norurlid<=10″;

上面SQL在程序中是无法执行通过的,注释符“–”破坏了SQL语法的正确性。需要在注释内容之后添加换行符才能保证SQL正确。

通过上面4个例子,很容易发现注释特征。含有注释的SQL语句要想在程序中正常执行需要保证注释内容不破坏SQL语句语法的正确性,保证了SQL的语法正确性之后需要保证注释不能改变SQL原本期望的命令内容。

简单明了就是保证注释后面有换行。

注释破坏SQL通常来自程序从外部读取SQL的时候,去除掉了原本的换行,使得整个内容变为一行。比如:一个SQL脚本文件其中有多行,在读取其内容的时候使之变为一行,,这时候其中的注释内容将影响到SQL在程序中的执行。

本文出自 “野马红尘” 博客,谢绝转载!

读书须用意,一字值千金。

JDBC操作SQL语句的注释和拼接

相关文章:

你感兴趣的文章:

标签云: