Java/study

SQL을 활용하여 MVC 응용

Clearing 2022. 7. 14. 09:11
728x90

DB에 상품번호(PK), 이름(NAME), 재고(CNT), 가격(PRICE)을 컬럼으로 가진

PRODUCT 테이블을 이용하여 CRUD를 구현

 

편의성을 위하여 DB연결과 해제를 효율적으로 하기 위해 JDBCUtil 클래스 생성

public class JDBCUtil {

	static final String driverName="oracle.jdbc.driver.OracleDriver";
	static final String url="jdbc:oracle:thin:@localhost:1521:xe";
	static final String user="kim";
	static final String password="1234";	

	public static Connection connect() {
		Connection conn = null;
		try {
			Class.forName(driverName);
			conn = DriverManager.getConnection(url, user, password);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return conn;
	}
	
	public static void disconnect(PreparedStatement pstmt,Connection  conn) {		
			try {
				pstmt.close();
				conn.close();
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}	
		}
	}

 

CREATE

	final String sql_insert="INSERT INTO PRODUCT VALUES((SELECT NVL(MAX(PID),0)+1 FROM PRODUCT),?,?,?)";
	// 프로덕트 테이블에 해당 정보들을 가진 객체 추가
	public boolean insert(ProductVO vo) { // 객체를 인자로 받아 정보를 DB에 추가
		conn = JDBCUtil.connect();
		try {
			pstmt = conn.prepareStatement(sql_insert); // pstmt 객체 생성하여 쿼리문 입력
			pstmt.setString(1,vo.getPname()); // 첫번째 ?에 이름 대입
			pstmt.setInt(2, vo.getCnt()); // 두번째 ?에 재고 대입
			pstmt.setInt(3, vo.getPrice()); // 세번째 ?에 가격 대입
			int res = pstmt.executeUpdate(); // 완성된 쿼리문 실행
			if(res<=0) {
				System.out.println("로그: 구매 실패...");
				return false; // 실행 실패시 반환
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			JDBCUtil.disconnect(pstmt, conn);
		}
		return true; // 실행 성공시 반환
	}

 

READ

	final String sql_selectAll="SELECT * FROM PRODUCT"; 
	// 프로덕트 테이블 전체를 가져옴

	public ArrayList<ProductVO> selectAll(ProductVO vo) { // 테이블 전체값 반환
		ArrayList<ProductVO> datas = new ArrayList<ProductVO>();
		conn = JDBCUtil.connect();
		try {
			pstmt = conn.prepareStatement(sql_selectAll); // pstmt 객체생성하여 쿼리문 입력
			ResultSet rs = pstmt.executeQuery();
			while(rs.next()) { // 입력될 값이 있으면 계속 반복
				ProductVO data = new ProductVO(); // 상품 객체 생성
				data.setCnt(rs.getInt("CNT")); // 생성된 객체에 상품의 재고 대입
				data.setPname(rs.getString("PNAME")); // 이름 대입
				data.setPid(rs.getInt("PID")); // PID 대입
				data.setPrice(rs.getInt("PRICE")); // PRICE 대입
				datas.add(data); // 값이 대입된 객체 배열에 추가
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			JDBCUtil.disconnect(pstmt, conn);
		}
		return datas; // 테이블 전체값이 들어간 객체 배열 반환
	}
}
	final String sql_selectOne="SELECT * FROM PRODUCT WHERE PID=?";
	// PID를 입력받아 프로덕트 테이블의 일치하는 정보 출력
	public ProductVO selectOne(ProductVO vo) {
		conn = JDBCUtil.connect();
		try {
			pstmt = conn.prepareStatement(sql_selectOne); // pstmt객체생성하여 쿼리문 작성
			pstmt.setInt(1,vo.getPid()); // DB에서 매칭할 상품의 PID 입력
			ResultSet rs = pstmt.executeQuery();
			if(rs.next()) {
				ProductVO data = new ProductVO(); // 객체에 정보전달
				data.setCnt(rs.getInt("CNT"));
				data.setPname(rs.getString("PNAME"));
				data.setPid(rs.getInt("PID"));
				data.setPrice(rs.getInt("PRICE"));
				return data; // 정보를 전달받은 객체 리턴
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			JDBCUtil.disconnect(pstmt, conn);
		}
		return null;
	}
}

 

UPDATE

	final String sql_update="UPDATE PRODUCT SET CNT=CNT-1 WHERE PID=?";
	// PID를 입력받아 프로덕트 테이블의 일치하는 상품의 재고 -1
	public boolean update(ProductVO vo) { // 상품구매 메서드
		conn = JDBCUtil.connect();
		try {
			pstmt = conn.prepareStatement(sql_update); // pstmt 객체에 쿼리문 작성
			pstmt.setInt(1,vo.getPid()); // 구매할 상품의 PID 매칭
			int res = pstmt.executeUpdate();
			if(res<=0) {
				System.out.println("로그: 구매 실패...");
				return false; // pstmt 실행 못하면 false 리턴
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return false; // Exception 발생시 false 리턴
		} finally {
			JDBCUtil.disconnect(pstmt, conn);
		}
		return true; // 성공시 true 리턴
	}
}

 

DELETE

	final String sql_delete="DELETE PRODUCT WHERE PID=?";
    // PID를 입력받아 프로덕트 테이블의 일치하는 상품 삭제
   	public boolean delete(ProductVO vo) { // 삭품삭제 메서드
		conn = JDBCUtil.connect();
		try {
			pstmt = conn.prepareStatement(sql_delete);
			pstmt.setInt(1,vo.getPid());
			int res = pstmt.executeUpdate();
			if(res<=0) {
				System.out.println("로그: 구매 실패...");
				return false;
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return false;
		} finally {
			JDBCUtil.disconnect(pstmt, conn);
		}
		return true;
	}
}

 

728x90