2013-11-21 5 views
0

INSERT 문을 사용하여 preparedstatement를 사용하면 모든 것이 잘 동작합니다.Java 명령문 with preparedstatement, select with not insert with

com.mysql.jdbc.StatementImpl cannot be cast to com.mysql.jdbc.PreparedStatement 

내가 여기에 게시 시작하기 전에 내가 조사를했는데 : 나는 SELECT 문을 위해 그것을 사용하는 경우

나는이 오류가 발생합니다. 이것은 세상에서, 나는 또한 인터넷에서 발견 된 다른 예제들과이 소스를 비교해야합니다.

private Connection connection = null; 
private PreparedStatement statement = null; 
private ResultSet result = null; 

public boolean usernameAvailable(String username) throws SQLException{ 
    boolean available = true; 
    String query = "SELECT Username FROM User WHERE Username = ?"; 
    try{ 
     statement = (PreparedStatement) connection.prepareStatement(query); 
     statement.setString(1, username); 
     result = statement.executeQuery(); 
     while(result.next()){ 
      available = false; 
     } 
    } 
    catch (Exception ex){ 
     System.out.println(ex.getMessage()); 
    } 
    finally{ 
     if(statement != null){ statement.close(); } 
     if(connection != null){ connection.close(); } 
    } 
    return available; 
} 

데이터베이스 연결은 생성자에서 처리하며 정상적으로 작동합니다. 그건 문제가 아니야.

+0

이걸 진행하셨습니까 ?? http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html –

+0

참으로 이상합니다. 수입에 문제가있을 수 있습니까? import java.sql.PreparedStatement를 시도하십시오; ? –

+0

executeQuery()가 아닌 execute()를 시도하십시오. –

답변

7

Connection.prepareStatement()의 결과를 com.mysql.jdbc.PreparedStatement으로 전송하여 달성하려는 작업을 알지 못하지만 실제로는 문제의 원인입니다.

MySQL 특정 클래스에 의존해서는 안됩니다. 그리고 인터페이스를 프로그래밍해야합니다. Connection.prepareStatement()이 반환하는 유형 인 java.sql.PreparedStatement에는 준비된 명령문을 사용해야하는 모든 것이 있습니다.

캐스트를 제거하고 코드 (가져 오기 포함)에서 MySQL 클래스에 대한 참조를 제거하십시오.

+0

고맙습니다. 작동합니다. 왜 내가 mysql 참조를 사용하지 말아야하는지 설명해 주시겠습니까? – Swag

+1

먼저 필요한 것은 없기 때문에 필요한 모든 메소드가 표준 Java 인터페이스에 있기 때문입니다. 둘째,이 인터페이스를 모든 데이터베이스 드라이버에 공통적으로 적용하는 것이 독점적 인 방법에 의존하지 않고 모든 데이터베이스에서 공통 코드를 사용할 수 있고 코드를 변경하지 않고도 데이터베이스를 변경할 수 있기 때문입니다 . –