文档章节

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

secondriver
 secondriver
发布于 2015/09/17 09:27
字数 1179
阅读 94
收藏 0

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

  

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

   

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

   

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:

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

    实际上是:

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.

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


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

2.

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

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


3.

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.“--” 后的内容全部注释掉

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

2.

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

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

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

3.

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

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

select urlid, url from f_url

4.

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
粉丝 10
博文 229
码字总数 233821
作品 0
广州
程序员
私信 提问
十个JDBC的最佳实践

JDBC是Java为多种关系型数据库提供的统一的访问接口,以下是我长期使用JDBC总结的十个最佳实践。 JDBC最佳实践1:使用PrearedStatement 任何一个使用过JDBC的Java程序员几乎都知道这个,Pre...

王振威
2012/09/08
6.5K
12
SQL--( 初识 MyBatis)

MyBatis介绍 MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手...

姜白告
2018/08/06
0
0
十个JDBC的最佳实践

JDBC是Java为多种关系型数据库提供的统一的访问接口,以下是我长期使用JDBC总结的十个最佳实践。 JDBC最佳实践1:使用PrearedStatement 任何一个使用过JDBC的Java程序员几乎都知道这个,Pre...

王振威
2012/11/26
1K
4
利用ANT的SQL Task来实现自己的Java执行SQL脚本文件的功能

Java代码中如何调用Ant的SQLExec类执行SQL脚本,最后考虑ant.jar的个头说大也不小,1M多,如果只用于执行SQL脚本,则绝大部分代码就是垃圾,所以从同抽离出需要的两个类JDBCTask和SQLExec,完...

JAVA_NINA
2012/03/21
1K
4
java EE web开发常用框架使用感言

java EE web项目开发,从前到后...从访问地址到处理完成转到JSP页面的转向方式: Struts:采用XML配置文件方式,路径配置集中。 Spring MVC:采用标记注入和return页面方式,路径配置分散在每个...

sxgkwei
2012/03/27
1K
3

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周一乱弹 —— 人生,还真是到处是意外

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @这次装个文艺青年吧 :#今日歌曲推荐# 分享lil peep的单曲《High School》 《High School》- lil peep 手机党少年们想听歌,请使劲儿戳(这里...

小小编辑
23分钟前
3
0
Spring使用ThreadPoolTaskExecutor自定义线程池及实现异步调用

多线程一直是工作或面试过程中的高频知识点,今天给大家分享一下使用 ThreadPoolTaskExecutor 来自定义线程池和实现异步调用多线程。 一、ThreadPoolTaskExecutor 本文采用 Executors 的工厂...

CREATE_17
今天
6
0
CSS盒子模型

CSS盒子模型 组成: content --> padding --> border --> margin 像现实生活中的快递: 物品 --> 填充物 --> 包装盒 --> 盒子与盒子之间的间距 content :width、height组成的 内容区域 padd......

studywin
今天
7
0
修复Win10下开始菜单、设置等系统软件无法打开的问题

因为各种各样的原因导致系统文件丢失、损坏、被修改,而造成win10的开始菜单、设置等系统软件无法打开的情况,可以尝试如下方法解决 此方法只在部分情况下有效,但值得一试 用Windows键+R打开...

locbytes
昨天
8
0
jquery 添加和删除节点

本文转载于:专业的前端网站➺jquery 添加和删除节点 // 增加一个三和一节点function addPanel() { // var newPanel = $('.my-panel').clone(true) var newPanel = $(".triple-panel-con......

前端老手
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部