본문 바로가기
JAVA

day19) JDBC를 이용한 DB연동2 - CRUD구현

by code_learner 2022. 1. 22.

[executeUpdate vs executeQuery]

1. executeQuery

리턴값: ResultSet 객체(query문의 결과값을 그대로 가져온다)

사용처: 결과값을 출력할 필요가 있는 Select문에서 주로 사용된다.

 

2. executeupdate

리턴값: sql이 적용된 '갯수'인 int가 리턴된다.

사용처: 결과값을 출력할 필요가 없고, 쿼리문이 적용 되었는지 여부의 정보만 필요한 Create, Update, Delete문에서 주로사용된다 

 

 


 

[예제]

- v와 컨트롤러를 분리하지 않고 모델만 분리한다. 

- VO클래스를 만들어 DB값을 객체화시키는 작업을 한다.

- DAO클래스를 만들어 각각의 비지니스 메서드를 생성한다.

   -> 각각의 비지니스 메서드를 만들때마다 DB에 연결하는 코드를 작성하면 유지보수성이 떨어지기 때문에

   ->JDBCUtil클래스를 생성하여 DB연결을 담당시킨다

- member 테이블을 생성해 db에 회원정보를 저장한다.

 

 

1. test.sql

create table member(
	id int primary key,
	name varchar(20) not null,
	point int default 0
);

 

2. memberVO

-테이블형 데이터 --> 객체형 데이터(VO)
-컬럼들을 멤버변수로 가지고 있어야한다.

package model;

public class MemberVO {
	private int id;
	private String name;
	private int point;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getPoint() {
		return point;
	}
	public void setPoint(int point) {
		this.point = point;
	}
	@Override
	public String toString() {
		return "["+id+"] "+name+"님 "+point+"점";
	}
}

 

3. JDBCUtil

-공통된 로직을 따로 관리하기 위해 생성한 Util클래스

-객체와 무관하게 사용할 예정이므로 모든 필드에 static을 붙인다.

package model;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBCUtil {

	   static final String driverName="oracle.jdbc.driver.OracleDriver";
	   static final String url="jdbc:oracle:thin:@localhost:1521:xe";
	   static final String user="kim";
	   static final String passwd="1234";
	   public static Connection connect() { // DB에 연결을 한다. == Connection을 확보한다.
	      Connection conn=null;
	      try {
	         Class.forName(driverName);
	         conn=DriverManager.getConnection(url, user, passwd);
	      } catch (Exception e) {
	         // TODO Auto-generated catch block
	         e.printStackTrace();
	      }      
	      return conn;
	   }
	   public static void disconnect(Statement stmt,Connection conn) {//stmt,conn객체를 받아와서 close()처리
	      try {
	         stmt.close();
	         conn.close();
	      } catch (SQLException e) {
	         // TODO Auto-generated catch block
	         e.printStackTrace();
	      }
	   }
}

 

4. MemberDAO

-모든 비지니스 메서드는 메서드시그니처가 바뀌는 상황이 오는것을 방지해야하기 때문에 input값으로 MemberVO를 받는다.

package model;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

public class MemberDAO {

	Connection conn;
	Statement stmt;

	final String insert="insert into member(id,name,point) values((select nvl(max(id),0)+1 from member), ";//pk처리
	final String selectOne="select * from member where id=";
	final String update="update member set point=point+"; 
	final String delete="delete from member where id=";
	final String selectAll="select * from member where name like '%";!

	public boolean insert(MemberVO vo) {//멤버추가
		conn=JDBCUtil.connect();
		try {
			stmt=conn.createStatement();
			stmt.executeUpdate(insert+"'"+vo.getName()+"', "+vo.getPoint()+")");
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return false;
		} finally {
			JDBCUtil.disconnect(stmt, conn);
		}
		return true;
		
	}
	public boolean update(MemberVO vo) {//멤버 포인트 업데이트
		conn=JDBCUtil.connect();
		try {
			stmt=conn.createStatement();
			stmt.executeUpdate(update+vo.getPoint()+ "where id="+vo.getId());
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			return false;
		}finally {
			JDBCUtil.disconnect(stmt, conn);
		}
		return true;
	}
	public boolean delete(MemberVO vo) {//멤버삭제
		conn=JDBCUtil.connect();
		try {
			stmt=conn.createStatement();
			stmt.executeUpdate(delete+vo.getId());
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			return false;
		}finally {
			JDBCUtil.disconnect(stmt, conn);
		}
		return true;
	}
	public MemberVO selectOne(MemberVO vo) {//멤버한명 검색
		conn=JDBCUtil.connect();
		MemberVO data = null;
		try {
			stmt=conn.createStatement();
			
			ResultSet rs=stmt.executeQuery(selectOne+vo.getId());
			if(rs.next()) {
				data = new MemberVO();
				data.setName(rs.getString("name"));
				data.setId(rs.getInt("id"));
				data.setPoint(rs.getInt("point"));
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
		}finally {
			JDBCUtil.disconnect(stmt, conn);
		}
		return data;
	}
	public ArrayList<MemberVO> selectAll(MemberVO vo){//멤버 이름 검색
		conn=JDBCUtil.connect();
		ArrayList<MemberVO> datas = new ArrayList<MemberVO>();
		
		try {
			stmt=conn.createStatement();
			ResultSet rs=stmt.executeQuery(selectAll+vo.getName()+"%'");
			while(rs.next()) {
				MemberVO data = new MemberVO();
				data.setId(rs.getInt("id"));
				data.setName(rs.getString("name"));
				data.setPoint(rs.getInt("point"));
				datas.add(data);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			JDBCUtil.disconnect(stmt, conn);
		}
		return datas;
	}

}

 

5. Test01(view, controller)

package app;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.Scanner;

import model.MemberDAO;
import model.MemberVO;

public class Test01 {

	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int act;
		while(true) {
			System.out.println("1. 가입");
			System.out.println("2. 검색");
			System.out.println("3. 회원1명출력");
			System.out.println("4. 포인트추가");
			System.out.println("5. 탈퇴");
			System.out.println("6. 프로그램 종료");
			System.out.print(">>> ");
			act=sc.nextInt();
			if(act==1) {//1. 가입
				System.out.println("===1.학생추가===");
				System.out.print("이름>>>");
				String name = sc.next();
				System.out.print("포인트 입력>>");
				int point = sc.nextInt();
				
				MemberVO vo = new MemberVO();
				vo.setName(name);
				vo.setPoint(point);
				
				MemberDAO dao = new MemberDAO();
				boolean res=dao.insert(vo);
				if(res) {
					System.out.println("로그: "+vo.getName()+"추가완료");
				}
				
			}
			else if(act==2) {//2.검색
				System.out.println("===2. 멤버검색===");
				System.out.print("멤버이름 검색");
				String name = sc.next();
				
				MemberVO vo = new MemberVO();
				vo.setName(name);
				
				MemberDAO dao = new MemberDAO();
				dao.selectAll(vo);
				
				ArrayList<MemberVO> datas = dao.selectAll(vo);
				if(datas.size()==0) {
					System.out.println("로그: 해당데이터 없음!");
					continue;
				}
				Iterator itr = datas.iterator();
				while(itr.hasNext()) {
					System.out.println(itr.next());
				}
			}
			else if(act==3) {//3.회원1명출력
				System.out.println("===3. 학생 1명 검색===");
				System.out.print("멤버 아이디검색>> ");
				int id = sc.nextInt();
				
				MemberVO vo = new MemberVO();
				vo.setId(id);
				
				MemberDAO dao = new MemberDAO();
				dao.selectOne(vo);
				
				if(dao.selectOne(vo)==null) {
					System.out.println("해당 멤버가 없습니다.");
					continue;
				}else {
					System.out.println(dao.selectOne(vo));
				}
			}
			else if(act==4) {//4. 포인트추가
				System.out.println("===4. 포인트 추가===");
				System.out.print("멤버 아이디 검색>>");
				int id = sc.nextInt();
				System.out.print("추가할 포인트 입력>>");
				int point = sc.nextInt();
				
				MemberVO vo = new MemberVO();
				vo.setId(id);
				vo.setPoint(point);
				
				MemberDAO dao = new MemberDAO();
				
				
				if(dao.update(vo)) {
					System.out.println("로그: update완료");
				}else {
					System.out.println("로그: update실패");
					
				}
				
			}
			else if(act==5) {//5. 탈퇴
				System.out.println("===5. 탈퇴===");
				System.out.print("멤버 아이디 검색>>");
				int id = sc.nextInt();
				
				MemberVO vo = new MemberVO();
				vo.setId(id);
				
				MemberDAO dao = new MemberDAO();
				if(dao.delete(vo)) {
					System.out.println("로그: delete 완료");
				}
				else {
					System.out.println("로그: delete 대상없음!");
				}
			}
			else if(act==6) {//6. 프로그램 종료
				break;
			}
		}
	}

}

 

댓글