设为首页 收藏本站
查看: 943|回复: 0

[经验分享] JDBC操作SQL语句的注释和拼接

[复制链接]

尚未签到

发表于 2018-10-17 08:23:17 | 显示全部楼层 |阅读模式
  上网浏览帖子发现一个关于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语句的拼接注意事项:

  •   拼接内容数据类型和数据库数据类型一致或能够转换
  •   单引号和双引号的匹对使用
  •   内容中避免隐含中文不可见字符,全角字符等
  •   SQL复杂尽可能使用StringBuilder对象来构建或其他对象,避免“+”连字符使用(使用StringBuilder是需要注意的是在使用append方法的时候要留意拼接内容是否需要前后空格)
  •   拼接的SQL放在数据库客户端执行检验是否通过(SQL调试方法)
  •   最重要的是:避免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 \n  or urlid

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-622543-1-1.html 上篇帖子: SQL 2005 Express升级到其他版本 下篇帖子: SQL SERVER2000教程-第五章 处理数据 第二十二节 利用UNION对多条SQL查询语句合并生成表
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表