>  기사  >  Java  >  자바 프로그래머가 저지르는 일반적인 SQL 실수 3가지

자바 프로그래머가 저지르는 일반적인 SQL 실수 3가지

伊谢尔伦
伊谢尔伦원래의
2016-11-26 10:33:191373검색

Java 프로그래머의 주간 작업은 확장 가능한 웹 애플리케이션을 코딩 및 개발하거나, 동적 웹 사이트를 생성하거나, 효율적인 전자 상거래 제품 페이지를 개발하거나, Android 애플리케이션을 개발하는 것이라고 볼 수 있습니다. 기다리다. 하지만 서로 다른 프로젝트를 진행하더라도 공통점은 바로 프로그래밍이라는 것입니다!

자바 프로그래머가 저지르는 일반적인 SQL 실수 3가지

프로그래밍 지식을 축적하려면 오랜 시간 작업이 필요한 직업입니다. 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();

대규모 데이터 세트를 삽입할 때 일괄 처리는 매우 중요합니다. 성능을 크게 향상시키려면 프로그래머는 일괄 처리 모드에서 명령문을 실행해야 합니다. 대량 삽입을 수행하는 또 다른 방법은 ReadyStatement 개체를 사용하는 것입니다. 그러나 일괄 처리는 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 테이블은 다음과 같습니다.

자바 프로그래머가 저지르는 일반적인 SQL 실수 3가지

위 테이블에서 직원 코드가 100보다 큰 모든 영업 부서 직원을 검색하려고 합니다. . 일반적으로 이 경우 프로그래머는 다음과 같은 방법으로 테이블을 쿼리합니다.

SELECT Eno, Ecode AS Employee_No,Employee_Code
FROM Employee
WHERE Edept LIKE 'M%'
AND CAST (Ecode AS INT) > 100;

그러나 위 쿼리에서는 오류가 발생합니다.

"varchar 값 'abc를 변환할 때 변환에 실패했습니다. '를 데이터 형식으로 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;


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.