티스토리 뷰
- 오늘의 할 일 -
adminPage - 관리자의 상품목록 페이지 -> 부분 검색 , 삭제 , 수정 고치기- adminpage - 관리자 페이지 -> 수정, 삭제 문제를 해결하기 /ㅎㅎ 감이 안잡혀서 일단 넘겨
- UserPurchase - 사용자의 구매페이지 -> Userpage에서 특정 상품을 클릭하면 가져오기
- UserPurchase - 사용자의 구매페이지 -> 수량을 입력하고 구매 버튼을 누르면 성공,실패가 콘솔에 떠야함
- PurchaseDAO에서 purchase(pro) 메소드 만들기 purchase 메서드 클릭하면 product DB 에 보내주기(update) , purchase DB에 고객id, 상품과 수량이 담겨야함
adminPage - 부분 검색
error 난다고 하는 저 부분(txtAreaInfo)이 문제인 줄 알고 찾아봤는데 ...
ProductDAO, ProductDAOImple , OracleProductQuery 까지 봐야하는 줄 몰랐음
@Override
public ProductVO select(int prId) {
ProductVO vo = null;
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
DriverManager.registerDriver(new OracleDriver());
System.out.println("드라이버 로드 성공");
conn = DriverManager.getConnection(URL, USER, PASSWORD);
System.out.println("DB 연결 성공");
pstmt = conn.prepareStatement(PROD_SELECT_BY_PROD_ID);
//메소드는 매개 변수로 전달된 값(prId)을 PreparedStatement 객체에 설정한다
//첫 번째 매개 변수의 인덱스는 1. 따라서 이 코드는 첫 번째 매개 변수의 값을 prId로 설정한다
rs = pstmt.executeQuery();
if(rs.next()) { // 레코드가 존재할 때까지
int productId = rs.getInt(1); // PRODUCT_ID 컬럼
String productName = rs.getString(2); // NAME 컬럼
double price = rs.getDouble(3); // PRICE 컬럼
int stock = rs.getInt(4); // STOCK 컬럼
vo = new ProductVO(productId, productName, price, stock);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
pstmt.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return vo;
}
수정 전 ProductDAOImple
SQL_INSERT 쿼리의 ?를 채워주는 코드를 넣지 않아서 매개변수 전달도 안됐던 듯
@Override
public ProductVO select(int prId) {
ProductVO vo = null;
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
// 3. Oracle JDBC 드라이버를 메모리에 로드
DriverManager.registerDriver(new OracleDriver());
System.out.println("드라이버 로드 성공");
// 4. DB 와 Connection(연결)을 맺음
conn = DriverManager.getConnection(URL, USER, PASSWORD);
System.out.println("DB 연결 성공");
// 5. Connection 객체를 사용하여 PreparedStatement 객체를 생성
pstmt = conn.prepareStatement(PROD_SELECT_BY_PROD_ID);
// 6. SQL 문장 완성 - SQL_INSERT 쿼리의 ?를 채워주는 코드
pstmt.setInt(1,prId);
//메소드는 매개 변수로 전달된 값(prId)을 PreparedStatement 객체에 설정한다
//첫 번째 매개 변수의 인덱스는 1. 따라서 이 코드는 첫 번째 매개 변수의 값을 prId로 설정한다
// 7. SQL 문장 실행(DB 서버로 SQL 전송)
rs = pstmt.executeQuery();
if(rs.next()) { // 레코드가 존재할 때까지
int productId = rs.getInt(1); // PRODUCT_ID 컬럼
String productName = rs.getString(2); // NAME 컬럼
double price = rs.getDouble(3); // PRICE 컬럼
int stock = rs.getInt(4); // STOCK 컬럼
vo = new ProductVO(productId, productName, price, stock);
// 8. DB 서버가 보낸 결과 확인/처리
System.out.println("수정이 완료되었습니다.");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
pstmt.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return vo;
}
수정 후 ProductDAOImple
adminPage - 삭제
delete 도 이 부분만 문제인 줄 알았음
ProductDAO 를 보면
ProductDAOImple 를 보면
@Override
public int delete(int prId) {
int result = 0;
Connection conn = null;
PreparedStatement pstmt = null;
// PreparedStatement : 매개변수를 갖고 있는 SQL 문장을 활용하기 위한 클래스
// Statement와 상속관계
try {
// 2. Oracle JDBC 드라이버를 메모리에 로드
DriverManager.registerDriver(new OracleDriver());
System.out.println("드라이버 로드 성공");
// 3. DB와 Connection(연결)을 맺음
conn = DriverManager.getConnection(URL, USER, PASSWORD);
System.out.println("DB 연결 성공");
// 4. Connection 객체를 사용하여 PreparedStatement 객체를 생성
pstmt = conn.prepareStatement(PROD_DELETE);
System.out.println("PROD_DELETE 객체 생성");
// 5. SQL 문장 완성 - SQL_INSERT 쿼리의 ?를 채워주는 코드
pstmt.setInt(1, prId);
System.out.println("SQL 쿼리의 ?를 채워줌");
// 6. SQL 문장 실행(DB 서버로 SQL 전송)
result = pstmt.executeUpdate();
System.out.println("DB 서버로 SQL 전송");
// 7. DB 서버가 보낸 결과 확인/처리
System.out.println(result + "행이 삭제됐습니다.");
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
pstmt.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return result; // 0 : 실패, 1 : 성공
}
ㅎㅎ어떻게 해결했는지 잘 모르겠음.. select_by랑 비슷했던 것 같은데..
삭제,수정 둘 다 같은 문제점이 있어서 이것도 보완할 예정
마지막 번호가 삭제가..ㅎ
adminPage - 수정
여기도 이 부분부터 오류가 나서 여기 페이지만 계속 봄...
그러니깐 오류가 안잡히지
ProductDAO 보면
ProductDAOImple 보면
@Override
public int update(int prId, ProductVO vo) {
int result = 0;
Connection conn = null;
PreparedStatement pstmt = null;
// PreparedStatement : 매개변수를 갖고 있는 SQL 문장을 활용하기 위한 클래스
// Statement와 상속관계
try {
// 2. Oracle JDBC 드라이버를 메모리에 로드
DriverManager.registerDriver(new OracleDriver());
System.out.println("드라이버 로드 성공");
// 3. DB와 Connection(연결)을 맺음
conn = DriverManager.getConnection(URL, USER, PASSWORD);
System.out.println("DB 연결 성공");
// 4. Connection 객체를 사용하여 PreparedStatement 객체를 생성
pstmt = conn.prepareStatement(PROD_UPDATE);
// 5. SQL 문장 완성 - SQL_INSERT 쿼리의 ?를 채워주는 코드
pstmt.setString(1, vo.getProductName());
pstmt.setDouble(2, vo.getPrice());
pstmt.setInt(3, vo.getStock());
pstmt.setString(4, String.valueOf(vo.getProductId()));
// SQL 쿼리의 ? 순서와 parameterIndex의 값은 동일하게 지정
// 예시) ?가 첫 번째이면 parameterIndex = 1
// setInt() : DB의 Number 타입
// setString() : DB의 varchar, varchar2 타입
// setFloat() : DB의 Float 타입
// setDate() : DB의 Date 타입
// 6. SQL 문장 실행(DB 서버로 SQL 전송)
result = pstmt.executeUpdate();
// 7. DB 서버가 보낸 결과 확인/처리
System.out.println(result + "행이 수정됐습니다.");
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
pstmt.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return result; // 0 : 실패, 1 : 성공
}
문제였던 부분은 DAOImple 이었는데 이거 문제를 확인하려면 sql 쿼리도 봐야함
쿼리 순서에 맞게 넣었어야 했는데 제대로 수정을 안해놨음
문제가 발생한 부분 : pstmt.setInt(4, vo.getProductId());
"WHERE " + COL_PRODUCT_ID + " = ?"
product쿼리 부분인데
productId를 int 타입으로 받아서 생기는 문제임
productId는 productVO 객체의 멤버변수로 사용되고 있으며,
일반적으로 String 타입으로 사용되고 있다.
따라서 수정하려면 setString으로 바꿔줘야함.
하지만 productid는 int 타입이니깐.. String.valueOf() 메서드를 사용해 문자열로 변환해줘야함
문제의 부분 : 수정, 삭제 할 때
상품 id 가 size 보다 작게 등록한다는 제한조건이 없어서
이런 경우는 수정,삭제가 불가하다..
또 중간내용을 삭제해버리면
위와 같은 상황이 일어날 수 있게
이 부분에서 제한 장치가 필요한 듯 싶다.
'백엔드 교육과정 > 3월' 카테고리의 다른 글
2024.03.18_ 사이드 프로젝트 발표, 배포 방법 (0) | 2024.03.18 |
---|---|
2024.03.15 _ 사이드 프로젝트 발표 전 점검 (0) | 2024.03.15 |
2024.03.13 _ 중간피드백 이후 수정 내용 (0) | 2024.03.13 |
2024.03.11_사이드 프로젝트_백엔드 부분 (0) | 2024.03.12 |
2024.03.07_ 사이드 프로젝트 (0) | 2024.03.07 |