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

简介:

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

    

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

   

1
2
3
4
String sql =  "select urlid, url from f_url where url in(?)" ;
         pstmt = conn.prepareStatement(sql);
         pstmt.setString( 1 "/index.jsp,/login.jsp" );
         rs = pstmt.executeQuery();

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

1
select  urlid, url  from  f_url  where  url  in ( '/index.jsp' , '/login.jsp' )

    实际上是:

1
select  urlid, url  from  f_url  where  url  in ( '/index.jsp,/login.jsp' )

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


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


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



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

  1. 拼接内容数据类型和数据库数据类型一致或能够转换

  2. 单引号和双引号的匹对使用

  3. 内容中避免隐含中文不可见字符,全角字符等

  4. SQL复杂尽可能使用StringBuilder对象来构建或其他对象,避免“+”连字符使用(使用StringBuilder是需要注意的是在使用append方法的时候要留意拼接内容是否需要前后空格)

  5. 拼接的SQL放在数据库客户端执行检验是否通过(SQL调试方法)

  6. 最重要的是:避免SQL与代码紧密耦合,分离是更好的选择(可以统一管理)



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

1.

1
2
String ins =  "'/index.jsp','/login.jsp'" ;
         String sql =  "select urlid, url from f_url where url in("  + ins +  ")" ;


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

2.

1
2
String ins =  "10,11,12" ;
         String sql =  "select urlid, url from f_url where urlid in("  + ins +  ")" ;

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


3.

1
2
3
4
StringBuilder sb =  new  StringBuilder();
         String ins =  "10,11,12" ;
         sb.append( "select urlid, url" ).append( " from f_url where urlid in(" )
                 .append(ins).append( ")" );

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


关于JDBC中SQL语句的注释:


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

   

     换行符:

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

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


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

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

1
String sql1 =  "select urlid, url from f_url --注释" ;

2.

1
String sql2 =  "select urlid, url from f_url --注释   \n where urlid > 10" ;

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

1
select  urlid, url  from  f_url  where  urlid > 10";

3.

1
String sql2 =  "select urlid, url from f_url \n --注释    where urlid <=10" ;

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

1
select  urlid, url  from  f_url

4.

1
String sql2 =  "select urlid, --注释    url from f_url  where urlid > 10 \n  or urlid <=10" ;

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


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


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

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



本文转自 secondriver 51CTO博客,原文链接:http://blog.51cto.com/aiilive/1576915,如需转载请自行联系原作者

相关文章
|
7天前
|
SQL Java 数据库连接
[SQL]SQL注入与SQL执行过程(基于JDBC)
本文介绍了SQL注入的概念及其危害,通过示例说明了恶意输入如何导致SQL语句异常执行。同时,详细解释了SQL语句的执行过程,并提出了使用PreparedStatement来防止SQL注入的方法。
28 1
|
1月前
|
SQL 关系型数据库 MySQL
详解 pypika 模块:SQL 语句生成器,让你再也不用为拼接 SQL 语句而发愁
详解 pypika 模块:SQL 语句生成器,让你再也不用为拼接 SQL 语句而发愁
66 4
|
1月前
|
SQL 分布式计算 Java
大数据-96 Spark 集群 SparkSQL Scala编写SQL操作SparkSQL的数据源:JSON、CSV、JDBC、Hive
大数据-96 Spark 集群 SparkSQL Scala编写SQL操作SparkSQL的数据源:JSON、CSV、JDBC、Hive
33 0
|
1月前
|
SQL 分布式计算 关系型数据库
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
79 0
|
1月前
|
SQL 分布式计算 关系型数据库
Hadoop-23 Sqoop 数据MySQL到HDFS(部分) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-23 Sqoop 数据MySQL到HDFS(部分) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
35 0
|
1月前
|
SQL 分布式计算 关系型数据库
Hadoop-22 Sqoop 数据MySQL到HDFS(全量) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-22 Sqoop 数据MySQL到HDFS(全量) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
44 0
|
3月前
|
SQL Java 数据库连接
JDBC连接SQL Server2008 完成增加、删除、查询、修改等基本信息基本格式及示例代码
这篇文章提供了使用JDBC连接SQL Server 2008数据库进行增加、删除、查询和修改操作的基本步骤和示例代码。
|
4月前
|
SQL 分布式计算 MaxCompute
SQL开发问题之对于ODPS中的UNION操作,执行计划的问题如何解决
SQL开发问题之对于ODPS中的UNION操作,执行计划的问题如何解决
|
4月前
|
SQL 分布式计算 DataWorks
MaxCompute操作报错合集之使用sql查询一个表的分区数据时遇到报错,该如何解决
MaxCompute是阿里云提供的大规模离线数据处理服务,用于大数据分析、挖掘和报表生成等场景。在使用MaxCompute进行数据处理时,可能会遇到各种操作报错。以下是一些常见的MaxCompute操作报错及其可能的原因与解决措施的合集。
|
4月前
|
SQL 分布式计算 资源调度
MaxCompute操作报错合集之执行SQL Union All操作时,数据类型产生报错,该怎么解决
MaxCompute是阿里云提供的大规模离线数据处理服务,用于大数据分析、挖掘和报表生成等场景。在使用MaxCompute进行数据处理时,可能会遇到各种操作报错。以下是一些常见的MaxCompute操作报错及其可能的原因与解决措施的合集。
124 1

热门文章

最新文章

下一篇
无影云桌面