调试代码的过程中遇到一个比较尴尬的问题,java代码中先进行sql拼接,然后再执行拼接后的sql,即一个又臭又长的字符串。设计到sql拼接的情况,我个人比较喜欢用StringBuilder拼接,毕竟使用 + 连接多个String子串的效率是较低的。不过我也是二手代码,懒得重写了,就直接在源代码基础上修改了。

之前代码的问题其实是出现在,通过JDBC从第三方数据库获取的字段为空,通过ResultSet.getString(“xxx”)方法取出来的值不是 “” ,而是 null ,所以通常用一个三目运算将 null 替换成 “” 。
例如:

resultSet.getString("LAST_UPDATE_DATE")==null?"":rs1.getString("LAST_UPDATE_DATE");

但是,我将null替换成 “” 却又出现了新的问题。将运行的sql打印出来一看,并不是期望的样子。

MapList list = db.query("...省略若干行... where LINE_LOCATION_ID ="+rs1.getString("LINE_LOCATION_ID")==null?"":rs1.getString("LINE_LOCATION_ID"));

将业务代码替换成一个简单的demo示例:

String str1 = "abc";
String str2 = "edg";
String str3 = str1+"123"==null?"":"123"+str2;

直行过后的结果为:123edg
道理很简单,+ 的优先级要大于 == ,所以先执行+运算,再执行三目运算;三目运算时为:“abc123”==null?“123edg” = “123edg”
运算符优先级可参考下图:
所以,在原业务代码中,前面的sql语句不管怎么拼接,最后执行的都是最后一个三木运算符 : 过后的字符串,当然,肯定会抛出无效SQL的异常。解决方法很简单,就是用()将三目运算符括起来,先执行三目运算,再执行sql拼接。个人更推荐使用StringBuilder拼接,涉及变量拼接时,直接多写一行,多append一次,少调次bug。

java通过+拼接字符串导致的无效SQL,三目运算符与+运算符结合使用时需要注意了相关推荐

  1. java求拼接后的字符串长度,java如何拼接字符串

    java 动态拼接字符串,Java 字符串拼接效率分析及最佳实践,java字符串拼接,java如何拼接字符串 在JAVA 中拼接两个字符串的最简便的方式就是使用操作符"+"了.如果 ...

  2. java用 拼接字符串的原理_Java String 拼接字符串原理详解

    首先来一道思考题: String str1 = "111111"; String str2 = "222222"; String str = str1 + st ...

  3. java逗号拼接字符串并且截断最后一个逗号(StrBuilder和substring)

    java逗号拼接字符串并且截断最后一个逗号 List<String> strings = new ArrayList<>();strings.add("aa" ...

  4. Java json拼接字符串_JSONObject与java字符串拼接json的区别

    背景 事情的起因是这样的.最近正在调试Socket.io的Android端接口.自己找到的Socket.io的Android的官方资料只是简单的字符串传递,而后台的接口则是一次性传递多组键值对参数,考 ...

  5. Java如何拼接字符串

    StringBuilder 的 append() 方法 "循环体内,拼接字符串最好使用 StringBuilder 的 append() 方法,而不是 + 号操作符" 这句话,我们 ...

  6. java 加单引号_【沫沫金】Java逗号拼接字符串增加单引号

    背景 页面提供逗号拼接的字符串,可作为数据库查询in的条件. a,b 问题 数据库针对字符串的in条件,要求增加单引号 xx in ('a','b') 需求 页面的逗号拼接字符串直接转换成数据库要求格 ...

  7. java 循环拼接字符串用分号隔开_Java 8中字符串拼接新姿势:StringJoiner

    在为什么阿里巴巴不建议在for循环中使用"+"进行字符串拼接一文中,我们介绍了几种Java中字符串拼接的方式,以及优缺点.其中还有一个重要的拼接方式我没有介绍,那就是Java 8中 ...

  8. java中无效字符串,在java中从字符串中删除无效的XML字符

    到目前为止,所有这些答案只会取代字符本身.但有时XML文档会有无效的XML实体序列,从而导致错误.例如,如果 Illegal character entity: expansion character ...

  9. java list 拼接 字符串数组_把数组所有元素排序,并按照“参数=参数值”的模式用“”字符拼接成字符串...

    /** * 把数组所有元素排序,并按照"参数=参数值"的模式用"&"字符拼接成字符串 * @param params 需要排序并参与字符拼接的参数组 * ...

最新文章

  1. Linux JSP连接MySQL数据库
  2. Android之ListActivity(一):布局与数据绑定
  3. Vue 2 | Part 4 v-bind绑定元素属性和样式
  4. 关于举办第十届浙江省大学生智能汽车 竞赛暨第十六届全国大学生智能汽车竞赛 浙江赛区选拔赛的通知
  5. 查看历史操作记录_燕麦课堂丨操作日志管理,为企业数据安全保驾护航
  6. golang 打印函数名/文件名/行号 Callers
  7. Codeforces 375D - Tree and Queries(dfs序+莫队)
  8. IIS7.0下 HTTP 错误 404.15 - Not Found 请求筛选模块被配置为拒绝包含的查询字符串过长的请求...
  9. ffplay播放flv文件没有声音的解决方法
  10. BLUE引擎或者LEG引擎M2架设时提示【该授权文件已过期】原因和解决方法
  11. 原创精美微信小程序UI界面——抖音版的“知乎”来啦
  12. 机器学习——概率论基础
  13. 中国网络游戏行业发展模式创新与投资前景调研报告2021-2027年
  14. thinkPHP基于php的枣院二手图书交易系统--php-计算机毕业设计
  15. 哔哩哔哩2020校园招聘 - K个一组翻转链表 一年中的第几天
  16. 考研全流程,两年经验分享
  17. C语言编程>第二周 ⑥ 一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
  18. 如何从零开始制作一款日式AVG游戏
  19. 100m光纤测速多少正常_100M,200M,500M,1000M,带宽测速参照表,测试结果(建议收藏)...
  20. WPS2019下开启宏,用于VBA编辑

热门文章

  1. 如何在一个元素上有多个CSS过渡?
  2. 为什么我的Spring @Autowired字段为空?
  3. 查找在Git中删除文件的时间
  4. form表单提交数据的同时上传文件代码示例
  5. char*和CString转换
  6. mysql 大表更新数据类型_MySQL优化之表结构优化的5大建议(数据类型选择讲的很好)...
  7. input 限制只能输入数字,且保留小数后两位
  8. Symbol()类型的定义及特点
  9. python重构迭代_Pylint:让你的 Python 代码保持一致
  10. 参与过上千亿项目的人,账单是何等的惊人?