오늘은 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: 강동원
-----------------------------------------------
//임의로 만든 데이터
이렇게 콘솔창에 데이터를 뽑는 작업을 했다. 다음에는 여기서 기능을 하나하나 추가하면서 기능을 구현해볼것이다.