기록
  • 1030 jdbc -day1
    2023년 10월 30일 13시 57분 48초에 업로드 된 글입니다.
    작성자: 삶은고구마

     

     

    1.기존 이클립스에서 세팅하기

    더보기

     

    1
    2

     

    3
    4

     

     

    2.새 프로젝트 하위에 새폴더와 새 파일 생성

    새폴더:sql / 새파일:student.sql

     

    3.student.sql 파일을 sql deveplover 편집창에 드래그해서 아래의 코드를 작성한다.

    1)system 계정으로 student계정 생성

    2)student 계정으로(컬러:보라색) 접속

    3)member table 생성 및 데이터 추가(디코) 

      

    더보기
    --(System계정) student 계정 생성
    --student/student
    
    alter session set "_oracle_script" = true;
    create user student
    identified by student
    default tablespace users;
    
    grant connect,resource to student;
    alter user student quota unlimited on users;
    
    -- member 테이블 생성
    create table member(
        id varchar2(20),
        name varchar2(100) not null,
        gender char(1),
        birthday date,
        email varchar2(500) not null,
        point number default 1000,
        create_at timestamp default systimestamp,
        constraints pk_member_id primary key(id),
        constraints uq_member_email unique(email),
        constraints ck_member_gender check(gender in('M','F'))
    );
    
    insert into
        member
    values(
        'honggd', '홍길동', 'M', '1999-09-09', 'honggd@naver.com', default, default
    );
    insert into
        member
    values(
        'gogd', '고길동', 'M', '1980-02-15', 'gogd@naver.com', default, default
    );
    insert into
        member
    values(
        'sinsa', '신사임당', 'F', '1995-05-05', 'sinsa@naver.com', default, default
    );
    insert into
        member
    values(
        'leess', '이순신', null, null, 'leess@naver.com', default, default
    );
    insert into
        member
    values(
        'qwerty', '쿼티', 'F', null, 'qwerty@naver.com', default, default
    );
    
    commit;
    
    select *from member;

     

    4.외부라이브러리 추가

    1)ojdbc jar 파일 

    2)해당 프로젝트(01_jdbc)-속성에서 외부 라이브러리로 lib-ojdbc8 추가

    프로젝트 하위에 Referenced Libraries 생성됨.

    3)연결이 잘 되었는지 아래의 코드를 작성하여 테스트 해본다.

    기본포트 1521는 sql developer에서 사용하던 포트 그대로 사용하면 되는데, 

    나같은 경우엔 1522가 기본값이라 따로 테스트 해봐야할 것 같다. 

    더보기
    package test;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    public class JdbcTest {
    
    	String driverClassName = "oracle.jdbc.OracleDriver";
    	String url = "jdbc:oracle:thin:@localhost:1521"; //접속 프로토콜@url:port
    	String user = "student";
    	String password = "student";
    	public static void main(String[] args) 
    	{
    		JdbcTest main = new JdbcTest();
    		main.test1();
    		main.test2();
    		
    	}
    		
    	
    	/**<pre>
    	 * jdbc 절차
    	 * 1.Driver 클래스 등록
    	 * 2.Connection 객체 생성(url, id, password)
    	 * 3.PreparedStatement 객체 생성(쿼리 준비)
    	 * 4.쿼리 실행 - ResultSet 객체 반환
    	 * 5.ResultSet 처리
    	 * 6.반환 (ResultSet - PreparedStatment - Connection 순 반환)
    	 */
    	private void test2() 
    	{
    		Connection conn =null;
    		PreparedStatement pstmt = null;
    		ResultSet rset = null;
    		try 
    		{
    			//1.Driver 클래스 등록
    			Class.forName(driverClassName);
    			System.out.println("1.드라이버 클래스 등록 완료");
    			
    			//2.Connection
    			conn = DriverManager.getConnection(url,user,password);
    			System.out.println("2.Connection 객체 생성 완료");
    			
    			//3.PreparedStatement 객체 생성
    			pstmt = conn.prepareStatement("select * from member");
    			System.out.println("3.PrepareStatement 객체 생성 완료");
    			
    			//4.쿼리 실행 및 ResultSet 반환
    			rset = pstmt.executeQuery();
    			System.out.println("4.query 실행 완료");
    		} 
    		catch (ClassNotFoundException  | SQLException e) 
    		{
    			
    			e.printStackTrace();
    		}
    		
    	}
    
    	/**
    	 * ojdbc8.jar 연결 테스트
    	 */
    	private void test1() 
    	{
    	
    		//클래스 등록
    		try 
    		{
    			Class.forName("oracle.jdbc.OracleDriver");
    			System.out.println("ojbdc 연결 완료~");
    		} 
    		catch (ClassNotFoundException e) 
    		{
    			
    			e.printStackTrace();
    		}
    	}
    
    }

     


    회원관리 예제

    mvc 패턴으로 회원가입 예제를 다뤄보자.

     

    run 실행클래스
    view 유저(사용자)에게 보이는 화면단
    controller 뷰에서 사용자가 선택한 방법을 dao에게 전달
    (view와 dao 사이의 브릿지)
    dao(data access object) db와 직접 접촉(db연결/쿼리 실행등)
    vo(value object) db로 작업된/할 값을 member 객체 or 리스트에 담음
    db student.sql

     

    DQL (SELECT) DML (INSERT,UPDATE,DELETE)
    1.Driver 클래스 등록 1.Driver 클래스 등록
    2.Connection 객체 생성 (url, id, password) 2.Connection 객체 생성 (url, id, password)
    -auto commit false 설정
    3.PreparedStatement 객체 생성 (쿼리 준비)
    미완성 쿼리의 ? 값 대입
    3. PreparedStatement  객체 생성 (쿼리 준비)
    미완성 쿼리의 ? 값 대입
    4.쿼리 실행 ->
    ResultSet 객체 반환
    4.쿼리 실행 ->
    int 값 반환 (값:실행된 행의 갯수)
    5.ResultSet 처리 5.트랜잭션 처리 commit or rollback
    6. 자원 반납
    (ResultSet-> PreparedStatement ->Connection 순)
    6.자원반납 (이하동일)
    rset = pstmt.executeQuery();
    result = pstmt.executeUpdate();

     

    1.Main

    더보기
    package com.sh.run;
    
    import com.sh.member.view.MemberMenu;
    
    /**
     * <pre>
     * MVC패턴
     * 기능을 제공함에 있어 코드가 가진 "성격"별로 클래스를 나누어 처리하는 패턴
     * -Model
     * 		-entity 클래스 : db 테이블과 상응하는 클래스
     * 		-dao 클래스 : Data Access Object db 접근 클래스.(오직 여기에서만 접속)
     * 		-service 클래스 : 업무로직 담당(트랜잭션 처리)
     * 		...
     * 
     * -View 클래스 : 사용자가 보게 될 화면 담당. 메뉴/사용자 입력값 처리 등등..
     * 		
     * -Controller 클래스 : 사용자 요청을 처리하는데 있어 전체 제어의 역할.
     *		-요청을 받아 하위클래스에 분배. 처리 결과를 다시 view단에 전달.
     */
    
    public class Main {
    
    	public static void main(String[] args) 
    	{
    		new MemberMenu().mainMenu();
    		
    		System.out.println("==이용해주셔서 감사합니다.==");
    	}
    
    }

     

    2.Member

    더보기
    package com.sh.member.model.entity;
    
    import java.sql.Date;
    import java.sql.Timestamp;
    
    /**
     * db member 테이블과 1대1 매칭하는 클래스
     *  - table - entity class
     *  - column - field
     *  - row - member객체
     *
     */
    public class Member 
    {
    	//멤버sql의 컬럼값을 필드로..
    	private String id;
    	private String name;
    	private String gender;
    	private Date birthday;
    	private String email;
    	private int point;
    	private Timestamp createdAt;
    	
    	public Member() {}
    	
    	public Member(String id,String name,String gender, Date birthday, 
    				String email,int point,Timestamp createdAt) 
    	{
    		
    		this.id = id;
    		this.name = name;
    		this.gender = gender;
    		this.birthday = birthday;
    		this.email = email;
    		this.point = point;
    		this.createdAt = createdAt;
    		
    	}
    	
    
    
    	public String getId() {
    		return id;
    	}
    
    
    	public void setId(String id) {
    		this.id = id;
    	}
    
    
    	public String getName() {
    		return name;
    	}
    
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    
    	public String getGender() {
    		return gender;
    	}
    
    
    	public void setGender(String gender) {
    		this.gender = gender;
    	}
    
    
    	public Date getBirthday() {
    		return birthday;
    	}
    
    
    	public void setBirthday(Date birthday) {
    		this.birthday = birthday;
    	}
    
    
    	public String getEmail() {
    		return email;
    	}
    
    
    	public void setEmail(String email) {
    		this.email = email;
    	}
    
    
    	public int getPoint() {
    		return point;
    	}
    
    
    	public void setPoint(int point) {
    		this.point = point;
    	}
    
    
    	public Timestamp getCreatedAt() {
    		return createdAt;
    	}
    
    	
    	
    
    	@Override
    	public String toString() {
    		return "Member [id=" + id + ", name=" + name + ", gender=" + gender + ", birthday=" + birthday + ", email="
    				+ email + ", point=" + point + ", createdAt=" + createdAt + "]";
    	}
    
    
    
    
    	public void setCreatedAt(Timestamp createdAt) {
    		this.createdAt = createdAt;
    	}
    	
    	
    	
    }

     

    3.MemberController

    더보기
    package com.sh.member.controller;
    
    import java.util.List;
    
    import com.sh.member.model.dao.MemberDao;
    import com.sh.member.model.entity.Member;
    
    //제어 클래스
    public class MemberController 
    {	
    	private MemberDao dao = new MemberDao();
    	
    	//멤버 리스트
    	public List<Member> findAll() 
    	{
    		
    		//요청
    		List<Member> members = dao.findAll();
    		//결과를 view단에 반환
    		return members;
    	}
    	
    	//멤버 리스트
    	public List<Member> findName(String searchName) 
    	{
    			
    		//요청
    		List<Member> members = dao.findName(searchName);
    		//결과를 view단에 반환
    		return members;
    	}
    
    	//회원가입 메소드
    	public int insertMember(Member member) 
    	{
    		//memberDao에게 멤버객체를 보내줌(요청)
    		//그리고 결과를 view단에 전달한다
    		int result = dao.insertMember(member);
    		return result;
    	}
    
    	//아이디 조회
    	public Member findById(String id) 
    	{
    		
    		return dao.findById(id);
    	}
    	
    	//회원 탈퇴- 아이디조회
    	//아이디 조회
    	public int deleteMember(String id) 
    	{
    			
    		return dao.deleteMember(id);
    	}
    
    	
    	//회원 수정할 메소드
    	public int updateMamber(String type,String data,String id) {
    		
    		return dao.updateMember(type,data,id);
    	}
    }

     

    4.MemberDao

    더보기
    package com.sh.member.model.dao;
    
    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.sql.Timestamp;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.List;
    
    import com.sh.member.model.entity.Member;
    
    public class MemberDao 
    {
    	/**<pre>
    	 * dql jdbc 절차 (update)
    	 * 1.Driver 클래스 등록
    	 * 2.Connection 객체 생성(url, id, password)
    	 * 3.PreparedStatement 객체 생성(쿼리 준비)
    	 * 4.쿼리 실행 - ResultSet 객체 반환
    	 * 5.ResultSet 처리
    	 * 6.반환 (ResultSet - PreparedStatment - Connection 순 반환)
    	 */
    	private String driverClassName = "oracle.jdbc.OracleDriver";
    	private String url = "jdbc:oracle:thin:@localhost:1521:xe"; //접속 프로토콜@url:port
    	private String user = "student";
    	private String password = "student";
    	
    	/*
    		여러 건 조회하는 경우: 0이면 빈 list 반환, n행이면 n개의 member객체를 가진 list반환
    		한 건 조회하는 경우: 0행이면 null 반환, 1행이면 member객체 1개 반환
    	*/
    	public List<Member> findAll() 
    	{
    		List<Member>members = new ArrayList<>();
    		Connection conn = null;
    		PreparedStatement pstmt = null;
    		ResultSet rset = null;
    		String sql = "Select * from member order by created_at desc";
    		
    		 
    		try 
    		{
    			//1.Driver 클래스 등록
    			Class.forName(driverClassName);
    			
    			//2.Connection 객체 생성(url, id, password)
    			conn = DriverManager.getConnection(url,user,password);
    			
    			//3.PreparedStatement 객체 생성(쿼리 준비)
    			pstmt = conn.prepareStatement(sql);
    			
    			//4.쿼리 실행 - ResultSet 객체 반환
    			rset = pstmt.executeQuery();
    			
    			//5.ResultSet 처리
    			while(rset.next())
    			{
    				String id = rset.getString("id");
    				String name = rset.getString("name");
    				String gender = rset.getString("gender");
    				Date birthday= rset.getDate("birthday");
    				String email = rset.getString("email");
    				int point = rset.getInt("point");
    				Timestamp created_at =rset.getTimestamp("created_at");
    		
    				//컬럼명으로 가져온 컬럼값들을 member객체로 만들고
    				Member member = new Member(id,name,gender,birthday,email,point,created_at);
    				System.out.println(member);
    				members.add(member);//멤버 객체 하나를 리스트에 추가
    			}
    			
    		} 
    		catch (ClassNotFoundException | SQLException e) 
    		{
    			
    			e.printStackTrace();
    		}
    		 
    		 //6.반환 (ResultSet - PreparedStatment - Connection 순 반환)
    		try {
    			rset.close();
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    		try {
    			pstmt.close();
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    		try {
    			conn.close();
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    		
    		
    		return members; //리스트를 반환한다.
    	}
    
    	
    	//=================================================================================
    	/**
    	 * <pre>
    	 * dml jdbc 처리절차 (insert, udpate, delete)
    	 * 1.드라이버 클래스 등록
    	 * 2.connection 객체 생성 (url,user,pw필요 )
    	 * 	-auto commit false 설정
    	 * 3.preparedStatement 객체 생성(query)
    	 *  -미완성 쿼리의 ? 값 대입
    	 * 4.쿼리 실행 - int 반환받는다.
    	 * 5.트랜잭션처리 (commit or rollback)
    	 * 6.자원반납
    	 */
    	public int insertMember(Member member) 
    	{
    		int result=0;
    		Connection conn = null;
    		PreparedStatement pstmt = null;
    		String sql = """
    					insert into 
    						member
    					values(? ,? ,? ,? ,? ,default,default)
    					""";
    		
    		  
    		try 
    		{
    			//1.드라이버 클래스 등록
    			Class.forName(driverClassName);
    			
    			//2.connection 객체 생성 (url,user,pw필요)
    			conn = DriverManager.getConnection(url,user,password);
    			conn.setAutoCommit(false); //-auto commit false 설정(d:true)
    			
    			//3.preparedStatement 객체 생성(query)
    			pstmt = conn.prepareStatement(sql);
    			// -미완성 쿼리의 ? 값 대입
    			pstmt.setString(1, member.getId()); //db의 인덱스 기준이라 1부터 시작함.
    			pstmt.setString(2, member.getName());
    			pstmt.setString(3, member.getGender());
    			pstmt.setDate(4, member.getBirthday());
    			pstmt.setString(5, member.getEmail());
    			//4.쿼리 실행(dml) - int 반환받는다.
    			result = pstmt.executeUpdate(); //처리된 행의 수를 반환. 2행이 어쩌고~:2가 반환
    			//5.트랜잭션처리 (commit or rollback)
    			if(result>0)
    				conn.commit();//결과가 1개이상이면 성공- 커밋
    			else conn.rollback();//실패했다면 롤백
    		} 
    		catch (ClassNotFoundException | SQLException e) 
    		{
    			e.printStackTrace();
    		}
    		finally
    		{
    			//6.자원반납
    			try 
    			{
    				pstmt.close();
    			} 
    			catch (Exception e) 
    			{
    				e.printStackTrace();
    			}
    			try 
    			{
    				conn.close();
    			} 
    			catch (Exception e) 
    			{
    				e.printStackTrace();
    			}
    		}		
    		return result;
    	}
    	//=======================================================================================
    	
    	//회원삭제 - pk 아이디로
    	public int deleteMember(String id) 
    	{
    		int result=0;
    		Member member = null; //조회된 아이디가 없으면 null반환
    		Connection conn = null;
    		PreparedStatement pstmt = null;
    		String sql = "delete from member where id = ?";
    		
    		  
    		try 
    		{
    			//1.드라이버 클래스 등록
    			Class.forName(driverClassName);
    			
    			//2.connection 객체 생성 (url,user,pw필요)
    			conn = DriverManager.getConnection(url,user,password);
    			conn.setAutoCommit(false); //-auto commit false 설정(d:true)
    			//3.preparedStatement 객체 생성(query)
    			pstmt = conn.prepareStatement(sql);
    			
    			// -미완성 쿼리의 ? 값 대입
    			//입력한 id를 where절 조건으로 삼는다.
    			pstmt.setString(1, id);
    			
    			//4.쿼리 실행(dml) - int 반환받는다.
    			result = pstmt.executeUpdate(); //처리된 행의 수를 반환. 2행이 어쩌고~:2가 반환
    			//5.트랜잭션처리 (commit or rollback)
    			if(result>0)
    				conn.commit();//결과가 1개이상이면 성공- 커밋
    			else conn.rollback();//실패했다면 롤백
    		} 
    		catch (ClassNotFoundException | SQLException e) 
    		{
    			e.printStackTrace();
    		}
    		finally
    		{
    			//6.자원반납
    			try 
    			{
    				pstmt.close();
    			} 
    			catch (Exception e) 
    			{
    				e.printStackTrace();
    			}
    			try 
    			{
    				conn.close();
    			} 
    			catch (Exception e) 
    			{
    				e.printStackTrace();
    			}
    		}		
    		return result;
    	}
    
    	
    	//=================================================================================
    	//아이디 조회
    	public Member findById(String id) 
    	{
    		Member member = null; //조회된게 없으면 null을 반환
    		Connection conn = null;
    		PreparedStatement pstmt = null;
    		ResultSet rset = null;
    		String sql = "select * from member where id = ?";
    		
    		try 
    		{
    			//1.Driver 클래스 등록
    			Class.forName(driverClassName);
    
    			//2.Connection 객체 생성(url, id, password)
    			conn = DriverManager.getConnection(url,user,password);
    			
    			//3.PreparedStatement 객체 생성(쿼리 준비)
    			pstmt = conn.prepareStatement(sql);
    			
    			//미완성 쿼리 값 대입
    			pstmt.setString(1, id);
    			
    			//4.쿼리 실행 - ResultSet 객체 반환
    			rset = pstmt.executeQuery();
    			
    			//5.ResultSet 처리
    			while(rset.next())
    			{
    				String name = rset.getString("name");
    				String gender = rset.getString("gender");
    				Date birthday= rset.getDate("birthday");
    				String email = rset.getString("email");
    				int point = rset.getInt("point");
    				Timestamp created_at =rset.getTimestamp("created_at");
    				
    				//컬럼명으로 가져온 컬럼값들을 member객체로 만들고
    				member = new Member(id,name,gender,birthday,email,point,created_at);
    				System.out.println(member);
    			}
    			
    		} 
    		catch (ClassNotFoundException | SQLException e) 
    		{
    			e.printStackTrace();
    		}
    		//6.반환 (ResultSet - PreparedStatment - Connection 순 반환)
    		finally {
    			try {
    				rset.close();
    			} catch (Exception e) {
    				e.printStackTrace();
    			}
    			try {
    				pstmt.close();
    			} catch (Exception e) {
    				e.printStackTrace();
    			}
    			try {
    				conn.close();
    			} catch (Exception e) {
    				e.printStackTrace();
    			}
    		}
    		
    		return member;
    	}
    
    	
    	//===========================================================================================
    	//이름 조회
    	//1행만 검색하는 것 아닌가? 생각하겠지만 동명이인을 고려하여 한행이 아닌 여러행을 반환하도록 한다.
    	//성빼고 이름으로 검색하는 로직.
    	//id는 고유하지만 name은 고유하지 않음
    	public List<Member> findName(String searchName) 
    	{
    		List<Member>members = new ArrayList<>();
    		Connection conn = null;
    		PreparedStatement pstmt = null;
    		ResultSet rset = null;
    		System.out.println("찾는이름:"+searchName);
    		String sql = "select * from member where name like ?";
    		
    		 
    		try 
    		{
    			//1.Driver 클래스 등록
    			Class.forName(driverClassName);
    
    			//2.Connection 객체 생성(url, id, password)
    			conn = DriverManager.getConnection(url,user,password);
    			
    			//3.PreparedStatement 객체 생성(쿼리 준비)
    			pstmt = conn.prepareStatement(sql);
    			
    			//미완성 쿼리 값 대입
    			pstmt.setString(1, "%"+searchName+"%");
    			//pstmt.setString(1, "길동");
    			
    			//4.쿼리 실행 - ResultSet 객체 반환
    			rset = pstmt.executeQuery();
    			
    			//5.ResultSet 처리
    			while(rset.next())
    			{
    				String id = rset.getString("id");
    				String name = rset.getString("name");
    				String gender = rset.getString("gender");
    				Date birthday= rset.getDate("birthday");
    				String email = rset.getString("email");
    				int point = rset.getInt("point");
    				Timestamp created_at =rset.getTimestamp("created_at");
    		
    				//컬럼명으로 가져온 컬럼값들을 member객체로 만들고
    				Member member = new Member(id,name,gender,birthday,email,point,created_at);
    				System.out.println(member);
    				members.add(member);//멤버 객체 하나를 리스트에 추가
    			}
    			
    		} 
    		catch (ClassNotFoundException | SQLException e) 
    		{
    			
    			e.printStackTrace();
    		}
    		 
    		 //6.반환 (ResultSet - PreparedStatment - Connection 순 반환)
    		try {
    			rset.close();
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    		try {
    			pstmt.close();
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    		try {
    			conn.close();
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    		
    		
    		return members; //리스트를 반환한다.
    	}
    
    	//==========================================================================================================
    	//회원수정 메소드.. 이름,생일,이메일 
    	public int updateMember(String type, String data, String id) 
    	{	
    		System.out.println(type+"/"+id);
    		
    		int result=0;
    		Member member = null; //조회된 아이디가 없으면 null반환
    		Connection conn = null;
    		PreparedStatement pstmt = null;
    		
    		//type이 birthday이면 data 값을 날짜로 형변환
    		if(type.equals("birthday"))
    		{
    			Date birthday = null;
    			SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
    			//java.util.Date->long->java.sql.Date
    			try 
    			{
    				birthday = new Date(sdf.parse(data).getTime());
    			} 
    			catch (ParseException e) 
    			{
    				e.printStackTrace();
    			}
    		}
    		String sql = "update member set "+type+" =? where id = ?";
    		
    		  
    		try 
    		{
    			//1.드라이버 클래스 등록
    			Class.forName(driverClassName);
    			
    			//2.connection 객체 생성 (url,user,pw필요)
    			conn = DriverManager.getConnection(url,user,password);
    			conn.setAutoCommit(false); //-auto commit false 설정(d:true)
    			//3.preparedStatement 객체 생성(query)
    			pstmt = conn.prepareStatement(sql);
    			
    			// -미완성 쿼리의 ? 값 대입
    			//입력한 id를 where절 조건으로 삼는다.
    			pstmt.setString(1,data);
    			pstmt.setString(2, id);
    			//4.쿼리 실행(dml) - int 반환받는다.
    			result = pstmt.executeUpdate(); //처리된 행의 수를 반환. 2행이 어쩌고~:2가 반환
    			//5.트랜잭션처리 (commit or rollback)
    			if(result>0)
    				conn.commit();//결과가 1개이상이면 성공- 커밋
    			else conn.rollback();//실패했다면 롤백
    		} 
    		catch (ClassNotFoundException | SQLException e) 
    		{
    			e.printStackTrace();
    		}
    		finally
    		{
    			//6.자원반납
    			try 
    			{
    				pstmt.close();
    			} 
    			catch (Exception e) 
    			{
    				e.printStackTrace();
    			}
    			try 
    			{
    				conn.close();
    			} 
    			catch (Exception e) 
    			{
    				e.printStackTrace();
    			}
    		}		
    		return result;
    	}//update
    }

     

    5.MemberMenu

    더보기
    package com.sh.member.view;
    
    import java.sql.Date;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.List;
    import java.util.Scanner;
    
    import com.sh.member.controller.MemberController;
    import com.sh.member.model.entity.Member;
    
    public class MemberMenu 
    {
    	private Scanner sc = new Scanner(System.in);
    	private MemberController mc = new MemberController();
    	public void mainMenu()
    	{
    		//아래의 메뉴를 선택할때마다 memberController를 거쳐야함
    		String menu = """
    					===== 회원 관리 프로그램 =====
    					1.전체조회
    					2.아이디 조회
    					3.이름 검색 
    					4.회원 가입
    					5.회원 정보 변경
    					6.회원 탈퇴
    					0.프로그램 종료
    					==========================
    				 선택:""";
    		
    
    		while(true)
    		{
    			System.out.println(menu);
    			String choice = sc.next();
    			Member member = null;
    			int result = 0;
    			List<Member> members = null;
    			String id = null;
    			String searchName=null;
    			switch(choice)
    			{
    			case "1": 
    				members = mc.findAll();
    				displayMembers(members);
    				break;
    				
    				
    				//2.아이디 조회
    			case "2": 
    				id = inputId();
    				member = mc.findById(id); //조회가 되지 않았다면 null반환
    				displayMember(member);
    				break;
    				
    				//3:이름 검색 ->동명이인이 있어서 like연산 사용해야.
    			case "3": 
    				searchName = inputName();
    				members = mc.findName(searchName);
    				displayMembers(members);
    				break;
    				
    
    				
    			case "4": 
    				//처리 결과 값은 정수값이 온다.
    				member = inputMember(); //회원정보 입력
    				result = mc.insertMember(member); //db저장 요청
    				displayResult("회원 가입",result,null);//결과출력
    				break;
    				
    				
    				//update
    			case "5": 
    				/*
    				 * 수정할 회원 아이디를 입력받고
    				 * 해당 회원의 조회결과를 보여준 뒤 서브메뉴를 출력한다.
    				 * 수정은 이름/생일/이메일만 가능.
    				 * 회원정보 수정 완료시 수정된 회원정보를 보여주고 수정메뉴 다시출력
    				 * 
    				 */
    				id = inputId();
    				member = mc.findById(id); //조회가 되지 않았다면 null반환
    				displayUpadateMenu(member);
    				break;
    				
    				
    				
    				
    				//회원 탈퇴 delete
    			case "6": 
    				id = inputId();
    				result = mc.deleteMember(id); //조회가 되지 않았다면 null반환
    				displayResult("회원 탈퇴",result,null);//결과출력
    				break;
    				
    			case "0": 
    				return; //현재 메소드를 호출한 곳으로 돌아감-main으로 되돌아가 종료
    			default:
    				System.out.println("잘못 입력 하셨습니다..");
    				break;
    			}
    		}
    	}
    	
    	//수정메뉴
    	private void displayUpadateMenu(Member m) 
    	{
    		if(m==null)
    		{
    			System.out.println("회원을 찾을 수 없습니다.ㅠㅠ");
    		}
    		else
    		{
    			System.out.println("----------------------------------------------");
    
    			System.out.printf("ID: %-10s\n"
    							+ "NAME: %-10s\n"
    							+ "GENDER: %-10s\n"
    							+ "BIRTHDAY: %-10s\n"
    							+ "EMAIL: %-20s\n"
    							+ "POINT: %-10s\n"
    							+ "CREATED_AT: %-20s\n",
    					m.getId(),
    					m.getName(),
    					m.getGender(),
    					m.getBirthday(),
    					m.getEmail(),
    					m.getPoint(),
    					new SimpleDateFormat("yyyy-MM-dd HH:mm").format(m.getCreatedAt())
    					
    					);
    			System.out.println("----------------------------------------------");
    			System.out.println(m.getId()+"님의 회원정보를 수정합니다.");
    			
    			String menu = """
    					===== 회원 정보 수정 =====
    					1.이름 수정
    					2.생일 수정
    					3.이메일 수정 
    					0.메인메뉴로 돌아가기.
    					=======================
    				 선택:""";
    			while(true)
    			{
    				int result=0;
    				System.out.println(menu);
    				String choice = sc.next();
    				switch(choice)
    				{
    					case "1":
    						//이름수정
    						String name = inputUpdateInfo("이름");
    						result = mc.updateMamber("name",name,m.getId()); //0이면 실패, 1이면 성공
    						displayResult("회원 이름 수정",result,m.getId());//결과출력
    						break;
    					case "2":
    						//생일수정
    						String birthday = inputUpdateInfo("생일");
    						result = mc.updateMamber("birthday",birthday,m.getId()); //0이면 실패, 1이면 성공
    						displayResult("회원 생일 수정",result,m.getId());//결과출력
    						break;
    					case "3":
    						//이메일수정
    						String email = inputUpdateInfo("메일");
    						result = mc.updateMamber("email",email,m.getId()); //0이면 실패, 1이면 성공
    						displayResult("회원 메일 수정",result,m.getId());//결과출력
    						break;
    					case "0": 
    						System.out.println("메인 메뉴로 되돌아갑니다.");
    						return; //현재 메소드를 호출한 곳으로 돌아감-main메뉴로 되돌아감.
    					default:
    						System.out.println("잘못 입력 하셨습니다..");
    						break;
    				}
    			}//while
    		
    		
    		}//else
    	}//method
    
    	private String inputUpdateInfo(String what) 
    	{
    		System.out.print(">수정하실 "+what+"을 입력해주세요.");
    		return sc.next();
    	}
    
    	//사용자명으로 검색
    	private String inputName() 
    	{
    		System.out.println("조회할 사용자 이름을 입력하세요.");
    		return sc.next();
    	}
    
    	//1건의 회원 정보 조회
    	private void displayMember(Member m) 
    	{
    		if(m == null)
    		{
    			System.out.println("회원을 찾을 수 없습니다.ㅠㅠ");
    		}
    		else
    		{
    			System.out.println("----------------------------------------------");
    
    			System.out.printf("ID: %-10s\n"
    							+ "NAME: %-10s\n"
    							+ "GENDER: %-10s\n"
    							+ "BIRTHDAY: %-10s\n"
    							+ "EMAIL: %-20s\n"
    							+ "POINT: %-10s\n"
    							+ "CREATED_AT: %-20s\n",
    					m.getId(),
    					m.getName(),
    					m.getGender(),
    					m.getBirthday(),
    					m.getEmail(),
    					m.getPoint(),
    					new SimpleDateFormat("yyyy-MM-dd HH:mm").format(m.getCreatedAt())
    					
    					);
    			System.out.println("----------------------------------------------");
    		}
    		
    	}
    
    	//조회하고자 하는 사용자 아이디 입력받기
    	private String inputId() 
    	{
    		System.out.println("아이디를 입력하세요.");
    		return sc.next();
    	}
    
    	/**
    	 * n건의 회원조회 결과를 출력한다.
    	 * 
    	 */
    	private void displayMembers(List<Member> members) {
    		System.out.println("------------------------------------------------------------------------");
    		System.out.printf("%-10s%-10s%-10s%-10s%-20s%-10s%-20s\n",
    							"ID","NAME","GENDER","BIRTHDAY","EMAIL","POINT","CREATED_AT");
    		System.out.println("------------------------------------------------------------------------");
    		if(members.isEmpty())
    		{
    			System.out.println("조회된 결과가 없습니다.....");
    		}
    		else
    		{
    			for(Member m : members)
    			{
    				System.out.printf("%-10s%-10s%-10s%-10s%-20s%-10s%-20s\n",
    								m.getId(),
    								m.getName(),
    								m.getGender(),
    								m.getBirthday(),
    								m.getEmail(),
    								m.getPoint(),
    								new SimpleDateFormat("yyyy-MM-dd HH:mm").format(m.getCreatedAt())
    								
    								);
    			}
    		}
    		System.out.println("------------------------------------------------------------------------");
    	}
    
    	//dml 처리결과 메소드
    	private void displayResult(String type, int result,String id) {
    	
    		if(result>0)
    		{
    			System.out.println(type+"성공!💞");
    			if(id!=null)
    			{
    				Member member = mc.findById(id); //조회가 되지 않았다면 null반환
    				displayMember(member);
    			}
    		}
    		else
    		{
    			System.out.println(type+"실패!(ノ`Д)ノ");
    		}
    		
    	}
    
    	//회원가입 메소드
    	//회원 정보를 입력받아 Member객체로 반환한다.
    	private Member inputMember() 
    	{
    		System.out.println("회원 정보를 입력해주세요.");
    		
    		System.out.println("아이디:");
    		String id = sc.next();
    		
    		System.out.println("이름:");
    		String name = sc.next();
    		
    		System.out.println("성별(M/F):");
    		String gender = sc.next();
    		
    		System.out.println("생일(19900909):");
    		String _birthday = sc.next();
    		Date birthday = null;
    		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
    		//java.util.Date->long->java.sql.Date
    		try 
    		{
    			birthday = new Date(sdf.parse(_birthday).getTime());
    		} 
    		catch (ParseException e) 
    		{
    			e.printStackTrace();
    		}
    		
    		System.out.println("이메일:");
    		String email = sc.next();
    		
    		
    		
    		return new Member(id,name,gender,birthday,email, 0, null);
    	}
    }

     

    *false로 지정한 이유:여러 쿼리를 실행할때 최소작업단위에 따라 커밋하기 위해..

    true인 경우 쿼리 하나 실행할 때마다 자동 커밋이 되기 때문에..

    conn.setAutoCommit(false); //-auto commit false 설정(d:true)

    '공부 > 학습' 카테고리의 다른 글

    1101 jdbc - day3  (0) 2023.11.01
    1031 jdbc - day2  (0) 2023.10.31
    1027 (29일차) - sql 9일차  (0) 2023.10.27
    1026 (28일차) -sql 8일  (0) 2023.10.26
    1024 (26일차)- sql 6일  (0) 2023.10.24
    댓글