DB 연동
public void check() throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection(
dbHost,
dbUser,
dbPassword
);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("show databases");
while (rs.next()) {
String line = rs.getString(1);
System.out.println(line);
}
}
Class.forName() 메소드로 jdbc 드라이버를 로딩 후
DriverManager.getConnection으로 db에 연결한다.
dbHost -> 데이터베이스 서버의 호스트 이름
dbUser -> 사용자 이름
dbPassword -> 비밀번호 이다.
연결이 성공하면 con을 사용해 statement 객체를 생성하고
statement의 executeQuery 메소드로 SQL 쿼리를 실행한다.
executeQuery의 결과는 ResultSet 객체로 반환되는데
이 rs 객체를 next()를 호출해 각 행을 순서대로 검색할 수 있고,
각 행의 특정 열값을 가져오려면 getString(), getInt() 등의 메서드를 사용하면 된다.
Statement vs PreparedStatement
Statement st = con.createStatement();
ResultSet rs = st.executeQuery("SHOW DATABASES");
위처럼 Statement는 SQL 쿼리에 파라미터를 직접 삽입한다.
그래서 Statement는 완성된 쿼리를 입력해야 한다.
Statement는 SQL 쿼리에 파라미터를 직접 삽입해 완성된 쿼리를 입력해야 한다.
이는 SQL Injection 공격에 취약할 수 있다.
PreparedStatement pstmt = con.prepareStatement("insert into users(id, name, password) values(?, ?, ?)");
pstmt.setString(1, "1");
pstmt.setString(2, "yeoon");
pstmt.setString(3, "12345678");
PreparedStatement는 placeholder(?)를 통해 나중에 setString 메소드를 통해 값을 설정할 수 있어
SQL Injection을 방지할 수있다.
또한 Statement는 SQL 쿼리를 실행할 때마다 쿼리를 컴파일하고 최적화 해야한다.
PreparedStatement는 동일 쿼리를 반복적으로 실행하는 경우 DB에서 쿼리 계획을 재사용할 수 있기 때문에 더 효율적이다.
사용 편의성 면에서도 PreparedStatement가 훨씬 편리하다.
Statement는 개발자가 수동으로 문자열 결합을 관리해야 하고,
PreparedStatement는 placeholder를 통해 파라미터를 쉽게 삽입할 수 있다.
보안, 성능향상, 사용 편의성 면에서 PreparedStatedment가 훨씬 이점이 많기 때문에
대부분의 경우 PreparedStatement를 사용하는 것이 좋다.
그러나 쿼리를 한번만 실행하고 별도의 파라미터가 없는 경우 Statement를 사용해도 괜찮다.
DB 접속 정보 변수 처리
https://krksap.tistory.com/2229
db 연결 시 db 접속 정보가 노출되는 문제가 있다.
이를 해결하기 위해 환경 변수를 사용한다.
자세한 내용은 강사님 블로그에...
'멋쟁이 사자처럼 > TIL' 카테고리의 다른 글
230524 6주 3일차. 템플릿 메소드 패턴. 의존성 주입 DI (1) | 2023.05.24 |
---|---|
230523 6주 2일차 TIL. DAO, executeQuery, executeUpdate, Connection 분리 (1) | 2023.05.23 |
230518 5주 4일차 TIL. 괄호 풀기, DB 연관관계, Dump (3) | 2023.05.18 |
230517 5주 3일차 TIL. 스택, DB (3) | 2023.05.17 |
230516 5주 2일차 TIL. 선택정렬, 삽입정렬 (1) | 2023.05.16 |