DEV-STUDY/Spring

[트러블슈팅/JDBC] Statement.executeQuery() cannot issue statements that do not produce result sets.

HwangJerry 2023. 11. 4. 21:37

jdbc 프로젝트를 진행하다가 위와 같은 이슈를 마주했다.

 

문제

원인을 알아보니 문제의 코드는 아래 부분이였다.

Statement stmt = conn.createStatement();
for (String ssn : ssnList) {
    sb = new StringBuilder();
    String sql = sb.append(baseDeleteClause).append("ssn = ").append(ssn).append(";").toString();
    stmt.executeQuery(sql);
}

 

위 코드 중 .executeQuery()메서드가 문제다. 한번 이번 기회에 살짝 알아보자.

 

 

알아야 할 것

jdbc에서 지원하는 실행 메서드는 execute() , executeQuery() , executeUpdate() 등이 대표적이다. 이 메서드들은 중요한 핵심 구별점이 있다.

 

  • executeQuery() : return 값으로 ResultSet을 반환한다. 즉, select 문은 이 메서드를 통해 수행해야 그 결과를 바로 받아낼 수 있다.
  • executeUpdate() : return 값으로 반영된 튜플의 개수를 반환한다. update, insert, delete 쿼리를 수행할 때 사용되며, update를 할 때 n개의 튜플에 대하여 수정이 반영되었으면 n이 반환되고, delete나 insert는 일반적으로 1이 반환될 것이다.
  • execute() : return 값으로 작업이 정상 처리되었는지 여부를 true / false인 boolean 으로 반환해준다.

 

포인트

 

중요한 점은, 수행하려는 SQL command에 따라 사용할 수 있는 메서드가 다르다는 것이다.

  • select 쿼리 : executeQuery() 또는 execute() 로 수행할 수 있다.
  • update, insert, delete 쿼리 : executeUpdate() 또는 execute() 로 수행할 수 있다.

 

결론

구분되는 현상은 실제 SQL을 실행시켜본 사람이라면 DBMS 반환값을 떠올렸을 때 이해가 쉬울 것이다. JDBC도 그냥 DBMS에 맞게 설계된 것 뿐이므로 이러한 현상이 발생하는 것이다. (여기서, execute()는 공통적으로 사용할 수 있지만, 용도에 맞게 잘 사용해야 할 것이다.)

 

단순하지만 좋은 경험을 했다.