TIL1 - (JDBC) crud 콘솔로 구현해보기(1)

김지인·2022년 7월 5일
0
post-thumbnail

오늘은 crud의 기본 구조를 콘솔로 실행해보자.


연습을 위한 임의의 테이블이다.
(UNIQUENUMBER 은 시퀀스임)

그 다음은 저 변수들을 담을 그릇을 만들어보자.

public class member {
	private String id;
	private String pwd;
	private String name;
	private int uniquenumber;
	
	public member() {
		
		
	}
	
	public member(String id, String pwd, String name, int uniquenumber) {
		this.id = id;
		this.pwd = pwd;
		this.name = name;
		this.uniquenumber = uniquenumber;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getPwd() {
		return pwd;
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getUniquenumber() {
		return uniquenumber;
	}
	public void setUniquenumber(int uniquenumber) {
		this.uniquenumber = uniquenumber;
	}
	
	
}

테이블에 있는 컬럼을 변수화 하여 사용하기 위해 각각의 변수에 getter setter와 그 값을 받는 생성자를 만듬.


테이블에 있는 컬럼을 담을 그릇을 만들었으니, 그 컬럼들을 가져올 수 있는 로직을 구성해보자.

public class memberservice {
	
	private String url = "jdbc:oracle:thin:@localhost:1521/xe";
	private String uid = "c##bmm522";
	private String upwd = "1234";
	private String driver = "oracle.jdbc.driver.OracleDriver";
	// 이 클래스 내에서 계속 사용되야 할 것이므로 멤버변수로 지정.
	//드라이브를 실행할때마다 불러주고 그 해당 로직이 끝나면 종료되게끔 하기.(메모리부담 덜주기)
	public List<member> getMember() throws ClassNotFoundException, SQLException{
		
		String sql = "SELECT * FROM MEMBER";
		
		Class.forName(driver);
		Connection con = DriverManager.getConnection(url, uid, upwd);
		Statement st = con.createStatement();
		ResultSet rs = st.executeQuery(sql);
		
		List<member> list = new ArrayList<member>(); //각자 테이블에서 추출한 값을 담아줄 리스트
		while(rs.next()) { //테이블의 마지막까지 탐색
			String id = rs.getString("ID");
			String pwd = rs.getString("PWD");
			String name = rs.getString("NAME");
			int uniquenumber = rs.getInt("UNIQUENUMBER");
// ------------------여기까지 추출을 하고--------------------------
			
			member member = new member(id, pwd, name, uniquenumber); // member에 추출한 값 담기
			list.add(member); //담은 값을 리스트에 담기
		}
		
		rs.close();
		st.close();
		con.close();
		
		return list; //테이블에서 추출한 값이 담긴 리스트
	}
}
  • rs.next()를 통해 테이블의 첫줄부터 탐색

  • 해당 컬럼명의 데이터를 담기

  • 담은 데이터를 member의 인스턴스에 담기

  • member 인스턴스에 담긴 것을 list에 담기


이번엔 테이블에 데이터를 입력하는 로직을 구성해보자.

public void insert(member member) throws ClassNotFoundException, SQLException {
		String id = member.getId();
		String pwd = member.getPwd();
		String name = member.getName();
		//테이블 값을 꽂아넣을 변수 준비
		
		String sql = "INSERT INTO member ("
				+ "    id,"
				+ "    pwd,"
				+ "    name "
				+ ") VALUES (?,?,?)";
		
		Class.forName(driver);
		Connection con = DriverManager.getConnection(url, uid, upwd);
		PreparedStatement st = con.prepareStatement(sql);
		//쿼리에다가 데이터를 입력하는 거기때문에 굳이 객체에 담을 필요가 없어서 Preparedstatement 단계에서 sql구문 실행
		
		st.setString(1, id);
		st.setString(2, pwd);
		st.setString(3, name);
		//sql 구문에 꽂아넣기
		
		st.close();
		con.close();	
	} 
  • (가정)사용자가 member에 데이터를 입력
  • 사용자가 입력한 데이터를 받아오기 위해 member에서 get해옴
  • 받아온 데이터를 각 순서에 맞기 꽂아넣기

그 다음은 수정하는 로직을 구성해보자.

	public void update(member member) throws ClassNotFoundException, SQLException {
		String id = member.getId();
		String pwd = member.getPwd();
		String name = member.getName();
		int uniquenumber = member.getUniquenumber(); // 수정해야하는 컬럼을 선택하기 위한 넘버
		
		
		
		String sql = "UPDATE MEMBER "
				+ " SET"
				+ "    ID=?,"
				+ "    PWD=?, "
				+ " NAME=?"
				+ "WHERE UNIQUENUMBER=?";
		
		Class.forName(driver);
		Connection con = DriverManager.getConnection(url, uid, upwd);
		PreparedStatement st = con.prepareStatement(sql);
	    
	    st.setString(1,  id);
	    st.setString(2, pwd);
	    st.setString(3, name);
	    st.setInt(4, uniquenumber);
			
		st.close();
		con.close();
			
	}

insert와 비슷한 구조


다음은 삭제하는 로직을 구성해보자

public void delete(int uniquenumber) throws ClassNotFoundException, SQLException {
		String sql = "DELETE MEMBER WHERE UNIQUENUMBER=?";
		
		Class.forName(driver);
		Connection con = DriverManager.getConnection(url, uid, upwd);
		PreparedStatement st = con.prepareStatement(sql);
	
		st.setInt(1, uniquenumber);
        
		st.close();
		con.close();
		
	}

앞에 있는 로직과 다를게 없지만 이 로직에서는 컬럼의 위치만 알면 되므로 시퀀스 넘버인 uniquenumber을 받아 처리한다.


테이블을 조작할 수 있는 crud의 로직을 구성했으니 이번에는 조작한 데이터를 콘솔창에 출력하는 로직을 구성해보자.

public class membermain {

	public static void main(String[] args) throws ClassNotFoundException, SQLException {
		MemberConsole mc = new MemberConsole();
		mc.printMemberList(); // 콘솔창에 출력해주는 로직
	}

}

아직 구현하지 않았지만 MemberConsole의 인스턴스를 생성하여 그 안의 메서드 printList()를 통해 콘솔창에 출력하려고 한다. 그렇다면 MemberConsole의 클래스를 만들어보자.


public class MemberConsole {
	
	private memberservice ms; 
	
	public MemberConsole() {
		ms = new memberservice();
		
	}
	
	public void printMemberList() throws ClassNotFoundException, SQLException {
		List<member> list = ms.getMember();
		// memberservice.getMember에서 아웃풋된 리스트
		
		System.out.println("-----------------------------------------------");
		list.forEach(m -> System.out.printf
        ("ID: %s, PWD: %s, NAME: %s\n", m.getId(), m.getPwd(), m.getName()));
        //list에 담긴 member형태의 데이터를 첫번째부터 하나하나 꺼내오기
		System.out.println("-----------------------------------------------");
	}
}
  • memberservice의 클래스를 사용해야 하므로 기본 생성자에 ms의 인스턴스를 생성한다.
  • getMember()메서드를 호출해 리스트를 가져오고, 새로운 리스트를 선언하여 담아줌.
  • foreach을 사용하여 값의 처음부터 끝까지 출력함.

이렇게 membermain안에 있는 printList()를 만들었다.

public class membermain {

	public static void main(String[] args) throws ClassNotFoundException, SQLException {
		MemberConsole mc = new MemberConsole();
		mc.printMemberList();
	}

}
//출력결과
-----------------------------------------------
ID: bmm522, PWD: 1234, NAME: 김지인
ID: rlawldls11, PWD: 4567, NAME: 김성필
ID: rerere, PWD: 244443, NAME: 로버트
ID: SASD, PWD: 1234, NAME: ㅇㄻㄴ
ID: asdfsdf, PWD: 1234, NAME: 홍록기
ID: asdad, PWD: 1244, NAME: 강동원
-----------------------------------------------
//임의로 만든 데이터

이렇게 콘솔창에 데이터를 뽑는 작업을 했다. 다음에는 여기서 기능을 하나하나 추가하면서 기능을 구현해볼것이다.

profile
에러가 세상에서 제일 좋아

0개의 댓글