1. INSERT
지금까지 SELECT문을 JAVA에서 사용했던 것과 비슷하다.
// 대륙정보 추가
public int setInsert(RegionDTO regionDTO) throws Exception {
Connection con = dbConnector.getConnect();
// JAVA는 기본으로 auto commit임
// auto commit 해제
con.setAutoCommit(false);
// 이건 안해도 상관 없음
String sql = "INSERT INTO REGIONS (REGION_ID, REGION_NAME) VALUES (?, ?)";
PreparedStatement st = con.prepareStatement(sql);
st.setLong(1, regionDTO.getRegion_id());
st.setString(2, regionDTO.getRegion_name());
// INSERT 문의 결과문은 성공한 숫자를 줌 (여기서는 몇 행이 삽입되었는지)
int result = st.executeUpdate();
// 그래서 int형으로 결과를 받아주는 것!
st.close();
con.close();
return result; // 0이면 INSERT 실패, 이 외 양의정수이면 1 이상 리턴해줌
}
기존의 SELECT문을 JAVA에 연결했던 것과 다른 점은 INSERT, UPDATE, DELETE문의 결과는 숫자형이라는 것이다.
그래서 SELECT문의 경우에는 결과가 ResultSet 객체로 나와서 그것에 담아줬었는데,
여기서는 int형에 결과를 담아서 그것을 리턴해주는 모습을 볼 수 있다.
이전 게시글에서도 설명했듯이, 0이 리턴되면 실패, 양의정수가 리턴이 되면 성공이다.
그래서 이 setInsert 메서드를 호출했을 때, 리턴값이 0이면 INSERT 쿼리가 실패한 것이고
아니라면 쿼리가 성공한 것이라고 처리를 해주면 된다.
한 가지 또 다른점은 PreparedStatement 객체에서 사용하는 메서드가 executeQuery 메서드가 아니라
executeUpdate 메서드라는 점이다.
이는 근데 당연한 것이, executeQuery 메서드는 리턴값이 ResultSet 객체이고,
executeUpdate 메서드는 리턴값이 int형이라 INSERT, UPDATE, DELETE문에 사용하면 된다.
나머지 쿼리를 작성하고 ?값을 처리하는 부분은 동일하다.
설명1. ID값은 중복불가인데, 항상 DB를 확인해야할까?
그런데 각 테이블의 ID 값들은 식별자라고 해서 다들 Primary Key로 지정이 되어 있다.
Primary Key는 중복불가, Null 불가인데, 이는 그냥 이 데이터들을 식별해주는 데이터에 불과하다.
그래서 각 테이블 별로 있는 EMPLOYEE_ID, DEPARTMENT_ID .... 등등의 ID 컬럼들은
사실 데이터의 ROW값들의 의미들은 단지 식별용에 불과하다. 그 값들의 의미는 상관 없고 각각 다르기만 하면 된다.
여기서 중요한건, 각각 값들이 달라야 한다는 것이다.
근데 JAVA에서 뭔가를 INSERT할때, ID의 값도 내가 INSERT를 해줘야하는데
이미 있는 ID인지 항상 내가 인지를 해주어야 하는가? 너무 귀찮은 작업이다.
그래서 시퀀스라는 것을 사용한다.
나중에 자세히 배우긴 하는데 우선 시퀀스를 조회하는 쿼리는 아래와 같다.
SELECT * FROM SEQ;
이러면 해당 DB에 존재하는 모든 시퀀스들이 조회된다.
보면, EMPLOYEE_ID의 값들은 1씩 증가되고, DEPARTMENT_ID의 값들은 10씩 증가되고
LOCATION_ID의 값들은 100씩 증가되고 있었는데 이게 다 이 시퀀스를 따라서 자동으로 값들이 매겨져서 그런 것이다.
그래서 앞으로 새로운 데이터들이 추가된다면, ID 값은 시퀀스를 통해 자동으로 생성해주면된다.
그러면, 중복되지 않은 데이터들이 자동으로 들어가게 되어서 내가 새로운 데이터를 넣을 때마다
새로운 데이터를 넣을 때마다 중복되었는지 안되었는지 확인할 필요가 없다.
이 시퀀스를 사용하는 방법은 아래와 같다.
-- 시퀀스명.nextval
INSERT INTO DEPARTMENTS (DEPARTMENT_ID, DEPARTMENT_NAME, MANAGER_ID, LOCATION_ID)
VALUES (DEPARTMENTS_SEQ.NEXTVAL,'TEST',200,1800);
이와같이 ID 컬럼에다가 시퀀스의 다음값을 자동으로 넣어주는 함수를 작성해주면 된다.
그러면 시퀀스의 규칙대로 알아서 중복되지 않는 값으로 자동으로 넣어주게 된다.
2. DELETE
// 대륙정보 삭제
public int setDelete(RegionDTO regionDTO) throws Exception {
Connection con = dbConnector.getConnect();
String sql = "DELETE REGIONS WHERE REGION_ID = ?";
PreparedStatement st = con.prepareStatement(sql);
st.setLong(1, regionDTO.getRegion_id());
int result = st.executeUpdate();
st.close();
con.close();
return result;
}
3. UPDATE
// 대륙정보 수정, name 수정
public int setUpdate(RegionDTO regionDTO) throws Exception {
Connection con = dbConnector.getConnect();
String sql = "UPDATE REGIONS SET REGION_NAME = ? WHERE REGION_ID = ? ";
PreparedStatement st = con.prepareStatement(sql);
st.setString(1, regionDTO.getRegion_name());
st.setLong(2, regionDTO.getRegion_id());
int result = st.executeUpdate();
st.close();
con.close();
return result;
}
'웹개발 풀스택 과정 > Database(Oracle)' 카테고리의 다른 글
26일차(2022.01.27) _ DDL - 테이블 수정, 제약조건 수정 (0) | 2022.01.27 |
---|---|
25일차(2022.01.26) _ DDL - 테이블 생성, 삭제, 제약조건 설정, KEY (0) | 2022.01.26 |
24일차(2022.01.25) _ 명령어 DML - INSERT, UPDATE, DELETE문 (0) | 2022.01.25 |
23일차(2022.01.24) _ JDBC - 테이블 간의 관계를 Java에서 표현하는 방식 (0) | 2022.01.24 |
23일차(2022.01.24) _ Join 기본 (0) | 2022.01.24 |