2017-02-15 8 views
1

자바를 사용하여 데이터베이스를 쿼리하려고하는데,이 함수의 문제점을 이해하지 못합니다. 그것은 쓰레기 값을 반환합니다.Mysql DB 테이블에서 선택 필드 명세서 자바

나는 단지 MySQL 데이터베이스에서 first_name과 일치하는 값을 검색하려고합니다.

public List<Customer> select(String cusDB) { 
    return jdbcTemplate.query(
      "SELECT id, first_name, last_name FROM customers WHERE first_name= cusDB", 
      (rs, rowNum) -> new Customer(rs.getLong("id"), 
        rs.getString("first_name"), rs.getString("last_name"))); 
} 
+0

"쓰레기 값"을 반환한다면 매우 놀랍 겠지만, 알 수없는 열'cusDB' 또는 그와 유사한 것에 대한 예외를 빨리 예상 할 수 있습니다. –

답변

1

쿼리 문자열에 Java 매개 변수의 이름 만 지정할 수는 없습니다. 매개 변수를 쿼리에 명시 적으로 제공해야합니다. 이다

public List<Customer> select(String cusDB) { 
    return jdbcTemplate.query(
      "SELECT id, first_name, last_name FROM customers WHERE first_name= ?", 
      new Object[] { cusDB }, 
      (rs, rowNum) -> new Customer(rs.getLong("id"), 
        rs.getString("first_name"), rs.getString("last_name"))); 
} 

, 당신은 쿼리 문자열의 매개 변수 자리 (?)를 소개하고 각 매개 변수 자리 표시 자에 대한 (메서드 호출에 하나 개의 값을 매개 변수 값의 배열을 추가 이렇게하려면에, 당신의 코드를 변경 당신의 질문에). JdbcTemplate documentationJdbcTemplate.query(String sql, Object[] args, RowMapper<T> rowMapper)의 설명서를 참조하십시오.

3

당신은 첫 번째는 검색 할 당신의 FIRST_NAME과 쿼리 concatinate하는 두 가지 방법을 사용할 수 있습니다

"SELECT id, first_name, last_name FROM customers WHERE first_name= '" + cusDB + "'" 

둘째 사용 PrepapredStatement을과 같이 :

"SELECT id, first_name, last_name FROM customers WHERE first_name= ?" 
st.setString(1, cusDB); 

을하지만 난 PrepapredStatement에 대한 어떤 표지도 보이지 않으므로 여기에서 배울 수 있습니다. Prepared Statement doc

편집 안드레 쉴드 @처럼

는 주석에서 말했다 :

당신이 예를 들어, '; delete from customers; //will remove all customers from your database와 FIRSTNAME SQL 인젝션에 취약하다. 항상 (tm) 준비된 문 사용

+0

첫 번째 버전을 사용하지 마십시오. SQL 인젝션에 취약합니다. 예를 들어''; 고객에게서 삭제; //'모든 고객을 데이터베이스에서 제거합니다. 항상 (tm) 준비된 문을 사용하십시오. –

+0

예 @ AndréSchild는 PreparedStement를 사용하는 것이 좋습니다. 처음에는 문자열 연결에 대해 놓친 것 같아요. –