<< 학습 목표 >>
1. INSERT, UPDATE, DELETE 쿼리를 보내 실행하고 결과를 받아올 수 있다.
2. INSERT, UPDATE, DELETE 쿼리의 실행 결과가 무엇인지 알 수 있다.
이전 글에서는 자바와 DB를 연동하는 방법만 배웠음
이 글에서는 INSERT, UPDATE, DELETE 쿼리를 보내고 결과를 받는 방법을 배워보자
우선 테이블을 만들자
CREATE TABLE `tb` ( `idx` INT(11) NOT NULL AUTO_INCREMENT, `col1` INT(11) NULL DEFAULT NULL, `col2` VARCHAR(50) NULL DEFAULT NULL, `col3` TIMESTAMP NULL DEFAULT NULL, PRIMARY KEY (`idx`) ) |
chapter04 -> DAO 클래스를 추가하고 아래 코드를 추가하자
package chapter04;
public class DAO {
public void insert() {
}
public void update() {
}
public void delete() {
}
}
DAO 클래스에 있는 insert, update, delete 메서드를 통해서 INSERT, UPDATE, DELETE 쿼리를 보내고 결과를 받는 방법을 배울 것
insert 메서드부터 보자
쿼리를 보내고 결과를 받기 위해서는 항상 먼저 DB에 접속해야함
insert 메서드 안에 DB에 접속하는 코드를 넣어보자
public void insert() {
try {
Class.forName("org.mariadb.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mariadb://localhost:3306/practice?user=root&password=0000");
String sql = "전송하고 실행할 쿼리(Query)";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.executeUpdate();
conn.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
이제 INSERT 쿼리를 작성하려하는데 tb 테이블의 칼럼을 보자
tb 테이블에는 칼럼이 4개가 있지만 idx 칼럼은 기본값이 AUTO_INCREMENT 이므로 col1, col2, col3 칼럼에만 데이터를 저장하면 됨
insert 메서드 내 아래와 같이 INSERT 쿼리를 작성하고 쿼리를 보낸 후 결과를 받아 오는 코드를 넣자
public void insert() {
try {
Class.forName("org.mariadb.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mariadb://localhost:3306/practice?user=root&password=0000");
String sql = "INSERT INTO tb(col1, col2, col3) VALUES(1, '첫번째', TIMESTAMP('2023-03-06 13:30:00'))";
PreparedStatement pstmt = conn.prepareStatement(sql);
int count = pstmt.executeUpdate();
System.out.println("INSERT 쿼리로 영향 받은 행의 수 => " + count);
conn.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
INSERT, UPDATE, DELETE 쿼리를 실행하고 결과를 받아오려면 executeUpdate 메서드를 사용한다 했으므로 executeUpdate 메서드를 사용했음(1)
executeUpdate 메서드는 해당 쿼리로 영향 받은 행의 수를 반환함
현재 우리가 1개의 데이터를 INSERT 했으므로 영향 받은 행의 수(INSERT 된 데이터의 수)는 1 임(2)
이제 소스 파일을 추가하고 DAO의 insert 메서드를 호출하자
package chapter04;
public class JavaProgram {
public static void main(String[] args) {
DAO dao = new DAO();
dao.insert();
}
}
tb 테이블을 확인해보면 자바에서 보낸 INSERT 쿼리가 실행되 데이터가 저장되어있을 것
지금 작성한 INSERT 쿼리는 사실 잘못된 방식으로 INSERT 쿼리를 작성한 것
쿼리를 정확하게 작성해 보내자
방금 작성한 쿼리는 약식으로 작성한 것으로 PreparedStatement 는 쿼리를 작성할 때 "값" 자리는 ? 를 넣어야함
그 후 executeUpdate 메서드를 호출해서 쿼리를 DB로 보내기 전에 ? 자리에 들어갈 값을 채워야함
무슨 말인지 아래 코드를 보자
public void insert() {
try {
Class.forName("org.mariadb.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mariadb://localhost:3306/practice?user=root&password=0000");
String sql = "INSERT INTO tb(col1, col2, col3) VALUES(?, ?, TIMESTAMP(?))";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, 2);
pstmt.setString(2, "두번째");
pstmt.setString(3, "2023-03-06 13:42:00");
int count = pstmt.executeUpdate();
System.out.println("INSERT 쿼리로 영향 받은 행의 수 => " + count);
conn.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
정확하게 바꾼 쿼리에서 값 자리는 ? 로 채우고(1) executeUpdate 메서드를 호출하기 전 set으로 시작하는 메서드를 통해 ? 자리에 들어갈 값을 채웠음(2)
PreparedStatment는 반드시 마지막으로 한, 방금 한 방식으로 쿼리를 구성해 보내야함
마지막으로 한 방식으로 쿼리를 채우지 않고 첫번째로 한 방식으로 쿼리를 구성하면 SQLInjection 이라는 해킹 공격을 받아 DB 내 중요한 개인정보 같은것들이 유출 될 수 있음
첫번째로 한 방식(잘못된 방식)과 두 번째로 한 방식(올바른 방식)을 비교해보자
<< 첫번째로 한 방식(잘못된 방식) >>
<< 두번째로 한 방식(올바른 방식) >>
여기까지 INSERT 쿼리 보내고 결과 받기 끝~!
UPDATE, DELETE 는 한번에 같이보자
<< update 메서드 >>
public void update() {
try {
Class.forName("org.mariadb.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mariadb://localhost:3306/practice?user=root&password=0000");
String sql = "UPDATE tb SET col1 = ?, col2 = ?, col3 = TIMESTAMP(?) WHERE idx = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, 3);
pstmt.setString(2, "세번째");
pstmt.setString(3, "2023-03-06 13:54:00");
pstmt.setInt(4, 1);
int count = pstmt.executeUpdate();
System.out.println("UPDATE 쿼리로 영향 받은 행의 수 => " + count);
conn.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
<< delete 메서드 >>
public void delete() {
try {
Class.forName("org.mariadb.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mariadb://localhost:3306/practice?user=root&password=0000");
String sql = "DELETE FROM tb WHERE idx = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, 2);
int count = pstmt.executeUpdate();
System.out.println("DELETE 쿼리로 영향 받은 행의 수 => " + count);
conn.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
INSERT, UPDATE, DELETE 방식들을 나란히 놓고 비교해보면 모두 똑같은 방식이라는걸 알 수 있음
쿼리 형태를 작성하고(1) 쿼리의 형태를 완성하고(2) 쿼리를 보내 실행 및 결과를 받아오는 방식(3) 임
여기까지 자바로 INSERT, UPDATE, DELETE 쿼리를 보내 실행 시키고 결과를 받아오는 방법을 봤음
여기서 중요한 건 SQL을 얼마나 이해하고 있냐임
SQL을 잘 알아야 자바로 내가 원하는 쿼리를 보내 실행시킬 수 있음
'Servlet + JSP > Serlvet-Chapter04' 카테고리의 다른 글
Chapter04. 자바의 DB와 관련된 자원은 close 를 해줘야한다. (2) | 2023.03.06 |
---|---|
Chapter04. 자바에서 쿼리 보내고 결과 받기 / SELECT (0) | 2023.03.06 |
Chapter04. 자바와 DB 연동 (0) | 2023.03.04 |
Chapter04. ServletConfig (0) | 2023.03.03 |
Chapter04. ServletContext (0) | 2023.03.03 |