ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JDBC를 이용해 테이블에 입력, 삭제, 수정, 선택을 해보자.
    기타/Oracle 2020. 11. 23. 13:40

    1. 어떤 종류의 동작을 실행 시킬 것인지 인터페이스로 메소드를 구상한다.

    import java.sql.*;
    
    public interface IDao<T, K> { 
    	public int insert (T vo) throws SQLException;
    	public int delete (K key) throws SQLException;
    	public int update (T vo) throws SQLException;
    	public T select (K key) throws SQLException;
    	public List<T> selectAll () throws SQLException;
    }

    IDao란 메소드는 <T,K> 형태를 사용한다.

    T 타입은 VO클래스

    K 타입은 String

    select는 T의 키값

    selectAll은 T전체 리스트값

     

    throws SQLException (클래스에 일일히 try / catch를 주지 않기 위해서 선언)

     

     

    2. 메소드를 만들면 VO클래스를 만들어준다

    public class MyMember {
    	private String id;
    	private String name;
    	private String pw;
    	private String ect;
    	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 getPw() {
    		return pw;
    	}
    	public void setPw(String pw) {
    		this.pw = pw;
    	}
    	public String getEct() {
    		return ect;
    	}
    	public void setEct(String ect) {
    		this.ect = ect;
    	}
    	@Override
    	public String toString() {
    		return "MyMember [id=" + id + ", name=" + name + ", pw=" + pw + ", ect=" + ect + "]";
    	}
    	
    }

    T( VO클래스) 의 이름을 MyMember로 정했다.

    MyMember의 값은 이미 생성된 데이터 베이스의 정의 값과 동일해야한다.

     

    그 다음 각 값들을 get, set 처리해서 받아준다.

    toString으로 출력시 보이는 모양을 만들어준다.

     

    3. IDao에서 만든 메소드를 오버라이딩 시켜주는 MyMemberDAO 클래스를 생성

    이렇게 따로 만들어 스킨 처리를 해야 나중에 수정이 용이하다.

    새로운 설정을 만들때 새 파일을 만드는 것과 하나부터 열까지 뜯어 고치는 것은 다르기 때문이다.

    import java.sql.*;
    import java.util.*;
    
    public class MyMemberDAO implements IDao<MyMember, String>{
    
    	@Override
    	public int insert(MyMember vo) throws SQLException {
    		String sql = "INSERT INTO MYMEMBER VALUES(?, ?, ?, ?)";
    		String id = vo.getId(); 
    		String name = vo.getName();
    		String pw = vo.getPw();
    		String ect = vo.getEct();
    		//?가 있는 질의 - 동적질의 (Dynamic Query)
    		//동적질의를 담을 수 있는 클래스
    		Connection conn = ConnectionFactory.create();
    		PreparedStatement pstmt = conn.prepareStatement(sql);
    		pstmt.setString(1, id); // 1부터 시작 ?의 첫번째 자리
    		pstmt.setString(2, name);
    		pstmt.setString(3, pw);
    		pstmt.setString(4, ect);
    		// 질의 수행  - select 질의만 executeQuery다 나머진 executeUpdate
    		int res =  pstmt.executeUpdate();
    		conn.close();
    		//질의 수행 후 영향받은 행 숫자를 리턴
    		return res; 
    	}
    
    	@Override
    	public int delete(String key) throws SQLException {
    		//지우는 질의는 반드시 삭제 조선을 where 절에 넣어야 한다.
    		String sql = "DELETE FROM MYMEMBER WHERE ID = ?";
    		Connection conn = ConnectionFactory.create();
    		PreparedStatement pstmt = conn.prepareStatement(sql);
    		pstmt.setString(1, key);
    		int res  = pstmt.executeUpdate();
    		conn.close();
    		return res;
    	}
    
    	@Override
    	public int update(MyMember vo) throws SQLException {
    		// TODO Auto-generated method stub
    		return 0;
    	}
    
    	@Override
    	public MyMember select(String key) throws SQLException {
    		String sql = "SELECT * FROM MYMEMBER WHERE ID = ?";
    		Connection conn = ConnectionFactory.create();
    		PreparedStatement pstmt = conn.prepareStatement(sql);
    		pstmt.setString(1, key);
    		
    		// rs - select 질의 결과를 담은 객체
    		//레코드 옮기는 메소드 re.next(); ==> 레코드가 잘 옮겨지면 ture 아니면 false
    		ResultSet rs = pstmt.executeQuery();
    		String id=null, name=null, pw=null, ect=null;
    		MyMember vo = new MyMember();
    		//key로 조건 준 색인이어서 자료는 1개 이하
    		while(rs.next()) { 
    			id = rs.getString(1);
    			name = rs.getString(2);
    			pw = rs.getString(3);
    			ect = rs.getString(4);
    			vo.setId(id);
    			vo.setName(name);
    			vo.setPw(pw);
    			vo.setEct(ect);
    		}
    		return vo;
    	}
    
    	@Override
    	public List<MyMember> selectAll() throws SQLException {
    		String sql = "SELECT * FROM MYMEMBER";
    		Connection conn = ConnectionFactory.create();
    		PreparedStatement pstmt = conn.prepareStatement(sql);
    
    		ResultSet rs = pstmt.executeQuery();
    		String id=null, name=null, pw=null, ect=null;
    		List<MyMember> data = new ArrayList<>();
    		while(rs.next()) { 
    			id = rs.getString(1);
    			name = rs.getString(2);
    			pw = rs.getString(3);
    			ect = rs.getString(4);
    			
    			MyMember vo = new MyMember();
    			vo.setId(id);
    			vo.setName(name);
    			vo.setPw(pw);
    			vo.setEct(ect);
    			data.add(vo);
    		}
    		return data;
    	}
    }
    

    implements

    클래스가 아닌 인터페이스를 가져올 때 사용한다

    구현해야 할 메소드의 종류만 인터페이스에서 정의하고 실 구현은 implements 받은 클래스에서 구현한다

     

    IDao<MyMember, String>

    T = MyMember

    K = String

    IDao에서 정의한 것처럼

    (T vo) = (MyMember vo), (K key) = (String key)

    값을 할당해준다.

     

    @Override
    	public int insert(MyMember vo) throws SQLException {
    		String sql = "INSERT INTO MYMEMBER VALUES(?, ?, ?, ?)";
    		String id = vo.getId(); 
    		String name = vo.getName();
    		String pw = vo.getPw();
    		String ect = vo.getEct();
    		//?가 있는 질의 - 동적질의 (Dynamic Query)
    		//동적질의를 담을 수 있는 클래스
    		Connection conn = ConnectionFactory.create();
    		PreparedStatement pstmt = conn.prepareStatement(sql);
    		pstmt.setString(1, id); // 1부터 시작 ?의 첫번째 자리
    		pstmt.setString(2, name);
    		pstmt.setString(3, pw);
    		pstmt.setString(4, ect);
    		// 질의 수행  - select 질의만 executeQuery다 나머진 executeUpdate
    		int res =  pstmt.executeUpdate();
    		conn.close();
    		//질의 수행 후 영향받은 행 숫자를 리턴
    		return res; 
    	}

    위 코드는 PreparedStatement로 구현되었습니다

    String sql = "INSERT INTO MYMEMBER VALUES(?, ?, ?, ?)";

    PreparedStatement는 VALUES값에 변수가 아닌 ?가 들어간다.

    추후 '?'는 set을 이용하여 값을 넣는다.

     

    String 변수이름 = MyMember.java의 get(입력갑)

     

    Connection conn = ConnectionFactory.create();

    ConnectionFactory에서 설정한 데이터 베이스로 연결한다.

     

    pstmt = conn.prepareStatement(sql);

    pstmt란 PreparedStatement 변수는 위에 설정해놓은 sql과 연결해줍니다.

     

    set 값을 '?' 순서에 맞게 할당해줍니다.

    pstmt.setString(1, id);
    pstmt.setString(2, name);
    pstmt.setString(3, pw);
    pstmt.setString(4, ect);

     

    리턴 받을 값을 res라는 변수로 처리

    select 질의만 executeQuery다 나머진 executeUpdate

    int res =  pstmt.executeUpdate();

     

    리턴 받은 후에는 연결을 끊어줍니다.

    conn.close();

    return res; 

     

    @Override
    public int delete(String key) throws SQLException {
      //지우는 질의는 반드시 삭제 조선을 where 절에 넣어야 한다.
      String sql = "DELETE FROM MYMEMBER WHERE ID = ?";
      Connection conn = ConnectionFactory.create();
      PreparedStatement pstmt = conn.prepareStatement(sql);
      pstmt.setString(1, key);
      int res  = pstmt.executeUpdate();
      conn.close();
      return res;
    }

    삭제할 행의 ID를 찍어라

    String sql = "DELETE FROM MYMEMBER WHERE ID = ?";

     

    @Override
    public MyMember select(String key) throws SQLException {
    	String sql = "SELECT * FROM MYMEMBER WHERE ID = ?";
    	Connection conn = ConnectionFactory.create();
    	PreparedStatement pstmt = conn.prepareStatement(sql);
    	pstmt.setString(1, key);
    
    	ResultSet rs = pstmt.executeQuery();
    	String id=null, name=null, pw=null, ect=null;
    	MyMember vo = new MyMember();
    	while(rs.next()) { 
    		id = rs.getString(1);
    		name = rs.getString(2);
    		pw = rs.getString(3);
    		ect = rs.getString(4);
    		vo.setId(id);
    		vo.setName(name);
    		vo.setPw(pw);
    		vo.setEct(ect);
    	}
    	return vo;
    }

    선택할 행의 아이디를 입력하세요

    String sql = "SELECT * FROM MYMEMBER WHERE ID = ?";

     

    executeQuery는 ResultSet으로 반환한다

    ResultSet rs = pstmt.executeQuery();

    Select 문은 단순 조회이고 데이터에 영향을 끼치지 않는다.

    Select문의 return값은 자료형이 여러개이기 때문에 단정짓기가 어렵다.

    그래서 기본 자료형 말고 자바에서 만들어 놓은 자료형 ResultSet을 사용한다.

     

    while(rs.next()) {}

    ResultSet의 객체는 현재의 데이터 행에 커서를 유지한다.

    초기에 커서는 첫번째 행 전에 위치한다.

    next Method는 다음 행으로 이동시킨다.

    그리고 더이상 ResultSet객체에 행이 없을 때 false를 return한다.

     

    rs.next( ); 

    next함수는 ResultSet에 저장된 select문 실행결과를 행단위로 1행씩 넘겨서 만약에  다음 행이 있으면 ture, 다음행이 없으면 false를 반환하는 함수다.

    while(rs.next())를 하게되면 할 루프가 돌아갈 때 마다 1행씩 넘겨주다가 더이상 행이 없으면 while문이 끝난다.

     

    rs.getString( );

    getString함수는 해당순서의 열에 있는 데이터를 string형으로 받아온다는 뜻이다.

    예를들어 rs.getString(2)를 하게되면, 2번째 열에 있는 데이터를 가져오게 된다.

    (getInt(), getFloat()등도 있다)

     

    String id=null, name=null, pw=null, ect=null;

    넘기는 값이 없을 경우 null로 보여준다.

     

    4. Main클래스를 만들어 적용해보자

    public class Main {
    	
    	public void testOfInsert() {
    		//3단계 
    		MyMemberDAO dao = new MyMemberDAO();
    		MyMember vo =new MyMember();
    		vo.setId("ygs");
    		vo.setName("아리아");
    		vo.setPw("1234");
    		vo.setEct("기타내용입니다");
    		
    		try {
    			dao.insert(vo);
    			System.out.println(vo + "를 데이터베이스에 입력했습니다");
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    		
    	}
    	
    	public void testOfDelete() {
    		MyMemberDAO dao = new MyMemberDAO();
    		try {
    			int res = dao.delete("ygs");
    			if (res==1) {
    				System.out.println("데이터가 삭제되었습니다.");
    			}else {
    				System.out.println("지울 자료가 없습니다");
    			}
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    	}
    	
    	public void testOfSelect() {
    		MyMemberDAO dao = new MyMemberDAO();
    		try {
    			MyMember vo = dao.select("one");
    			System.out.println(vo);
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    		
    	}
    	
    	public void testOfSelectAll() {
    		MyMemberDAO dao = new MyMemberDAO();
    		try {
    			List<MyMember> data = dao.selectAll();
    			for(MyMember x:data) {
    				System.out.println(x);
    			}
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    		
    	}
    	
    	
    	public static void main(String[] args) {
    		Main testor = new Main();
    		//testor.testOfInsert();
    		//testor.testOfDelete();
    		testor.testOfSelect();
    		testor.testOfSelectAll();
    	}
    
    }

    MyMemberDAO를 실행시켜줄 메소드를 만들자.

     

    public void testOfInsert() {
    	//3단계 
    	MyMemberDAO dao = new MyMemberDAO();
    	MyMember vo =new MyMember();
    	vo.setId("ygs");
    	vo.setName("아리아");
    	vo.setPw("1234");
    	vo.setEct("기타내용입니다");
    	
    	try {
    		dao.insert(vo);
    		System.out.println(vo + "를 데이터베이스에 입력했습니다");
    	} catch (SQLException e) {
    		e.printStackTrace();
    	}
    	
    }

    두 개의 실행 클래스를 불러온다.

    MyMemberDAO dao = new MyMemberDAO();

    MyMember vo =new MyMember();

     

    set을 이용해 값을 넣어준다

    vo.setId("ygs");

    vo.setName("아리아");

    vo.setPw("1234");

    vo.setEct("기타내용입니다");

     

    vo 값을 추가해라

    dao.insert(vo); 

     

    public void testOfDelete() {
      MyMemberDAO dao = new MyMemberDAO();
      try {
        int res = dao.delete("ygs");
        if (res==1) {
        	System.out.println("데이터가 삭제되었습니다.");
        }else {
        	System.out.println("지울 자료가 없습니다");
        }
      } catch (SQLException e) {
     	 e.printStackTrace();
      }
    }

    값을 삭제할 뿐이라 

    MyMemberDAO dao = new MyMemberDAO();

    클래스만 불러준다.

     

    아이디 값이 ygs인 행을 삭제하기

    int res = dao.delete("ygs");

     

    public void testOfSelect() {
    	MyMemberDAO dao = new MyMemberDAO();
    	try {
    		MyMember vo = dao.select("one");
    		System.out.println(vo);
    	} catch (SQLException e) {
    		e.printStackTrace();
    	}
    	
    }

    "one"이란 아이디를 가진 행이 있으면 찍어라

    MyMember vo = dao.select("one");

     

    sysout 으로 해당 vo값을 프린트하기

    System.out.println(vo);

     

    public void testOfSelectAll() {
    	MyMemberDAO dao = new MyMemberDAO();
    	try {
    		List<MyMember> data = dao.selectAll();
    		for(MyMember x:data) {
    			System.out.println(x);
    		}
    	} catch (SQLException e) {
    		e.printStackTrace();
    	}
    	
    }

    모든 행을 출력해야 함으로 for문을 돌려준다.

     

    public static void main(String[] args) {
    		Main testor = new Main();
    		//testor.testOfInsert();
    		//testor.testOfDelete();
    		testor.testOfSelect();
    		testor.testOfSelectAll();
    	}

    각 메소드를 호출하면 테이블의 변화를 확인 할 수 있다.

    한 번 지운 행을 다시 지우려고 하면 이미 지워진 행이라서 에러가 난다.

    댓글

Designed by Tistory.