본문 바로가기
MySql

MySQL Java MySQL은 데이터베이스에 값이 있는지 확인합니다.

by 베이스 공부 2021. 1. 4.
반응형

내 데이터베이스에 특정 값이 이미 있는지 확인하려고합니다. JDBC를 사용하여 Java 독립 실행 형 앱에서 데이터베이스에 액세스하고 있습니다 (db 작업에 레코드를 삽입하는 쿼리이므로 설정 및 연결이 정상입니다).

String queryCheck = "SELECT * from messages WHERE msgid = " + msgid;
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery(queryCheck); // execute the query, and get a java resultset

// if this ID already exists, we quit
if(rs.absolute(1)) {
     conn.close();
     return;
}

이 오류가 발생합니다 (내 SQL 구문에 분명히 문제가 있음).

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'd-f05708071f8f' at line 1

그러나 MySQL 명령 줄에서이 명령을 실행하려고하면 작동합니다! 제 진술에 무슨 문제가 있는지 말씀해 주시겠습니까? 팁 주셔서 감사합니다!

 

해결 방법

 

MySQL에서 String 을 따옴표로 묶어야하므로 쿼리는

SELECT * from messages WHERE msgid = 'd-f05708071f8f';

아니

SELECT * from messages WHERE msgid = d-f05708071f8f;

따라서 코드는

String queryCheck = "SELECT * from messages WHERE msgid = '" + msgid + "'";

이러한 종류의 문제와 SQL 주입의 위험을 피하기 위해 PreparedStatement 를 사용하는 것이 좋습니다.

final String queryCheck = "SELECT * from messages WHERE msgid = ?";
final PreparedStatement ps = conn.prepareStatement(queryCheck);
ps.setString(1, msgid);
final ResultSet resultSet = ps.executeQuery();

쿼리 작성에 문자열 연결을 사용하는 것은 매우 나쁜 습관으로 간주됩니다. 지금은 오래되었습니다.

또한 전체 select * 대신 select count (*) 를 사용하는 것이 좋습니다. 이는 훨씬 적은 데이터를 반환하기 때문입니다 ( ResultSet ) 및 MySQL도이를 최적화 할 수 있습니다.

final String queryCheck = "SELECT count(*) from messages WHERE msgid = ?";
final PreparedStatement ps = conn.prepareStatement(queryCheck);
ps.setString(1, msgid);
final ResultSet resultSet = ps.executeQuery();
if(resultSet.next()) {
    final int count = resultSet.getInt(1);
}

 

참조 페이지 https://stackoverflow.com/questions/16099382

 

 

반응형

댓글