java程序员常见的sql错误
前言
你可能看到java程序员每周的工作是编码开发一个可伸缩的web应用程序,或创建一个动态的网站,或者开发高效的电子商务产品页面,也可能是开发一个android应用程序等等。但是,即使他们致力于不同的项目,却往往都有一个共同点,那就是编程!
他们的职业要求长时间的工作来积累更多的编程知识。java程序员还需要了解项目的需求、设计和开发一个属于自己的原型项目。为了使自己始终跟随行业变换的脚步,他们还必须具备其他语言的基础知识,比如html、sql等等。
java程序员的职业生涯并不是一帆风顺的,他们必须尝试每一次的挑战,即使是最好的程序员,有时在编程的过程中也难免会犯一些不可避免的错误。举个例子,在编写sql语句时,有些错误却是绝对可以避免的。在这里,小编就为各位程序员列举一些常见的sql错误。
select top 3 common_mistakes from sqlprogrammingmistakes;
上述查询的结果如下:
1.不使用批量更新
在编写sql语句时,java程序员最常见和最大的一个错误就是忘记批处理。在表中编写成千上万的insert语句这确实不是一个好主意,程序员应该使用单个的sql语言来创建一个绑定不同的参数的批处理insert语句。执行批处理的速度将比单个执行快得多。
我们来看看以下一个例子:
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语句到数据库中一气呵成:
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函数返回雇员名字的第一个字符:
select ename from employee where left (ename,1) = ‘a';
但是这是不正确的。在上面的查询中,数据库系统将扫描整个表来找到所需的信息。不使用索引,因此会花费大量的时间在执行查询上。相反,程序员应该使用查询检索结果:
select ename from employee where ename like ‘a%';
上述查询将利用指数快速有效地检索数据。所以在一般情况下,如果该dbms引擎可以采取一个索引,程序员应尽可能使用可优化搜索的词来加快查询的执行。
3.不正确的谓词运算顺序
很多java程序员认为查询通常的处理顺序是如下:from,where,group by,having,select。上述顺序列除了用于执行查询的逻辑顺序。从逻辑上讲,from子句首先处理,定义了源数据表中的检索数据;接下来就是where,随后就是group by等等。然在在物理上来说,查询处理是不同的。谓词的评估顺序通常是由各种规则和数据库版本来改变的。
例如下面的employee表:
在给定的上表中,要检索所有销售部门员工的雇员代码大于100的。通常在这种情况下程序员将以下面的方式查询表:
select eno, ecode as employee_no,employee_code from employee where edept like 'm%' and cast (ecode as int) > 100;
然而,上面的查询结果错误:
“conversion failed when converting the varchar value ‘abc' to data type int”
查询失败的原因正是前面所指出的,没有规定执行谓词的顺序。在这种情况下,第二谓词求值首先导致转换错误。
相反使用case表达式,这里将保证只有合法的数值将被转换为int类型:
select eno, ecode as employee_no,employee_code from employee where edept like 'm%' and case when ecode not like '%[^0-9]%' then cast (ecode as int) end>100;
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
推荐阅读
-
java程序员常见的sql错误
-
Java程序员新手老手常用的八大开发工具
-
浅谈对jdbc和jtds的一些认识 博客分类: java JDBCCC++C#SQL Server
-
java程序员必须知道的4个书写代码技巧
-
MySQL常见错误有哪些_MySQL常见错误的快速解决方法
-
奇异的Glassfish启动错误 博客分类: 服务器Java编程 glassfishjavaasadmin
-
奇异的Glassfish启动错误 博客分类: 服务器Java编程 glassfishjavaasadmin
-
Java找不到或无法加载主类及编码错误问题的解决方案
-
java使用JDBC动态创建数据表及SQL预处理的方法
-
Java连接SQL server数据库时报出 com.microsoft.sqlserver.jdbc.SQLServerException: 必须声明表变量 "@P0"。错误