Java程序员可能犯的3个常见SQL错误
概述:Java程序员不仅要具备扎实的Java编程能力,在日常的工作当中往往还要涉及到其他语言的基础知识,尤其是SQL。那么哪些常见的SQL错误是程序员们容易犯的呢?让我们一起来看看吧!
你可能看到Java程序员每周的工作是编码开发一个可伸缩的Web应用程序,或创建一个动态的网站,或者开发高效的电子商务产品页面,也可能是开发一个Android应用程序等等。但是,即使他们致力于不同的项目,却往往都有一个共同点,那就是编程!
他们的职业要求长时间的工作来积累更多的编程知识。Java程序员还需要了解项目的需求、设计和开发一个属于自己的原型项目。为了使自己始终跟随行业变换的脚步,他们还必须具备其他语言的基础知识,比如HTML、SQL等等。
Java程序员的职业生涯并不是一帆风顺的,他们必须尝试每一次的挑战,即使是最好的程序员,有时在编程的过程中也难免会犯一些不可避免的错误。举个例子,在编写SQL语句时,有些错误却是绝对可以避免的。在这里,小编就为各位程序员列举一些常见的SQL错误。
|
1
|
SELECT TOP 3 common_mistakes FROM SQLProgrammingMistakes; |
上述查询的结果如下:
1.不使用批量更新
在编写SQL语句时,Java程序员最常见和最大的一个错误就是忘记批处理。在表中编写成千上万的INSERT语句这确实不是一个好主意,程序员应该使用单个的SQL语言来创建一个绑定不同的参数的批处理INSERT语句。执行批处理的速度将比单个执行快得多。
我们来看看以下一个例子:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
String [] queries = {"INSERT INTO Employee { Eno, Ename, Ecode, EDept} values ('1', 'Allen', 'abc', 'Sales')","INSERT INTO Employee { Eno, Ename, Ecode, EDept} values ('2', 'Max', '102', 'Marketing')","INSERT INTO Employee { Eno, Ename, Ecode, EDept} values ('3', 'Ward', 'xyz', 'Sales')","INSERT INTO Employee { Eno, Ename, Ecode, EDept} values ('4', 'Sam', '55', 'Marketing')",};Connection connection = new getConnection();Statement statement = connection.createStatement();for (String query : queries ) {statement.execute(query);}statement.close();connection.close(); |
这是一个糟糕的代码,在数据库中每一行INSERT语句都需要单独来执行。发送一批INSERT语句到数据库中一气呵成:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
import java.sql.Connection;import java.sql.Statement;//…Connection connection = new getConnection();Statement statement = connection.createStatement();For (Employee employee: employees){String query = "INSERT INTO Employee (Eno, Ename, Ecode, Edept) values (' " + Employee. getEno() + "', '" + Employee.getEname() +"', '" + Employee.getEcode() + "', '" + Employee.getEdept() + "')";statement.addBatch(query);}statement. executeBatch();statement.close();connection.close(); |
插入大型数据集时,批处理是非常重要的。为了显著提升性能,程序员应该尽量在批处理模式下运行一条语句。执行批量插入的另外一种方法是使用PreparedStatement对象。然而批处理不仅仅只是局限于INSERT语句,你还可以利用它来执行更新、删除和声明等操作。
2.DBMS引擎未优化查询
并不是所有的Java程序员都了解SQL。在SQL查询中可以用很多种方式来得到相同的结果,但是程序员应该始终遵循最快的响应最佳的方式。
例如一个Java程序员被要求从Employee表中检索所有名字以'A'打头的员工,通常他们喜欢使用LEFT函数返回雇员名字的第一个字符:
|
1
|
SELECT Ename FROM Employee WHERE LEFT (Ename,1) = ‘A’; |
但是这是不正确的。在上面的查询中,数据库系统将扫描整个表来找到所需的信息。不使用索引,因此会花费大量的时间在执行查询上。相反,程序员应该使用查询检索结果:
|
1
|
SELECT Ename FROM Employee WHERE Ename LIKE ‘A%’; |
上述查询将利用指数快速有效地检索数据。所以在一般情况下,如果该DBMS引擎可以采取一个索引,程序员应尽可能使用可优化搜索的词来加快查询的执行。
3.不正确的谓词运算顺序
很多Java程序员认为查询通常的处理顺序是如下:FROM,WHERE,GROUP BY,HAVING,SELECT。上述顺序列除了用于执行查询的逻辑顺序。从逻辑上讲,FROM子句首先处理,定义了源数据表中的检索数据;接下来就是WHERE,随后就是GROUP BY等等。然在在物理上来说,查询处理是不同的。谓词的评估顺序通常是由各种规则和数据库版本来改变的。
例如下面的Employee表:
| Eno | Ename | Ecode | Edept |
| 1 | Allen | abc | Sales |
| 2 | Max | 102 | Marketing |
| 3 | Ward | 55 | Marketing |
| 4 | Sam | xyz | Sales |
在给定的上表中,要检索所有销售部门员工的雇员代码大于100的。通常在这种情况下程序员将以下面的方式查询表:
|
1
2
3
4
|
SELECT Eno, Ecode AS Employee_No,Employee_CodeFROM EmployeeWHERE Edept LIKE 'M%'AND CAST (Ecode AS INT) > 100; |
然而,上面的查询结果错误:
“Conversion failed when converting the varchar value ‘abc’ to data type int”
查询失败的原因正是前面所指出的,没有规定执行谓词的顺序。在这种情况下,第二谓词求值首先导致转换错误。
相反使用CASE表达式,这里将保证只有合法的数值将被转换为int类型:
|
1
2
3
4
5
6
|
SELECT Eno, Ecode AS Employee_No,Employee_CodeFROM EmployeeWHERE Edept LIKE 'M%'AND CASE WHEN Ecode NOT LIKE '%[^0-9]%'THEN CAST (Ecode AS INT)END>100; |

Java程序员可能犯的3个常见SQL错误的更多相关文章
- 十个JAVA程序员容易犯的错误
十个JAVA程序员容易犯的错误 1. Array 转 ArrayList 一般开发者喜欢用: List<String> list = Arrays.asList(arr); Arrays. ...
- Java程序员常犯的10个错误
本文总结了Java程序员常犯的10个错误. #1. 把Array转化成ArrayList 把Array转化成ArrayList,程序员经常用以下方法: List<String> lis ...
- Java 程序员容易犯的10个SQL错误
Java程序员编程时需要混合面向对象思维和一般命令式编程的方法,能否完美的将两者结合起来完全得依靠编程人员的水准: 技能(任何人都能容易学会命令式编程) 模式(有些人用“模式-模式”,举个例子,模式可 ...
- Java程序员容易犯的10个错误
1. Array 转 ArrayList 一般开发者喜欢用: List<String> list = Arrays.asList(arr); Arrays.asList() 会返回一个Ar ...
- Java 程序员在写 SQL 时常犯的 10 个错误
Java程序员编程时需要混合面向对象思维和一般命令式编程的方法,能否完美的将两者结合起来完全得依靠编程人员的水准: 技能(任何人都能容易学会命令式编程) 模式(有些人用“模式-模式”,举个例子,模式可 ...
- 惊呆了!Java程序员最常犯的错竟然是这10个
和绝大多数的程序员一样,我也非常的宅.周末最奢侈的享受就是逛一逛技术型网站,比如说 programcreek,这个小网站上有一些非常有意思的主题.比如说:Java 程序员最常犯的错竟然是这 10 个, ...
- Java程序员最常犯的错误盘点之Top 10
1. 数组转ArrayList 为了实现把一个数组转换成一个ArrayList,很多Java程序员会使用如下的代码: Arrays.asList确实会返回一个ArrayList对象,但是该类是Arra ...
- 细数那些Java程序员最容易犯那些错
java作为最受欢迎程度榜榜首语言,自然是广大开发者使用最多的语言.正因为有如此广泛的使用性,java开发中发生异常也比比皆是,接下来我们就来看看那些java开发中最容易出现的那些错误. 1.重复造轮 ...
- [转载]一个标准java程序员的进阶过程
第一阶段:Java程序员 技术名称 内 容 说明 Java语法基础 基本语法.数组.类.继承.多态.抽象类.接口.object对象.常用类(Math\Arrarys\S ...
随机推荐
- Codeforces#313
A题 题意:给n个基础币值,问你是否能组成所有种类的币值,能则输出-1,不能则输出不能组成的最小币值. 思路:理解了题意就明白了,1是关键解. #include <iostream> #i ...
- JY03-HTML/CSS-京东02
---恢复内容开始--- 1. position:absolute 1.1 绝对定位设置定位值为百分比时: 如设置right:50%,即元素右侧外边框距离父盒子右侧始终始终为父盒子宽度的一半. 可以使 ...
- 基于CANVAS与MD5的客户端生成验证码
好久没写东西,工作太忙了!不想服务端请求太多,搞了个这玩意儿,不过项目中并不会用上,还是使用服务端生成的机制(会安全多少呢?):我就想问个问题,除了图像识别来破解这样的简单验证码外,针对我这种例子,可 ...
- lucene查询排序结果原理总结
参考文章 Lucene3.0结果排序原理+操作+示例 Lucene的排序算法 一句话总结lucene排序算法是什么样的 关键几个概念 参考文档: http://lucene.apache.org/co ...
- NHibernate执行原生带sum的sql
可以自行查出想要的字段,并且返回的是model类型,可以点出所有的字段. 但是select 后面的字段名 必须有xml的字段名一模一样. ISession iSession = null; strin ...
- sql - Invalid object name 'dbo.in$'
这是我从excel导入的表,用查询的时候,不加前面部分的'dbo',能查出来,好像是owner的原因吧.
- 带A圈的秘密
真嗒安全策略的罗罗,,害的我和其他的不一样.
- shell每日发邮件
LOGFILE="$fank/"`date +"%Y%m%d"`"data"#每日文件 from="abc@123.com&quo ...
- 成都Python工程师招聘
最近公司开放python岗位,机会非常不错. 数据相关的岗位,可以接触很多好玩技术.成都是新建研发中心,整体技术气氛很不错. 坐标:成都 行业/部门:金融,数据部门 基本要求: python精通,学习 ...
- C语言指针类型 强制转换
关于C语言指针类型 强制转换 引用一篇文章: C语言中,任何一个变量都必须占有一个地址,而这个地址空间内的0-1代码就是这个变量的值.不同的数据类型占有的空间大小不一,但是他们都必须有个地址,而这个 ...