JDBC DAO, DTO, ArrayList

brave_chicken·2024년 4월 16일

잇(IT)생 챌린지

목록 보기
29/90
public class DAOTest {
	public static void main(String[] args) {
		Scanner key = new Scanner(System.in);
		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 choice  = key.nextInt();
		show(choice);
	}
	public static void show(int choice){
		MenuUI ui = new MenuUI();
		switch(choice){
			case 1:
				ui.insertMenu();
				break;
			case 2:
				ui.selectMenu();
				break;
			case 3:
				ui.updateMenu();
				break;
			case 4:
				ui.deleteMenu();
				break;
			case 5:
				ui.findByAddrMenu();
				break;
			case 6:
				ui.loginMenu();
				break;
			case 7:
				ui.myPageMenu();
				break;
		}
	}
}
public class DBUtil {
	//드라이버 로딩
	//=>클래스가 로딩될 때 한 번 실행된다.
	static {
		System.out.println("스태틱블럭");
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	//DB서버 접속하기
	public static Connection getConnect() {
		Connection con = null;
		String url="jdbc:oracle:thin:@192.168.0.4:1521:xe";
		String user="scott";
		String password="tiger";
		try {
			con = DriverManager.getConnection(url, user, password);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return con;
	}
	//자원반납
	public static void close(ResultSet rs, Statement stmt, Connection con) {
		try {
			if(rs!=null) rs.close();
			if(stmt!=null) stmt.close();
			if(con!=null) con.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
}

여기까지는 이전과 동일

MemberDTO

  • 어레이리스트할때 했었음.
  • 멤버 테이블의 레코드를 객체로 정의
public class MemberDTO {
	private String id;
	private String pass;
	private String name;
	private String addr;
	private Date regDate;
	private int point;
	private String info;
	MemberDTO(){
		//아무일 하지 않는 기본생성자 꼭 만들기
	}
	
	//select용
	public MemberDTO(String id, String pass, String name, String addr, Date regDate, int point, String info) {
		this(id,pass,name,addr,info);//순서 잘 지켜야함
		this.regDate = regDate;
		this.point = point;
	}
	//insert용
	public MemberDTO(String id, String pass, String name, String addr, String info) {
		super();
		this.id = id;
		this.pass = pass;
		this.name = name;
		this.addr = addr;
		this.info = info;
	}
	//update용
	public MemberDTO(String id, String addr, String info) {
		super();
		this.id = id;
		this.addr = addr;
		this.info = info;
	}

	@Override
	public String toString() {
		return "MemberDTO [id=" + id + ", pass=" + pass + ", name=" + name + ", addr=" + addr + ", regDate=" + regDate
				+ ", point=" + point + ", info=" + info + "]";
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getPass() {
		return pass;
	}

	public void setPass(String pass) {
		this.pass = pass;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getAddr() {
		return addr;
	}

	public void setAddr(String addr) {
		this.addr = addr;
	}

	public Date getRegDate() {
		return regDate;
	}

	public void setRegDate(Date regDate) {
		this.regDate = regDate;
	}

	public int getPoint() {
		return point;
	}

	public void setPoint(int point) {
		this.point = point;
	}

	public String getInfo() {
		return info;
	}

	public void setInfo(String info) {
		this.info = info;
	}
}

MemberDAO

public interface MemberDAO {
	void insert(String id, String pass, String name, String addr, String info);//안쓸거지만 남겨둠
	int insert(MemberDTO user);
	
	void update(String info, String addr, String id);//오버로딩? 이라 냅둬도되긴함. 히스토리남기기
	void update(MemberDTO updateUser);
	
	void delete(String did);
	
	List<MemberDTO> select();
	List<MemberDTO> search(String col,String name);
	MemberDTO login(String id,String pass);
	MemberDTO mypage(String id);
}
public class MenuUI {
	Scanner key = new Scanner(System.in);
	MemberDAO dao = new MemberDAOImpl();
	public void insertMenu(){
		System.out.println("*******사원등록********");
		System.out.print("아이디:");
		String id = key.next();
		System.out.print("패스워드:");
		String pass = key.next();
		System.out.print("성명:");
		String name = key.next();
		System.out.print("주소:");
		String addr = key.next();
		System.out.print("기타:");
		String info = key.next();
		//여기에서 MemberDAO의 메소드를 호출하세요
		MemberDTO user = new MemberDTO(id, pass, name, addr, info);//spring으로 넘어가면 자동으로 만들어줌
		int result = dao.insert(user);
		if(result>=1) {
			System.out.println("로그인해서 메인페이지 이동");
		}else {
			System.out.println("실패를 알려줄 수 있는 alert실행");
			System.out.println("다시 회원가입할 수 있는 페이지로 이동");
		}
		//dao.insert(id, pass, name, addr, info);
	}
	public void updateMenu(){
		System.out.println("*******사원수정********");
		System.out.print("정보:");
		String info = key.next();
		System.out.print("주소:");
		String addr = key.next();
		System.out.print("주소:");
		String id = key.next();
		//여기에서 MemberDAO의 메소드를 호출하세요
//		dao.update(info, addr, id);
		MemberDTO updateUser = new MemberDTO(id, addr, info);
		dao.update(updateUser);
	}
	public void deleteMenu(){
		System.out.println("*******사원삭제********");
		System.out.print("삭제할id:");
		String id = key.next();
		//여기에서 MemberDAO의 메소드를 호출하세요
		dao.delete(id);
	}
	public void findByAddrMenu(){
		System.out.println("*******사원검색********");
		System.out.print("주소:");
		String addr = key.next();
		//여기에서 MemberDAO의 메소드를 호출하세요
		dao.search("addr", addr);
		List<MemberDTO> searchlist = dao.search("addr",addr);
		for(MemberDTO user:searchlist) {
			print(user);
		}
	}
	public void loginMenu() {
		System.out.println("*******로그인********");
		System.out.print("아이디:");
		String id = key.next();
		System.out.print("패스워드:");
		String pass = key.next();
		MemberDTO loginUser = dao.login(id, pass);
		//로그인 성공하면 로그인성공!!메시지와 로그인한 사용자의 정보를 출력(print호출)
		//로그인 실패하면 로그인실패!!메시지를 출력
		if(loginUser!=null) {
			System.out.println("로그인성공");
			print(loginUser);
		}else {
			System.out.println("로그인실패");
		}
	}
	public void myPageMenu() {
		System.out.println("*******마이페이지********");
		System.out.print("아이디:");
		String id = key.next();
		//myPageMenu메소드에서 입력받은 아이디로 아이디에 따른 정보를 조회할 수 있도록 코드를 완성하세요
		//-MemberDAO, MemberDAOImpl에 메소드를 정의하고 작업하세요(리턴타입,메소드명,매개변수는 각자 알아서 작업하기)
		MemberDTO user = dao.mypage(id);
		if(user!=null) {
			System.out.println("로그인성공");
			print(user);
		}else {
			System.out.println("일치하는 사용자가 없습니다");
		}
	}
	public void selectMenu(){
		System.out.println("*******사원조회********");
		//여기에서MemberDAO의 메소드를 호출하세요 - 전체사원조회
		List<MemberDTO> userlist = dao.select();
		System.out.println("조회된 레코드갯수 :"+userlist.size());
		//ArrayList에 저장된 DTO를 다양하게 출력할 수 있도록 코드를 작성
		for(MemberDTO user:userlist) {
			print(user);
		}
	}
	public void print(MemberDTO user) {
		System.out.print(user.getId()+"\t");
		System.out.print(user.getPass()+"\t");
		System.out.print(user.getName()+"\t");
		System.out.print(user.getAddr()+"\t");
		System.out.print(user.getRegDate()+"\t");
		System.out.print(user.getPoint()+"\t");
		System.out.println(user.getInfo()+"\t");
	}
}

MemberDAOImpl

//insert,delete,update,select,login,search

public class MemberDAOImpl implements MemberDAO {
	
	@Override
	public int insert(MemberDTO user) {
		System.out.println(user);//user.toString()가 생략
		
		//System.out.println(id+","+pass+","+name+","+addr+","+info);//오류가 발생하는경우 잘입력되는지 검증하기 위해 이렇게 찍어보기
		String sql="insert into member values(?,?,?,?,sysdate,10000,?)";
		Connection con = null;
		PreparedStatement ptmt = null;
		int result=0;
		try {
			con = DBUtil.getConnect();
			ptmt = con.prepareStatement(sql);
			
			ptmt.setString(1, user.getId());
			ptmt.setString(2, user.getPass());
			ptmt.setString(3, user.getName());
			ptmt.setString(4, user.getAddr());
			ptmt.setString(5, user.getInfo());
			
			result = ptmt.executeUpdate();
			System.out.println(result+"개 행 삽입성공!!");
		} catch(SQLException e) {
			e.printStackTrace();
		} finally {
			DBUtil.close(null, ptmt, con);
		}
		return result;
	}
	
	public void insert(String id, String pass, String name, String addr, String info) {
		
	}

	@Override
	public void update(MemberDTO updateUser) {
		String sql = "update member set addr=?, info=? where id=?";
		Connection con = null;
		PreparedStatement ptmt = null;
		try {
			con = DBUtil.getConnect();
			ptmt = con.prepareStatement(sql);
			ptmt.setString(1, updateUser.getAddr());
			ptmt.setString(2, updateUser.getInfo());
			ptmt.setString(3, updateUser.getId());
			ptmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			DBUtil.close(null, ptmt, con);
		}
	}
	public void update(String info, String addr, String id) {
		
	}
	public void delete(String did) {
		StringBuffer sql = new StringBuffer(); 
		sql.append("delete member ");
		sql.append("where id=?");
		Connection con = null;
		PreparedStatement ptmt = null;
		try {
			con = DBUtil.getConnect();
			
			ptmt = con.prepareStatement(sql.toString());
			ptmt.setString(1, did);
			ptmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			DBUtil.close(null, ptmt, con);
		}
		
	}
	
	//조회한 테이블을 변환해서 호출한 곳으로 넘겨줄 수 있도록 작업
	//테이블에 레코드가 여러개 있으므로 각 레코드를 DTO로 변환하고 이 DTO들을 ArrayList와 같은 자료구조에 담아서 넘겨줄 수 있도록(리턴) 처리
	//웹에서는 List로 변환해서 넘기는 것이 일반적
	public List<MemberDTO> select() {
		String sql = "select * from member";
		Connection con = null;
		PreparedStatement ptmt = null;
		ResultSet rs = null;
		List<MemberDTO> userlist = new ArrayList<>();//레코드를 담을 자료구조
		MemberDTO user = null;//조회한 레코드를 담을 객체
		try {
			con = DBUtil.getConnect();
			ptmt = con.prepareStatement(sql);
			rs = ptmt.executeQuery();
			System.out.println(rs);
			while(rs.next()) {//while한번실행되는게 레코드하나읽는것
				//레코드의 한 컬럼들을 이용해서 MemberDTO객체를 생성
				user = new MemberDTO(rs.getString("id"), rs.getString("pass"), 
						rs.getString("name"), rs.getString(4), rs.getDate(5), 
						rs.getInt("point"), rs.getString(7));
				userlist.add(user);
			}
//			System.out.println("ArrayList 저장된 레코드 갯수:"+userlist.size());
//			System.out.println(userlist);
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			DBUtil.close(rs, ptmt, con);
		}
		return userlist;
	}
	//프라이머리키로 where절에서 조건을 and로 적용하고 있으므로 결과는 무조건 1개
	//결과가 1개면 XXXDTO로 변환한다.
	public MemberDTO login(String id,String pass) {
		String sql = "select * from member where id =? and pass=?";
		Connection con = null;
		PreparedStatement ptmt = null;
		ResultSet rs = null;
		MemberDTO loginUser = null;
		try {
			con = DBUtil.getConnect();
			ptmt = con.prepareStatement(sql);
			ptmt.setString(1, id);
			ptmt.setString(2, pass);
			rs = ptmt.executeQuery();
			
			if(rs.next()) {
				loginUser= new MemberDTO(rs.getString("id"), rs.getString("pass"), 
						rs.getString("name"), rs.getString(4), rs.getDate(5), 
						rs.getInt("point"), rs.getString(7));
				System.out.print(rs.getString("name")+"님 로그인 성공");
			}else {
				System.out.print("님 로그인 실패");
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			DBUtil.close(rs, ptmt, con);
		}
		return loginUser;
	}
	
	//검색결과가 0,1 또는 많이
	//위와같은 결과가 리턴되는 경우 ArrayList<XXXDTO>의 형태로 조회된 결과를 변환한다.
	public List<MemberDTO> search(String col,String name) {
		String sql="";
		if(col.equals("addr")) {
			sql = "select * from member where addr like ?";
		}else if(col.equals("ename")) {
			sql = "select * from emp where ename like ?";
		}
		
		Connection con = null;
		PreparedStatement ptmt = null;
		ResultSet rs = null;
		List<MemberDTO> searchlist = new ArrayList<>();
		MemberDTO user = null;
		try {
			con = DBUtil.getConnect();
			ptmt = con.prepareStatement(sql);
			ptmt.setString(1, "%"+name+"%");
			rs = ptmt.executeQuery();
			while(rs.next()){
				user = new MemberDTO(rs.getString("id"), rs.getString("pass"), 
						rs.getString("name"), rs.getString(4), rs.getDate(5), 
						rs.getInt("point"), rs.getString(7));
				searchlist.add(user);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			DBUtil.close(rs, ptmt, con);
		}
		return searchlist;
	}
	public MemberDTO mypage(String id){
		Connection con = null;
		PreparedStatement ptmt = null;
		ResultSet rs = null;
		String sql = "select * from member where id = ?";
		MemberDTO loginUser = null;
		try {
			con = DBUtil.getConnect();
			ptmt = con.prepareStatement(sql);
			ptmt.setString(1, id);
			rs = ptmt.executeQuery();
			if(rs.next()) {
				loginUser= new MemberDTO(rs.getString("id"), rs.getString("pass"), 
						rs.getString("name"), rs.getString(4), rs.getDate(5), 
						rs.getInt("point"), rs.getString(7));
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			DBUtil.close(rs, ptmt, con);
		}
		return loginUser;
	}
}

본 포스팅은 멀티캠퍼스의 멀티잇 백엔드 개발(Java)의 교육을 수강하고 작성되었습니다.

0개의 댓글