본문 바로가기

SQL

JDBC_JAVA와 ORACLE 연결하기

 

 

 

-- ORACLE // JAVA에서 입력받아올 정보들을 작성해놓기

CREATE TABLE MEMBER (
    USERNO NUMBER PRIMARY KEY,
    USERID VARCHAR2(15) UNIQUE NOT NULL,
    USERPWD VARCHAR2(20) NOT NULL,
    USERNAME VARCHAR2(20) NOT NULL,
    GENDER CHAR(1) CHECK(GENDER IN ('M', 'F')),
    AGE NUMBER,
    EMAIL VARCHAR2(30),
    PHONE CHAR(11),
    ADDRESS VARCHAR2(100),
    HOBBY VARCHAR2(50),
    ENROLLDATE DATE DEFAULT SYSDATE NOT NULL
);

CREATE SEQUENCE SEQ_USERNO
NOCACHE;

INSERT INTO MEMBER VALUES(SEQ_USERNO.NEXTVAL, 'admin', '1234','관리자','M',45,'admin@naver.com', '01012345678','서울','등산', SYSDATE);
COMMIT;

SELECT * FROM MEMBER;

 

 

더보기

VO(Value Object)
=> DB테이블의 한 행에 대한 데이터를 기록하기 위한 저장용 객체

> 유사용어
DTO(Data Transfer Object)
DO(Domain Object)
Entity(jpa에서 사용)
bean(스프링에서 사용)

VO 조건
1) 반드시 캡슐화 적용
2) 기본생성자 및 매개변수 생성자를 작성해야 한다
3) 모든 필드에 대해 getter메서드를 작성해야 한다.(setter는 필수 아님)

public class Member {
	// 필드부 : DB테이블의 칼럼 정보와 유사하게 필드를 작성

//	CREATE TABLE MEMBER (
//		    USERNO NUMBER PRIMARY KEY,
	private int userNo;

//		    USERID VARCHAR2(15) UNIQUE NOT NULL,
	private String userId;

//		    USERPWD VARCHAR2(20) NOT NULL,
	private String userPwd;

//		    USERNAME VARCHAR2(20) NOT NULL,
	private String userName;

//		    GENDER CHAR(1) CHECK(GENDER IN ('M', 'F')),
	private String gender;

//		    AGE NUMBER,
	private int age;

//		    EMAIL VARCHAR2(30),
	private String email;

//		    PHONE CHAR(11),
	private String phone;

//		    ADDRESS VARCHAR2(100),
	private String address;

//		    HOBBY VARCHAR2(50),
	private String hobby;

//		    ENROLLDATE DATE DEFAULT SYSDATE NOT NULL
	private Date enrollDate;	// java.sql로 임포트해야함
//		);



	public Member() {
	}
    
    
    // 회원 추가용 생성자 => userNo, enrollDate 빼고 모든 필드를 초기화
	public Member(String userId, String userPwd, String userName, String gender, 
    		int age, String email, String phone, String address, String hobby) {
        
		super();
		this.userId = userId;
		this.userPwd = userPwd;
		this.userName = userName;
		this.gender = gender;
		this.age = age;
		this.email = email;
		this.phone = phone;
		this.address = address;
		this.hobby = hobby;
	}
    
    
    // 모든 매개변수 생성자 / getter/setter/toSting 생략.. //

 

 

* View 
	사용자가 보게될 시각적인 요소를 담당(화면 => 입,출력)
			

public class MemberView {
	// 전역으로 쓸 수 있는 Scanner 객체 생성
	private Scanner sc = new Scanner(System.in); 
	
	// MemberController 객체 생성
	private MemberController mc = new MemberController();
	
	
	/**
	 * 사용자가 보게될 화면(메인화면) alt+shift+j
	 */
	public void mainmenu() {
		
		while(true) {
			System.out.println("***** 회원 관리 프로그램 *****");
			System.out.println("1. 회원 추가");
			System.out.println("2. 회원 전체 조회");
			System.out.println("4. 회원 이름 키워드 검색");
			System.out.println("5. 회원 정보 변경");
			System.out.println("6. 회원 탈퇴");
			System.out.println("0. 프로그램 종료");
			System.out.print("이용할 메뉴 선택 : ");
			int menu = Integer.parseInt(sc.nextLine());
			
			switch(menu) {
			case 1: insertMember(); break;
			case 2:
			case 3:
			case 4:
			case 5:
			case 6:
			case 0: System.out.println("프로그램을 종료합니다."); return;
			default : System.out.println("잘못 선택 했습니다."); 
			}
		}
	}


	/**
	 * 회원 추가용 화면
	 * 추가하고자 하는 회원의 정보를 입력받아서 회원 추가요청 할 수 있는 화면
	 */
	private void insertMember() {
		
		System.out.println("----- 회원 추가 -----");
		
		// 입력 유도문
		System.out.print("아이디 : ");
		String userId = sc.nextLine();
		
		System.out.print("비밀번호 : ");
		String userPwd = sc.nextLine();
		
		System.out.print("이름 : ");
		String userName = sc.nextLine();
		
		System.out.print("성별(M/F) : ");
		String gender = sc.nextLine();
		
		System.out.print("age : ");
		int age = Integer.parseInt(sc.nextLine());
		
		System.out.print("이메일 : ");
		String email = sc.nextLine();
		
		System.out.print("핸드폰번호 : ");
		String phone = sc.nextLine();
		
		System.out.print("주소 : ");
		String address = sc.nextLine();
		
		System.out.print("취미(,로 공백없이 나열) : ");	// ex)운동,게임,영화..
		String hobby = sc.nextLine();
		
		
		// 입력받은 정보를 가지고 Controller에 회원 추가요청 보내기
		mc.insertMember(userId, userPwd, userName, gender, age, email, phone, address, hobby);
			
	}
}

 

 

* Controller : View를 통해서 들어온 요청을 담당
		해당 메서드로 전달된 데이터들을 가공처리 한 후 Dao메서드 호출시 전달한다.
		Dao로부터 반환받은 결과에 따라 사용자가 보게될 화면을 지정한다.


public class MemberController {	
	/**
	 * 사용자의 회원 추가요청을 처리해주는 메서드
	 * @param userId
	 * @param userPwd
	 * @param userName
	 * @param gender
	 * @param age
	 * @param email
	 * @param phone
	 * @param address
	 * @param hobby
	 */
	public void insertMember(String userId, String userPwd, String userName, String gender,
			int age, String email, String phone, String address, String hobby) {
		
		
		// 1. 전달받은 데이터들을 가지고 가공처리하기 => Member 객체로 변환
		Member m = new Member(userId, userPwd, userName, gender, age, email, phone, address, hobby);
		
		// 2. dao의 insertMember 메서드 호출
		int result = new MemberDao().insertMember(m);
		
		
		// 3. 결과값이 1인 경우 성공, 0인 경우 실패
		if(result > 0) {
			// 성공
			System.out.println("회원 추가 성공");
		}else { // 실패
			System.out.println("회원 추가 실패");
		}
	}

 

 

 

더보기

* JDBC용 객체
Connection : DB에 연결 정보를 담고 있는 객체(IP주소, PORT번호, 계정명, 비밀번호)
- (Prepared)Statement : 해당 DB에 SQL문을 전달하고 실행한 후 결과를 받아내는 객체
ResultSet : 내가 실행한 SQL문이 SELECT문일 경우 조회된 결과를 담아주는 객체


* JDBC 처리순서
1) JDBC Driver 등록 : DBMS가 제공하는 클래스 등록
2) Connection 생성 : 접속하고자 하는 DB정보를 입력해서 DB에 접속(접속시 Connection생성)
3) Statement 생성 : Connection 객체를 이용해서 생성
4) SQL문을 전달하면서 쿼리문 실행 : Statement객체를 이용해서 SQL문 실행
> SELECT문일 경우 -> executeQuery() 메서드를 이용해서 실행
> 나머지 DML문일 경우 -> executeUpdate() 메서드를 이용해서 실행
5) 결과 반환
> SELECT문일 경우 -> 결과값은 ResultSet 객체로 받기(조회된 데이터들이 담겨 있음)
> 나머지 DML문일 경우 -> int형 변수로 받기(처리된 행의 갯수가 담겨있음)
6) ResultSet객체에 담긴 데이터들을 하나씩 추출하여 VO객체로 변환
or 트랜잭션 처리(SELECT가 아닌 DML문일 경우)
7) 다 쓴 JDBC용 객체 자원 반납(생성된 순서의 역순으로)
8) 결과를 Controller에 반환

 

** Statement : 완성된 SQL문을 실행할 수 있는 객체

 

* DAO(Date Access Object)
	Controller에게 요청받은 실질적인 기능을 수행하기 위해서 DB에 직접 접근 후
	SQL문을 실행하고 결과 값 돌려받음

public class MemberDao {
/**
	 * 사용자가 회원 추가 요청시 입력했던 값을 가지고 insert문을 실행하는 메서드
	 * @param m : 사용자가 입력했던 아이디~취미까지의 값이 담겨있는 Member객체
	 * @return : insert문으로 실행한 결과 처리된 행의 갯수
	 */
	public int insertMember(Member m) {
		// INSERT문, 처리된 행의 갯수, 트랜잭션처리
		
		// 0) 필요한 변수들 셋팅
		int result = 0;		// 처리된 결과를 담아줄 변수(처리된 행의 갯수)
		Connection conn = null;		// 접속된 DB의 연결정보를 담는 변수
		Statement stmt = null;		// SQL문 실행 후 결과를 받기 위한 변수
		
		// 실행할 SQL문 필요(주의점 : 끝에 세미콜론이 있으면 안됨!!)
		String sql = "INSERT INTO MEMBER VALUES("
				+ "SEQ_USERNO.NEXTVAL, "
				+ "'" +m.getUserId() + "',"
				+ "'" +m.getUserPwd() + "',"
				+ "'" +m.getUserName() + "',"
				+ "'" +m.getGender() + "',"
				+ "'" +m.getAge() + "',"
				+ "'" +m.getEmail() + "',"
				+ "'" +m.getPhone() + "',"
				+ "'" +m.getAddress() + "',"
				+ "'" +m.getHobby() + "',"
				+ "DEFAULT"
				+ ")";
		
		
		// 1) JDBC드라이버 등록
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			// 오타 or ojdbc6.jar이 누락된 경우 에러발생할 수 있다.
			
			// 2) Connection 객체 생성
			conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe",
					"JDBC", "JDBC");
			
			// 3) Statement 객체 생성
			stmt = conn.createStatement();
			
			// 4,5) DB에 SQL문을 전달하면서 실행 후 결과 받기
			result = stmt.executeUpdate(sql);
			
			// 6) 트랜잭션 처리하기
			if(result > 0) {	
            // 1개 이상의 행이 insert됨 -> 성공적으로 행이 삽입됨 => 커밋하기
				conn.commit();   
			}else {		
            // 실패시
				conn.rollback();
			}
				
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			
            
			// 7) 다쓴 JDBC용 객체 반납 -> 생성된 순서의 역순으로 반납하기
			try {
				stmt.close();
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		// 8) 결과 반환
		return result;
	
	}

 

 

// 실행해서 ORACLE에 정보 보내기

public class Run {

	public static void main(String[] args) {

		new MemberView().mainmenu();
	}
}

 

 

더보기

입력받은 정보들이 ORACLE에 저장됨

 

 

 

 

 

 

 

 

 

 

 

'SQL' 카테고리의 다른 글

Oracle_16. TRIGGER  (0) 2023.12.08
Oracle_15. PROCEDURE, FUNCTION  (1) 2023.12.08
Oracle_14. PL/SQL  (1) 2023.12.08
Oracle_13. Object<INDEX>  (1) 2023.12.08