Computer >> 컴퓨터 >  >> 프로그램 작성 >> MySQL

JDBC의 준비된 명령문이 명령문보다 빠른 이유는 무엇입니까? 설명?

<시간/>

Statement 개체, 특히 insert 문을 사용하여 명령문을 실행하는 동안 쿼리가 실행될 때마다 전체 명령문이 컴파일되고 반복해서 실행됩니다. 여기서 이러한 명령문 사이의 유일한 차이점은 명령문의 값입니다.

반면 준비된 명령문은 미리 컴파일된 명령문입니다. 즉, 쿼리가 컴파일되어 데이터베이스에 저장되고 값 대신 자리 표시자(?)를 사용하여 이러한 자리 표시자에 값이 나중에 제공됩니다.

따라서 명령문의 반복적인 불필요한 컴파일과 실행을 피합니다.

예시

Dataset이라는 테이블이 있다고 가정해 보겠습니다. mobile_brand 열이 있는 데이터베이스에서 및 단위_세일 , 명령문 개체를 사용하여 이 테이블에 레코드를 삽입하려는 경우 코드는 다음과 같습니다.

stmt.executeUpdate("insert into Dataset values('Iphone', 3000)");
stmt.executeUpdate("insert into Dataset values('Samsung', 4000)");
stmt.executeUpdate("insert into Dataset values('Nokia', 5000)");
stmt.executeUpdate("insert into Dataset values('Vivo', 1500)");
stmt.executeUpdate("insert into Dataset values('Oppo', 9000)");
stmt.executeUpdate("insert into Dataset values('MI', 6400)");
stmt.executeUpdate("insert into Dataset values('MotoG', 4360)");
stmt.executeUpdate("insert into Dataset values('Lenovo', 4100)");
stmt.executeUpdate("insert into Dataset values('RedMi', 4000)");
stmt.executeUpdate("insert into Dataset values('OnePlus', 6334)");

그리고 모든 executeUpdate()에 대해 메서드 호출 그 안의 전체 명령문이 컴파일되고 실행됩니다. 여기서 명령문의 값만 변경되고 나머지 쿼리는 불필요하게 컴파일되는 것을 관찰하면 됩니다.

동일한 테이블에 동일한 데이터를 삽입하기 위해 준비된 문을 사용하여 삽입 쿼리를 작성하면 코드는 다음과 같습니다.

PreparedStatement pstmt = con.prepareStatement("insert into Dataset values(?, ?)");

pstmt.setString(1, "Iphone");
pstmt.setInt(2, 3000);
pstmt.executeUpdate();

pstmt.setString(1, "Samsung");
pstmt.setInt(2, 4000);
pstmt.executeUpdate();

pstmt.setString(1, "Nokia");
pstmt.setInt(2, 5000);
pstmt.executeUpdate();

pstmt.setString(1, "Vivo");
pstmt.setInt(2, 1500);
pstmt.executeUpdate();

pstmt.setString(1, "Oppo");
pstmt.setInt(2, 900);
pstmt.executeUpdate();

pstmt.setString(1, "MI");
pstmt.setInt(2, 6400);
pstmt.executeUpdate();

pstmt.setString(1, "MotoG");
pstmt.setInt(2, 4360);
pstmt.executeUpdate();

pstmt.setString(1, "Lenovo");
pstmt.setInt(2, 4100);
pstmt.executeUpdate();

pstmt.setString(1, "RedMi");
pstmt.setInt(2, 4000);
pstmt.executeUpdate();

pstmt.setString(1, "MotoG");
pstmt.setInt(2, 4360);
pstmt.executeUpdate();

pstmt.setString(1, "OnePlus");
pstmt.setInt(2, 6334);
pstmt.executeUpdate();

여기서 삽입 쿼리가 자리 표시자(?)로 준비되고 이 쿼리가 컴파일되어 데이터베이스에 저장되고 나중에 PreparedStatement 인터페이스의 setter 메서드를 사용하여 값이 전달되는 것을 관찰하면 명령문의 불필요한 실행을 방지할 수 있습니다.