JDBC2

2 분 소요

JDBC

view

  • 사용자의 입력값을 받는 역할
private MemberController memberController = new MemberController();

  int result = memberController.insertMember(inputMember());

private Member inputMember() {
  System.out.println("새로운 회원정보 입력");
  System.out.println("--------------");
  System.out.println("아이디 : ");
  String memberId = sc.next();
  System.out.println("비밀번호 : ");
  String password = sc.next();
  System.out.println("이름 : ");
  String memberName = sc.next();
  System.out.println("나이 : ");
  int age = sc.nextInt();
  System.out.println("성별 : ");
  String gender = sc.next().toUpperCase();
  System.out.println("이메일 : ");
  String email = sc.next();
  System.out.println("전화번호 : ");
  String phone = sc.next();
  sc.nextLine();
  System.out.println("주소 : ");
  String address = sc.nextLine();
  System.out.println("취미 : ");
  String hobby = sc.nextLine();
  
  return new Member(memberId, password, memberName, gender, age, email, phone, address, hobby, null);
}

Controller

  • 프론트에서 넘어온 인자를 service 를 거쳐 dao 로 보낸 뒤 다시 값을 받아오는 역할
private MemberService memberService = new MemberService();

public int insertMember(Member inputMember) {
  return memberService.insertMember(inputMember);
}

service

  • 코드의 중복을 제거하기위해 반복되어 사용되는 코드들은 service 클래스에 묶어 사용
public int insertMember(Member member) {
  //1. Connection 생성
  Connection con = getConnection();
  
  //2. dao 요청
  int result = memberDAO.insertMember(con, member);
  
  //3. 트랜잭션 처리
  if(result > 0) {
    commit(con);
  } else {
    rollback(con);
  }
  //4. 자원반납
  close(con);
  return result;
}

DAO

  • import static 패키지.클래스.* static 키워드 사용해 클래스명을 작성하지 않아도 손쉽게 접근 가능
public int insertMember(Connection con, Member member) {
		PreparedStatement pt = null;
		int result = 0;
		String sql = "INSERT INTO MEMBER VALUES(?,?,?,?,?,?,?,?,?,default)";
		try {
			pt = con.prepareStatement(sql);
			pt.setString(1, member.getMemberId());
			pt.setString(2, member.getPassword());
			pt.setString(3, member.getMemberName());
			pt.setString(4, member.getGender());
			pt.setInt(5, member.getAge());
			pt.setString(6, member.getEmail());
			pt.setString(7, member.getPhone());
			pt.setString(8, member.getAddress());
			pt.setString(9, member.getHobby());
			
			result = pt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
      // 객체를 만들고 사용하지않았으나 import static 으로 인해 에러 발생하지않음.
			close(pt); 
		}
		return result;
	}

JDBCTemplate

  • try/catch 문의 경우 코드의 가독성을 위해 따로 빼놓고 작성하는것이 좋음.
    • 하나의 클래스로 묶어 메소드 호출 시 사용할 수 있도록 빼놓음.
  public class JDBCTemplate {
	
	public static Connection getConnection() {
		String className = "oracle.jdbc.OracleDriver";
		Connection con = null;
		String url = "jdbc:oracle:thin:@localhost:1521/xe";
		String user = "student";
		String password = "student";
		
		try {
			Class.forName(className);
			con = DriverManager.getConnection(url, user, password);
			con.setAutoCommit(false);
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		return con;
	}

	public static void commit(Connection con) {
		try {
			//널이 아니고 자원반납이 이뤄지지 않았으면 commit
			if(con != null && !con.isClosed()) {
				con.commit();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public static void rollback(Connection con) {
		try {
			if(con != null && !con.isClosed()) {
				con.rollback();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public static void close(Connection con) {
		try {
			if(con != null && !con.isClosed()) {
				con.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	public static void close(PreparedStatement pt) {
		try {
			if(pt !=null && !pt.isClosed()) {
				pt.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	public static void close(ResultSet rt) {
		try {
			if(rt !=null && !rt.isClosed()) {
				rt.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

카테고리:

업데이트: