Notice
Recent Posts
Recent Comments
관리 메뉴

Developer Gonie

[7주차] 8. select, insert, update, delete 를 종합해서 다루는 예제(DAO, DTO) 본문

K-DigitalTraining 강의/3. JDBC(Java + Oracle DB)

[7주차] 8. select, insert, update, delete 를 종합해서 다루는 예제(DAO, DTO)

이대곤 2022. 6. 23. 12:11

* 아래의 의미들을 이용해 클래스 이름을 정하는데 참고했다.

 

DAO(Data Access Objects) -> 아래서 PersonDao 클래스 
-DB를 사용해 데이터를 조회하거나 조작을 전담하는 오브젝트로 DB와의 연결을 담당하기도 한다.
- 저장소(테이블)에 데이터를 입력, 조회, 수정, 삭제 등의 처리를 한다.

DTO(Data Transfer Object) -> 아래서 PersonBean 클래스
데이터의 전달을 위해 만드는 오브젝트
데이터를 담을 private 변수와 그 변수를 조작할 수 있는 public의 getter, setter 메서드로 구성한다.
bean 또는 vo(value object)라고도 한다.

 

-- 초기 데이터셋 생성
drop sequence prdseq;
create sequence prdseq
	increment by 1
	start with 1
	minvalue 1
	nocache;
	
drop table products;
create table products(
	id number primary key,
	name varchar2(30),  
	stock number, 
	price number,
	category varchar2(30), 
	inputdate date default sysdate
);

insert into products values(prdseq.nextval,'mp3',20,300,'IT', default); 
insert into products values(prdseq.nextval,'갤럭시S6',30,200,'IT', default);
insert into products values(prdseq.nextval,'iPhone',40,500,'IT', default);
insert into products values(prdseq.nextval,'세탁기',20,300,'KJ', default);
insert into products values(prdseq.nextval,'냉장고',30,200,'KJ', default);
insert into products values(prdseq.nextval,'TV',40,500,'KJ', default);
insert into products values(prdseq.nextval,'Computer',20,300,'IT', default);
insert into products values(prdseq.nextval,'iMac',30,200,'IT', default);
commit ;

select * from products ;

ProductMain 클래스.java

import java.util.Scanner;
import java.util.ArrayList;

public class ProductMain {
	//static 메서드에서 사용되는 객체들은 static으로 선언해줘야 함.(일반 지역변수 제외)
	static Scanner sc = new Scanner(System.in);
	static ProductDao dao = new ProductDao();
	
	public static void main(String[] args) {
		init();
	}
	
	public static void init() {
		while(true) {
			System.out.println();
			System.out.println("===메뉴 선택===");
			System.out.println("1.모든 상품 조회");
			System.out.println("2.특정 상품 조회(아이디 이용)");
			System.out.println("3.특정 상품 조회(카테고리 이용)");
			System.out.println("4.상품 수정");
			System.out.println("5.상품 삭제");
			System.out.println("6.상품 추가");
			System.out.println("7.프로그램 종료");
			System.out.print("번호 입력>>");
			
			int munu = sc.nextInt();
			
			switch(munu) {
			case 1:
				ArrayList<ProductBean> lists = dao.getAllProduct();
				showProducts(lists);
				break;
			case 2:
				getProductById();
				break;
			case 3:
				getProductByCategory();
				break;
			case 4:
				updateData();
				break;
			case 5:
				deleteData();
				break;
			case 6:
				insertData();
				break;
			case 7:
				System.out.println("프로그램을 종료합니다.");
				System.exit(0);
				break;
			default : System.out.println("1~7사이의 번호만 입력 가능");
			}
		}
	}

	static void showProducts(ArrayList<ProductBean> lists) {
//		for (ProductBean pb : lists) {
//			System.out.println(pb.toString());
//		}

		for (int i = 0; i < lists.size(); i++) {
			ProductBean pb = lists.get(i);
			System.out.println(pb.toString());
//			System.out.println(pb.getId() +","+ pb.getName() +","+ pb.getStock() +","+ pb.getPrice() +","+ pb.getCategory() +","+ pb.getInputdate());
		}
	}
	
	private static void getProductById() {
		
		System.out.print("검색할 아이디 입력 : ");
		int id = sc.nextInt();
		
		ProductBean pb = dao.getProductById(id);
		
		if (pb == null)
			System.out.println("찾는 아이디의 레코드가 존재하지 않습니다.");
		else
			System.out.println(pb.toString());
	}
	
	private static void getProductByCategory() {
		
		System.out.print("검색할 카테고리 입력(IT/KJ) : ");
		String cate = sc.next().toUpperCase();
		
		ArrayList<ProductBean> lists = dao.getProductByCategory(cate);
		
		if (lists.size() == 0)
			System.out.println("찾는 카테고리가 없습니다.");

		else
			showProducts(lists);
	}
	
	private static void insertData() {
		System.out.println("id는 시퀀스로 입력됩니다.");
		
		System.out.print("상품명 입력:");
		String name = sc.next();
		
		System.out.print("재고수량 입력:");
		int stock = sc.nextInt();
		
		System.out.print("가격 입력:");
		int price = sc.nextInt();
		
		System.out.print("카테고리 입력:");
		String category = sc.next();
		
		System.out.print("입고일자 입력:");
		String inputdate = sc.next();
		
		ProductBean bean = new ProductBean();
		
		bean.setName(name);
		bean.setStock(stock);
		bean.setPrice(price);
		bean.setCategory(category);
		bean.setInputdate(inputdate);
		
		int cnt = dao.insertProduct(bean);
		
		if(cnt > 0) 
			System.out.println("insert 성공");
		else
			System.out.println("insert 실패");
	}
	
	private static void deleteData() {
		System.out.print("삭제할 id 입력: ");
		int id = sc.nextInt();
		
		int cnt = dao.deleteProduct(id);
		
		if(cnt > 0)
			System.out.println("삭제 성공");
		else
			System.out.println("삭제 실패");
	}
	
	private static void updateData() {
		System.out.print("수정할 id 입력: ");
		int id = sc.nextInt();
		
		System.out.print("상품명 입력:");
		String name = sc.next();
		
		System.out.print("재고수량 입력:");
		int stock = sc.nextInt();
		
		System.out.print("가격 입력:");
		int price = sc.nextInt();
		
		System.out.print("카테고리 입력:");
		String category = sc.next();
		
		System.out.print("입고일자 입력:");
		String inputdate = sc.next();
		
		ProductBean bean = new ProductBean();
		
		bean.setId(id);
		bean.setName(name);
		bean.setStock(stock);
		bean.setPrice(price);
		bean.setCategory(category);
		bean.setInputdate(inputdate);
		
		int cnt = dao.updateProduct(bean);
		
		if(cnt > 0) 
			System.out.println("update 성공");
		else if(cnt == 0)
			System.out.println("조건에 맞는 레코드가 없음");
		else
			System.out.println("update 실패");
	}
}

ProductDao 클래스.java

import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

public class ProductDao {

	String driver = "oracle.jdbc.driver.OracleDriver";
	String url = "jdbc:oracle:thin:@localhost:1521:orcl";
	String id = "jspid";
	String pw = "jsppw";

	Connection conn = null;

	ProductDao() {
		try {
			// 1. 드라이버 로드
			Class.forName(driver);
		} catch (ClassNotFoundException e) {
			System.out.println("드라이버 로드 실패");
		}
	}

	public void connect() {
		try {
			// 2. 계정에 접속
			conn = DriverManager.getConnection(url, id, pw);
		} catch (SQLException e) {
			System.out.println("계정 접속 실패");
			;
		}
	}

	public ArrayList<ProductBean> getAllProduct() {
		// 2. 계정에 접속
		connect();
		System.out.println("conn:" + conn);

		ArrayList<ProductBean> lists = new ArrayList<ProductBean>();

		try {
			// 3. SQL문 작성, 분석
			String sql = "select * from products";
			PreparedStatement ps = conn.prepareStatement(sql);

			// 4. SQL문 실행
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				ProductBean bean = new ProductBean();

				int id = rs.getInt("id");
				bean.setId(id);

				String name = rs.getString("name");
				bean.setName(name);

				int stock = rs.getInt("stock");
				bean.setStock(stock);

				int price = rs.getInt("price");
				bean.setPrice(price);

				String category = rs.getString("category");
				bean.setCategory(category);

				 //이걸 안하고 바로 getString()으로 받아 출력해보면 '초'까지 출력되어 원하는 결과가 아니라 이걸 거치는 것임
				Date inputdate = rs.getDate("inputdate"); // Date 타입이 java.sql.Date 라는점에 주의
				String sinputdate = String.valueOf(inputdate);
				bean.setInputdate(sinputdate);

				lists.add(bean);
			}

		} catch (SQLException e) {
			e.printStackTrace();
		} finally { // try문 마치기전 반드시 해야할게 있다면 finally 에서 작성
			try {
				// 5. 연결 종료
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

		return lists;
	}// getAllProduct()

	public ProductBean getProductById(int vid) {
		// 2. 계정에 접속
		connect();
		System.out.println("conn:" + conn);

		ProductBean bean = null;

		try {
			// 3. SQL문 작성, 분석
			String sql = "select * from products where id = ?";
			PreparedStatement ps = conn.prepareStatement(sql);

			ps.setInt(1, vid);

			// 4. SQL문 실행
			ResultSet rs = ps.executeQuery();

			bean = new ProductBean();

			if (rs.next()) {

				int id = rs.getInt("id");
				bean.setId(id);

				String name = rs.getString("name");
				bean.setName(name);

				int stock = rs.getInt("stock");
				bean.setStock(stock);

				int price = rs.getInt("price");
				bean.setPrice(price);

				String category = rs.getString("category");
				bean.setCategory(category);
                
				 //이걸 안하고 바로 getString()으로 받아 출력해보면 '초'까지 출력되어 원하는 결과가 아니라 이걸 거치는 것임
				Date inputdate = rs.getDate("inputdate"); // Date 타입이 java.sql.Date 라는점에 주의
				String sinputdate = String.valueOf(inputdate);
				bean.setInputdate(sinputdate);
			}

		} catch (SQLException e) {
			e.printStackTrace();
		} finally { // try문 마치기전 반드시 해야할게 있다면 finally 에서 작성
			try {
				// 5. 연결 종료
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

		return bean;
	}// getProductById()

	public ArrayList<ProductBean> getProductByCategory(String cate) {
		// 2. 계정에 접속
		connect();
		System.out.println("conn:" + conn);

		ArrayList<ProductBean> lists = new ArrayList<ProductBean>();

		try {
			// 3. SQL문 작성, 분석
			String sql = "select * from products where category = ?";
			PreparedStatement ps = conn.prepareStatement(sql);

			ps.setString(1, cate);

			// 4. SQL문 실행
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				ProductBean bean = new ProductBean();

				int id = rs.getInt("id");
				bean.setId(id);

				String name = rs.getString("name");
				bean.setName(name);

				int stock = rs.getInt("stock");
				bean.setStock(stock);

				int price = rs.getInt("price");
				bean.setPrice(price);

				String category = rs.getString("category");
				bean.setCategory(category);
				
                //이걸 안하고 바로 getString()으로 받아 출력해보면 '초'까지 출력되어 원하는 결과가 아니라 이걸 거치는 것임 
				Date inputdate = rs.getDate("inputdate"); // Date 타입이 java.sql.Date 라는점에 주의
				String sinputdate = String.valueOf(inputdate);
				bean.setInputdate(sinputdate);

				lists.add(bean);
			}

		} catch (SQLException e) {
			e.printStackTrace();
		} finally { // try문 마치기전 반드시 해야할게 있다면 finally 에서 작성
			try {
				// 5. 연결 종료
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

		return lists;
	}// getProductByCategory()

	public int insertProduct(ProductBean bean) {
		// 2. 계정에 접속
		connect();
		System.out.println("conn:" + conn);

		int result = -1;

		try {
			// 3. SQL문 작성, 분석
			String sql = "insert into products values(prdseq.nextval, ?, ?, ?, ?, ?)";
			PreparedStatement ps = conn.prepareStatement(sql);

			ps.setString(1, bean.getName());
			ps.setInt(2, bean.getStock());
			ps.setInt(3, bean.getPrice());
			ps.setString(4, bean.getCategory());
			ps.setString(5, bean.getInputdate());

			// 4. SQL문 실행
			result = ps.executeUpdate();

		} catch (SQLException e) {
			e.printStackTrace();
		} finally { // try문 마치기전 반드시 해야할게 있다면 finally 에서 작성
			try {
				// 5. 연결 종료
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return result;
	}// insertProduct()

	public int deleteProduct(int id) {
		// 2. 계정에 접속
		connect();
		System.out.println("conn:" + conn);

		int result = -1;

		try {
			// 3. SQL문 작성, 분석
			String sql = "delete from products where id = ?";
			PreparedStatement ps = conn.prepareStatement(sql);

			ps.setInt(1, id);

			// 4. SQL문 실행
			result = ps.executeUpdate();

		} catch (SQLException e) {
			e.printStackTrace();
		} finally { // try문 마치기전 반드시 해야할게 있다면 finally 에서 작성
			try {
				// 5. 연결 종료
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return result;
	}// deleteProduct()

	public int updateProduct(ProductBean bean) {
		// 2. 계정에 접속
		connect();
		System.out.println("conn:" + conn);

		int result = -1;

		try {
			System.out.println(bean);

			// 3. SQL문 작성, 분석
			String sql = "update products set name = ?, stock = ?, price = ?, category = ?, inputdate = ? where id = ?";
			PreparedStatement ps = conn.prepareStatement(sql);

			ps.setString(1, bean.getName());
			ps.setInt(2, bean.getStock());
			ps.setInt(3, bean.getPrice());
			ps.setString(4, bean.getCategory());
			ps.setString(5, bean.getInputdate());
			ps.setInt(6, bean.getId());

			// 4. SQL문 실행
			result = ps.executeUpdate();

		} catch (SQLException e) {
			e.printStackTrace();
		} finally { // try문 마치기전 반드시 해야할게 있다면 finally 에서 작성
			try {
				// 5. 연결 종료
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return result;
	}// updateProduct()
}

ProductBean.java


public class ProductBean {
	private int id;
	private String name;
	private int stock;
	private int price;
	private String category;
	private String inputdate;
	
	
	public ProductBean() {
		
	}

	public int getId() {
		return id;
	}
	
	public void setId(int id) {
		this.id = id;
	}
	
	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	public int getStock() {
		return stock;
	}
	
	public void setStock(int stock) {
		this.stock = stock;
	}
	
	public int getPrice() {
		return price;
	}
	
	public void setPrice(int price) {
		this.price = price;
	}
	
	public String getCategory() {
		return category;
	}
	
	public void setCategory(String category) {
		this.category = category;
	}
	
	public String getInputdate() {
		return inputdate;
	}
	
	public void setInputdate(String inputdate) {
		this.inputdate = inputdate;
	}

	public String toString() {
		return id + "," + name + "," + stock + "," + price + "," + category + "," + inputdate;
	}
}

실행결과


===메뉴 선택===
1.모든 상품 조회
2.특정 상품 조회(아이디 이용)
3.특정 상품 조회(카테고리 이용)
4.상품 수정
5.상품 삭제
6.상품 추가
7.프로그램 종료
번호 입력>>1
conn:oracle.jdbc.driver.T4CConnection@6e171cd7
1,mp3,20,300,IT,2022-06-22
2,갤럭시S6,30,200,IT,2022-06-22
3,iPhone,40,500,IT,2022-06-22
4,세탁기,20,300,KJ,2022-06-22
5,냉장고,30,200,KJ,2022-06-22
6,TV,40,500,KJ,2022-06-22
7,Computer,20,300,IT,2022-06-22
8,iMac,30,200,IT,2022-06-22
12,S10,30,3000,IT,2020-06-25

===메뉴 선택===
1.모든 상품 조회
2.특정 상품 조회(아이디 이용)
3.특정 상품 조회(카테고리 이용)
4.상품 수정
5.상품 삭제
6.상품 추가
7.프로그램 종료
번호 입력>>2
검색할 아이디 입력 : 1
conn:oracle.jdbc.driver.T4CConnection@6cce16f4
1,mp3,20,300,IT,2022-06-22

===메뉴 선택===
1.모든 상품 조회
2.특정 상품 조회(아이디 이용)
3.특정 상품 조회(카테고리 이용)
4.상품 수정
5.상품 삭제
6.상품 추가
7.프로그램 종료
번호 입력>>3
검색할 카테고리 입력(IT/KJ) : IT
conn:oracle.jdbc.driver.T4CConnection@291a7e3c
1,mp3,20,300,IT,2022-06-22
2,갤럭시S6,30,200,IT,2022-06-22
3,iPhone,40,500,IT,2022-06-22
7,Computer,20,300,IT,2022-06-22
8,iMac,30,200,IT,2022-06-22
12,S10,30,3000,IT,2020-06-25

===메뉴 선택===
1.모든 상품 조회
2.특정 상품 조회(아이디 이용)
3.특정 상품 조회(카테고리 이용)
4.상품 수정
5.상품 삭제
6.상품 추가
7.프로그램 종료
번호 입력>>4
수정할 id 입력: 12
상품명 입력:S21
재고수량 입력:50
가격 입력:2000
카테고리 입력:IT
입고일자 입력:2023-09-09
conn:oracle.jdbc.driver.T4CConnection@1046d517
12,S21,50,2000,IT,2023-09-09
update 성공

===메뉴 선택===
1.모든 상품 조회
2.특정 상품 조회(아이디 이용)
3.특정 상품 조회(카테고리 이용)
4.상품 수정
5.상품 삭제
6.상품 추가
7.프로그램 종료
번호 입력>>1
conn:oracle.jdbc.driver.T4CConnection@73cd37c0
1,mp3,20,300,IT,2022-06-22
2,갤럭시S6,30,200,IT,2022-06-22
3,iPhone,40,500,IT,2022-06-22
4,세탁기,20,300,KJ,2022-06-22
5,냉장고,30,200,KJ,2022-06-22
6,TV,40,500,KJ,2022-06-22
7,Computer,20,300,IT,2022-06-22
8,iMac,30,200,IT,2022-06-22
12,S21,50,2000,IT,2023-09-09

===메뉴 선택===
1.모든 상품 조회
2.특정 상품 조회(아이디 이용)
3.특정 상품 조회(카테고리 이용)
4.상품 수정
5.상품 삭제
6.상품 추가
7.프로그램 종료
번호 입력>>5
삭제할 id 입력: 12
conn:oracle.jdbc.driver.T4CConnection@2bb3058
삭제 성공

===메뉴 선택===
1.모든 상품 조회
2.특정 상품 조회(아이디 이용)
3.특정 상품 조회(카테고리 이용)
4.상품 수정
5.상품 삭제
6.상품 추가
7.프로그램 종료
번호 입력>>6
id는 시퀀스로 입력됩니다.
상품명 입력:S222
재고수량 입력:50
가격 입력:6000
카테고리 입력:IT
입고일자 입력:2025-05-02
conn:oracle.jdbc.driver.T4CConnection@14fc1f0
insert 성공

===메뉴 선택===
1.모든 상품 조회
2.특정 상품 조회(아이디 이용)
3.특정 상품 조회(카테고리 이용)
4.상품 수정
5.상품 삭제
6.상품 추가
7.프로그램 종료
번호 입력>>1
conn:oracle.jdbc.driver.T4CConnection@512baff6
1,mp3,20,300,IT,2022-06-22
2,갤럭시S6,30,200,IT,2022-06-22
3,iPhone,40,500,IT,2022-06-22
4,세탁기,20,300,KJ,2022-06-22
5,냉장고,30,200,KJ,2022-06-22
6,TV,40,500,KJ,2022-06-22
7,Computer,20,300,IT,2022-06-22
8,iMac,30,200,IT,2022-06-22
13,S222,50,6000,IT,2025-05-02

===메뉴 선택===
1.모든 상품 조회
2.특정 상품 조회(아이디 이용)
3.특정 상품 조회(카테고리 이용)
4.상품 수정
5.상품 삭제
6.상품 추가
7.프로그램 종료
번호 입력>>
Comments