티스토리 뷰

development/Java

[Java] JDBC #2 DAO

Happyoon ~ 2021. 11. 13. 14:32
728x90
반응형

DAO는 Data Access Object로 데이터베이스의 데이터에 접근하기 위한 객체이다. 

저번 게시물에서 DTO(Data Transfer Object)를 활용해보았는데 이번 게시물에서는 CRUD 작업을 수행하는 DAO 클래스를 활용해볼 예정이다.

 

예제를 통해 빠르게 알아보자.


"DAO 클래스 생성" 

 

다음의 5가지 메소드를 MemberDAO.java 클래스에 만들어보자.

 

1. 회원 정보를 입력, 수정, 삭제하는 non static 메소드 3개

2. 메소드의 인자로 전달되는 회원 번호를 이용해서 회원 한명의 정보를 리턴하는 메소드   
3. 전체 회원의 목록을 리턴하는 메소드


MemberDAO.java

package test.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import test.dto.MemberDto;
import test.util.DBConnect;

/*
 *   회원정보를 입력, 수정, 삭제 하는 non static 메소드를 3 개 만들어 보세요.
 *   
 *   메소드의 인자로 전달되는 회원 번호를 이용해서 회원 한명의 정보를 리턴하는 메소드를 만들어 보세요.
 *   
 *   전체 회원의 목록을 리턴하는 메소드를 만들어 보세요.
 */
public class MemberDao {
   
   //회원 목록을 리턴해주는 메소드 
   public List<MemberDto> getList(){
      //회원 목록을 담을 객체를 미리 생성한다.
      List<MemberDto> list=new ArrayList<>();
      //필요한 객체를 담을 지역 변수 미리 만들기
      Connection conn = null;
      PreparedStatement pstmt = null;
      ResultSet rs = null;
      try {
         //Connection 객체의 참조값 얻어오기 
         conn = new DBConnect().getConn();
         //실행할 sql 문의 뼈대 미리 준비하기
         String sql = "SELECT num, name, addr"
               + " FROM member"
               + " ORDER BY num DESC";
         //PreparedStatement 객체의 참조값 얻어오기
         pstmt = conn.prepareStatement(sql);
         //? 에 필요한값 바인딩하기 

         //select 문 수행하고 결과를 ResultSet 으로 받아오기 
         rs = pstmt.executeQuery();
         while (rs.next()) {
            //cursor 가 위치한 곳의 칼럼 데이터를 빼오기 
            //row 하나당 하나의 MemberDto 객체를 생성해서 회원정보를 담고 
            MemberDto dto=new MemberDto();
            dto.setNum(rs.getInt("num"));
            dto.setName(rs.getString("name"));
            dto.setAddr(rs.getString("addr"));
            //ArrayList 객체에 누적 시킨다.
            list.add(dto);
         }
      } catch (Exception e) {
         e.printStackTrace();
      } finally {
         try {
            if (rs != null)
               rs.close();
            if (pstmt != null)
               pstmt.close();
            if (conn != null)
               conn.close();
         } catch (SQLException e) {
         }
      }
      return list;
   }
   
   public MemberDto getData(int num) {
      //MemberDto 객체의 참조값을 담을 변수 미리 만들기
      MemberDto dto=null;
      
      //필요한 객체를 담을 지역 변수 미리 만들기
      Connection conn = null;
      PreparedStatement pstmt = null;
      ResultSet rs = null;
      try {
         //Connection 객체의 참조값 얻어오기 
         conn = new DBConnect().getConn();
         //실행할 sql 문의 뼈대 미리 준비하기
         String sql = "SELECT name, addr"
               + " FROM member"
               + " WHERE num=?";
         //PreparedStatement 객체의 참조값 얻어오기
         pstmt = conn.prepareStatement(sql);
         //? 에 필요한값 바인딩하기 
         pstmt.setInt(1, num);
         //select 문 수행하고 결과를 ResultSet 으로 받아오기 
         rs = pstmt.executeQuery();
         //만일 select 된 row 가 있다면
         if (rs.next()) {
            //cursor 가 위치한 곳의 칼럼 데이터를 빼오기 
            //String name=rs.getString("name");
            //String addr=rs.getString("addr");
            //MemberDto 객체를 생성해서 회원 정보를 담는다.
            dto=new MemberDto();
            dto.setNum(num);
            dto.setName(rs.getString("name"));
            dto.setAddr(rs.getString("addr"));
         }
      } catch (Exception e) {
         e.printStackTrace();
      } finally {
         try {
            if (rs != null)
               rs.close();
            if (pstmt != null)
               pstmt.close();
            if (conn != null)
               conn.close();
         } catch (SQLException e) {
         }
      }
      
      return dto;
   }
   
   //회원 정보를 삭제하는 메소드
   public boolean delete(int num) {
      //필요한 객체를 담을 지역 변수 미리 만들기
      Connection conn = null;
      PreparedStatement pstmt = null;
      int flag = 0;
      try {
         //Connection 객체의 참조값 얻어오기 
         conn = new DBConnect().getConn();
         //실행할 sql 문의 뼈대 미리 준비하기
         String sql = "DELETE FROM member"
               + " WHERE num=?";
         //PreparedStatement 객체의 참조값 얻어오기
         pstmt = conn.prepareStatement(sql);
         //? 에 필요한값 바인딩하기 
         pstmt.setInt(1, num);
         //sql 문 실행하기 (INSERT, UPDATE, DELETE)
         flag = pstmt.executeUpdate();
      } catch (Exception e) {
         e.printStackTrace();
      } finally {
         try {
            if (pstmt != null)
               pstmt.close();
            if (conn != null)
               conn.close();
         } catch (SQLException e) {
         }
      }
      if (flag > 0) {
         //성공
         return true;
      } else {
         //실패
         return false;
      }

   }
   
   //회원정보를 수정하는 메소드
   public boolean update(MemberDto dto) {
      //필요한 객체를 담을 지역 변수 미리 만들기
      Connection conn = null;
      PreparedStatement pstmt = null;
      int flag = 0;
      try {
         //Connection 객체의 참조값 얻어오기 
         conn = new DBConnect().getConn();
         //실행할 sql 문의 뼈대 미리 준비하기
         String sql = "UPDATE member"
               + " SET name=?, addr=?"
               + " WHERE num=?";
         //PreparedStatement 객체의 참조값 얻어오기
         pstmt = conn.prepareStatement(sql);
         //? 에 필요한값 바인딩하기 
         pstmt.setString(1, dto.getName());
         pstmt.setString(2, dto.getAddr());
         pstmt.setInt(3, dto.getNum());
         //sql 문 실행하기 (INSERT, UPDATE, DELETE)
         flag = pstmt.executeUpdate();
      } catch (Exception e) {
         e.printStackTrace();
      } finally {
         try {
            if (pstmt != null)
               pstmt.close();
            if (conn != null)
               conn.close();
         } catch (SQLException e) {
         }
      }
      if (flag > 0) {
         //성공
         return true;
      } else {
         //실패
         return false;
      }

   }
   
   //회원 정보를 추가(입력) 하는 메소드 
   public boolean insert(MemberDto dto) {
      //필요한 객체를 담을 지역 변수 미리 만들기
      Connection conn = null;
      PreparedStatement pstmt = null;
      int flag = 0;
      try {
         //Connection 객체의 참조값 얻어오기 
         conn = new DBConnect().getConn();
         //실행할 sql 문의 뼈대 미리 준비하기
         String sql = "INSERT INTO member"
               + " (num,name,addr)"
               + " VALUES(member_seq.NEXTVAL, ?, ?)";
         //PreparedStatement 객체의 참조값 얻어오기
         pstmt = conn.prepareStatement(sql);
         //? 에 필요한값 바인딩하기 
         pstmt.setString(1, dto.getName());
         pstmt.setString(2, dto.getAddr());
         //sql 문 실행하기 (INSERT, UPDATE, DELETE)
         flag = pstmt.executeUpdate();
      } catch (Exception e) {
         e.printStackTrace();
      } finally {
         try {
            if (pstmt != null)
               pstmt.close();
            if (conn != null)
               conn.close();
         } catch (SQLException e) {
         }
      }
      if (flag > 0) {
         //성공
         return true;
      } else {
         //실패
         return false;
      }

   }
}

MainCalss11수정 버전에서 메소드를 non static으로 수정해주면 된다.


"DAO 활용하기" 

 

예제1

 

MemberDao 클래스를 활용하여 새로운 회원 정보를 추가해보자.

 


MainClass13.java

package test.main;

import test.dao.MemberDao;
import test.dto.MemberDto;

public class MainClass13 {
   public static void main(String[] args) {
      //추가할 회원의 정보라고 가정하자
      String name="아이폰";
      String addr="Apple";
      //추가할 회원의 정보를 MemberDto 객체에 담아서 
      MemberDto dto=new MemberDto();
      dto.setName(name);
      dto.setAddr(addr);
      //MemberDao 객체를 이용해서 DB 에 저장하기 
      boolean isSuccess=new MemberDao().insert(dto);
      if(isSuccess) {
         System.out.println("회원 정보 추가 성공!");
      }
   }
}

예제 2

Scanner 객체를 이용하여 추가할 회원의 이름과 주소를 입력 받아 DB에 저장하는 기능을 구현해보자.

 


MainClass14.java

package test.main;

import java.util.Scanner;

import test.dao.MemberDao;
import test.dto.MemberDto;

public class MainClass14 {
	public static void main(String[] args) {
		/*
		 * Scanner 객체를 이용해서 
		 * 추가할 회원의 이름과 주소를 입력 받아 
		 * DB에 저장하는 기능을 구현해보세요.
		 */
		Scanner scan = new Scanner(System.in);
		System.out.print("이름:");
		String name = scan.nextLine();
		System.out.print("주소:");
		String addr = scan.nextLine();
		MemberDto dto = new MemberDto();
		dto.setName(name);
		dto.setAddr(addr);
		MemberDao dao = new MemberDao();
		boolean isSuccess = dao.insert(dto);
		if(isSuccess) {
			System.out.println("Success");
			
		}
		else {
			System.out.println("Fail");
		}
	}
}

예제 3

MemberDao 객체를 이용하여 회원 목록을 얻어와 아래와 같이 출력해보자.

 

1 | 심청이 | 강남구
2 | 홍길동 | 광진구


 

MainClass15.java

package test.main;

import java.util.ArrayList;
import java.util.List;

import test.dao.MemberDao;
import test.dto.MemberDto;

public class MainClass15 {
	public static void main(String[] args) {
	
		MemberDao dao = new MemberDao();
		List<MemberDto> list = dao.getList();
		for(MemberDto tmp:list) {
			System.out.println(tmp.getNum()+" | "+tmp.getName()+" | "+tmp.getAddr());
		}
	}

}

예제 4

 

Scanner 객체를 이용하여 검색할 회원 정보를 입력 받아 입력받은 번호에 해당되는 회원 번호를 얻어와

아래와 같은 형식으로 출력해보자.

 

 

만일 1을 입력한 경우
   
 1 | 김구라 | 노량진
   
 만일 입력한 숫자가 9이고 9번 회원이 없는 경우  
 

9번 회원은 존재하지 않습니다.

 


MainClass16.java

package test.main;

import java.util.Scanner;

import test.dao.MemberDao;
import test.dto.MemberDto;

public class MainClass16 {
	public static void main(String[] args) {
		
		Scanner scan = new Scanner(System.in);
		System.out.print("검색할 회원 번호 입력:");
		//String line = scan.nextLine();
		//int num = Integer.parseInt(line);
		int num = scan.nextInt();
		MemberDao dao = new MemberDao();
		MemberDto dto = dao.getData(num);
		if(dto!=null) {
			System.out.println(dto.getNum()+" | "+dto.getName()+" | "+dto.getAddr());
		}
		else {
			System.out.println(num+"번 회원은 존재하지 않습니다.");
		}
	}

}

 


예제 5

 

company 테이블을 만들어보자.

CREATE TABLE company(empno NUMBEER PRIMARY KEY,
ename NUMBER PRIMARY KEY, job VARCHAR2(16) NOT NULL,
hiredate DATE);

CREATE SEQUENCE company seq;

insert into company(empno, ename, job, hiredate) values(company_seq.NEXTVAL, 'Tom', 'developer', SYSDATE);


 

CompanyDao 클래스 만들기

 

CompanyDao.java

package test.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import test.dto.CompanyDto;
import test.util.DBConnect;

public class CompanyDao {
	public boolean insert(CompanyDto dto) {
		//필요한 객체를 담을 지역 변수 미리 만들기
		Connection conn = null;
		PreparedStatement pstmt = null;
		int flag = 0;
		try {
			//Connection 객체의 참조값 얻어오기 
			conn = new DBConnect().getConn();
			//실행할 sql 문의 뼈대 미리 준비하기
			String sql = "insert into company(empno,ename,job,hiredate) values(company_seq.NEXTVAL,?,?,?)";
			//PreparedStatement 객체의 참조값 얻어오기
			pstmt = conn.prepareStatement(sql);
			//? 에 필요한값 바인딩하기
			pstmt.setString(1, dto.getEname());
			pstmt.setString(2, dto.getJob());
			pstmt.setString(3, dto.getHiredate());
			
			//sql 문 실행하기 (INSERT, UPDATE, DELETE)
			flag = pstmt.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (pstmt != null)
					pstmt.close();
				if (conn != null)
					conn.close();
			} catch (SQLException e) {
			}
		}
		if (flag > 0) {
			//성공
			return true;
		} else {
			//실패
			return false;
		}
	}
	public boolean delete(int empno) {
		//필요한 객체를 담을 지역 변수 미리 만들기
		Connection conn = null;
		PreparedStatement pstmt = null;
		int flag = 0;
		try {
			//Connection 객체의 참조값 얻어오기 
			conn = new DBConnect().getConn();
			//실행할 sql 문의 뼈대 미리 준비하기
			String sql = "delete from company where empno =?";
			//PreparedStatement 객체의 참조값 얻어오기
			pstmt = conn.prepareStatement(sql);
			//? 에 필요한값 바인딩하기 
			pstmt.setInt(1, empno);
			//sql 문 실행하기 (INSERT, UPDATE, DELETE)
			flag = pstmt.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (pstmt != null)
					pstmt.close();
				if (conn != null)
					conn.close();
			} catch (SQLException e) {
			}
		}
		if (flag > 0) {
			//성공
			return true;
		} else {
			//실패
			return false;
		}
	}
	public boolean update(CompanyDto dto) {
		//필요한 객체를 담을 지역 변수 미리 만들기
		Connection conn = null;
		PreparedStatement pstmt = null;
		int flag = 0;
		try {
			//Connection 객체의 참조값 얻어오기 
			conn = new DBConnect().getConn();
			//실행할 sql 문의 뼈대 미리 준비하기
			String sql = "update company set ename = ?, job = ?, hiredate =? where empno = ?";
			//PreparedStatement 객체의 참조값 얻어오기
			pstmt = conn.prepareStatement(sql);
			//? 에 필요한값 바인딩하기 
			pstmt.setString(1, dto.getEname());
			pstmt.setString(2, dto.getJob());
			pstmt.setString(3, dto.getHiredate());
			pstmt.setInt(4, dto.getEmpno());
			//sql 문 실행하기 (INSERT, UPDATE, DELETE)
			flag = pstmt.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (pstmt != null)
					pstmt.close();
				if (conn != null)
					conn.close();
			} catch (SQLException e) {
			}
		}
		if (flag > 0) {
			//성공
			return true;
		} else {
			//실패
			return false;
		}
		
	}
	public List<CompanyDto> getList(){
		//필요한 객체를 담을 지역 변수 미리 만들기
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		List<CompanyDto> list=new ArrayList<>();
		try {
			//Connection 객체의 참조값 얻어오기 
			conn = new DBConnect().getConn();
			//실행할 sql 문의 뼈대 미리 준비하기
			String sql = "select * from company";
			//PreparedStatement 객체의 참조값 얻어오기
			pstmt = conn.prepareStatement(sql);
			//? 에 필요한값 바인딩하기 

			//select 문 수행하고 결과를 ResultSet 으로 받아오기 
			rs = pstmt.executeQuery();
			while (rs.next()) {
				//cursor 가 위치한 곳의 칼럼 데이터를 빼오기 
				
				CompanyDto dto = new CompanyDto();
				
				dto.setEname(rs.getString("ename"));
				dto.setHiredate(rs.getString("hiredate"));
				dto.setJob(rs.getString("job"));
				dto.setEmpno(rs.getInt("empno"));
				list.add(dto);
				
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (rs != null)
					rs.close();
				if (pstmt != null)
					pstmt.close();
				if (conn != null)
					conn.close();
			} catch (SQLException e) {
			}
		}
		return list;
	}
	public CompanyDto getData(int empno) {
		//필요한 객체를 담을 지역 변수 미리 만들기
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		CompanyDto dto = null;
		try {
			//Connection 객체의 참조값 얻어오기 
			conn = new DBConnect().getConn();
			//실행할 sql 문의 뼈대 미리 준비하기
			String sql = "select * from company where empno =?";
			//PreparedStatement 객체의 참조값 얻어오기
			pstmt = conn.prepareStatement(sql);
			//? 에 필요한값 바인딩하기 
			pstmt.setInt(1, empno);
			//select 문 수행하고 결과를 ResultSet 으로 받아오기 
			rs = pstmt.executeQuery();
			while (rs.next()) {
				//cursor 가 위치한 곳의 칼럼 데이터를 빼오기 
				dto = new CompanyDto();
				dto.setEname(rs.getString("ename"));
				dto.setHiredate(rs.getString("hiredate"));
				dto.setJob(rs.getString("job"));
				dto.setEmpno(empno);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (rs != null)
					rs.close();
				if (pstmt != null)
					pstmt.close();
				if (conn != null)
					conn.close();
			} catch (SQLException e) {
			}
		}
		return dto;
		
	}

}

 

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함