22.02.07 JAVA 상속, JDBC

최고고·2022년 2월 7일
0
post-custom-banner

상속 : 기능 확장

-부모클래스 super class
-자식클래스 sub class
-부모클래스에있는 코드와 로직을 물려받아 자식클래스에 확장시킨 것
-새로운 클래스에 클래스명 뒤에 extends 물려받을 클래스명
-부모클래스 필드에 private 을 하면 상속이 안된다.
-Object : 모든 클래스의 최고 위에 있는 부모 -> 내가 클래스에서 따로 상속을 하지 않는 한 모든 클래스는 이 클래스를 상속받음
-Java에서 동시에 두 개 이상의 클래스를 동시에 상속 받을 수 없음 단, 연속 상속은 가능 ex) A < - B <- C

  • 오버라이딩

    -부모클래스 안에 있는 메소드를 다시한번 자녀클래스에서 재구현한것
    -조건 : 부모클래스의 있는 메소드 형태가 완전 동일해야함
    -실행순서에 의해 자녀클래스의 메소드로 실행된다.
    -자동완성 : alt shift s => override implement methoids... super.method 가 나옴. 오버라이딩하려면 지우기

  • 업캐스팅 : 자식객체에서 부모타입으로 형변환할수 있다.

    -but 자식에서 새롭게 구현한 메소드는 실행안됨
    -부모타입으로 업캐스팅이 되어도 자식 클래스에서 부모클래스에서 있는 메소들을 재정의한(오버라이드) 메소드가 있다면 재정의한 메소드가 호출됨

  • 다운캐스팅 : 다시 자녀클래스로 변환할 때 강제 형변환해줘야됨


JDBC (Java Database Connectivity)

자바에서 DB에 접속하기 위해 사용되는 API
java에서 입력받은 정보들을 DB로 넘겨주기

사전에 수행되어야하는 작업 : JDBC 사용을 위해 꼭 필요한단계

프로젝트파일에서 오른쪽버튼 > Build Path > Configure Build Path > Libraries탭 > Add External Jar > c드라이브에 오라클 에서 JDBC 폴더에서 ojdbc6.jar 선택!
JDBC를 연결하고자 하는 자바 프로젝트에 ojdbc6.jar 파일 추가하기

JDBC 만들기

1. JDBC DRIVER 로딩 - 드라이브 동적 로딩 -> try/catch 진행 자바와 디비를 이어주는 통로
-ojdbc6.jar 추가 (위에 사전 수행작업으로 설명)
-class.forName() 메소드 사용
2. DB 접근하기위한 로그인 정보 전송하기
-Connection 생성
3. db에 sql문 전송
-PreparedStatement 생성
executeUpdate (); 테이블의 값이 바뀌는 경우. 삽입(insert), 삭제, 수정 ---> 데이터 변동이있을때
executeQuery(); 테이블에 영향이 없을 때. 조회할때.
-반환값이 ResultSet이라는 테이블 형태로 돌아옴

4. 연결종료
-finally라는 키워드로 객체가 열린 순서의 역순으로 다시 닫아주기
finally는 에러가 나도 무조건 실행되어야하는 구문
try문 안에 있는 객체가 지역변수이기 때문에 전부 다 바깥으로 빼주기-> 레퍼런스변수는 초기값으로 null을 부여해주자
-try/catch 문 종료된 마지막에 ! 객체 닫아주기

회원가입시스템 JDBC

//1. 드라이브 동적 로딩 -> try/catch 진행  자바와 디비를 이어주는 통로
try {
	Class.forName("oracle.jdbc.driver.OracleDriver"); 
 // 이 경로를 통해 sql문을 전송시키겠다
 
 
//2. DB 접근하기위한 로그인 정보 전송하기
	String url = "jdbc:oracle:thin:@localhost:1521:xe"; 
// 주소 쉽게 따올수있어서 외우지말기
	String db_id = "hr";
	String db_pw = "hr";
	Connection conn = DriverManager.getConnection(url, db_id, db_pw);//자바와  db를 연결해주는 객체생성 java.sql로 import --->오류 발생 ~~surrounding try클릭해주기
		if (conn != null) {
		System.out.println("데이터베이스 연결 성공!");
		}

// 3.db에 sql문 전송/ 전송 전 DB에서 테이블 먼저 생성해야됨
	String sql = "insert into memberInfo values(?, ?, ?, ?)"; // 데이터가 들어갈내용, values 개수 테이블컬럼개수와 같아야됨
	PreparedStatement psmt = conn.prepareStatement(sql); // 자바와 db 정보 전달자 생성하기
	psmt.setString(1, id); //(인덱스번호-?의 개수와 순서에 맞춰야한다, ?자리에 입력할 값) 값은 스캐너로 입력받음
	psmt.setString(2, pw);
	psmt.setString(3, name);
	psmt.setInt(4, age);
    //사용자가 입력한 내용들 sql문에 연결해주기
    
					
// 자바에서는 오라클에서 ;과 엔터처럼 실행을 나타내는 실행 명령을 줘야됨
	int cnt = psmt.executeUpdate(); // sql문을 실제로 실행시키기 위한 명령
		if (cnt > 0) {
			System.out.println("회원가입 성공!");
		}
        //4.사용된 객체들 연결 종료하기
		if(psmt != null) { //한번이라도 실행이됐더라면
			psmt.close();	
		}if(conn != null) {
		conn.close();
		}
}

catch (ClassNotFoundException e) {
	// class.forName()에 관한 catch문
		System.out.println("드라이버오류");
		e.printStackTrace(); //오류발생시 캐치
} 
catch (SQLException e) {
	// getConnection()에 관한 catch문
			System.out.println("DB 로그인 오류");
			e.printStackTrace();
}


셀렉트문으로 조회해 입력받은 값을 DB에서 가져오기 예제

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;

public class Ex_Select {

	public static void main(String[] args) {
		// 전역변수로 쓰기위해
		ResultSet rs = null;
        // 반환값은 ResultSet으로 돌아옴-테이블 형태로
		PreparedStatement psmt = null;
		Connection conn = null;
		//레퍼런스형 기본 초기값 : null

		Scanner sc = new Scanner(System.in);
		System.out.print("아이디 : ");
		String search_id = sc.next();
		System.out.print("비밀번호  : ");
		String search_pw = sc.next();

// 1.드라이버 로딩

		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");

// 2 DB 연결 url, id, pw 작성
// 심부름꾼 conn 객체 생성, conn활용해 정보 넘기기 (DriverManager -> getConnection

			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String db_id = "hr";
			String db_pw = "hr";
			conn = DriverManager.getConnection(url, db_id, db_pw);

			// 3.sql문 작성 memberInfo테이블에 있는 조건에 맞는 정보 출력하기


			String sql = "select * from memberInfo where id=? and pw=?";
			psmt = conn.prepareStatement(sql);

			psmt.setString(1, search_id);
			psmt.setString(2, search_pw);

		rs = psmt.executeQuery(); 
        
		while (rs.next()) {
			String id = rs.getString(1);
			String pw = rs.getString(2);
			String name = rs.getString(3);
			int age = rs.getInt(4);

			System.out.println(id + "/" + pw + "/" + name + "/" + age);
			}

		} catch (ClassNotFoundException e) {
			System.out.println("드라이버 로딩 오류");
			e.printStackTrace();
		} catch (SQLException e) {
			System.out.println("DB오류");
			e.printStackTrace();
		}

		// try/catch문 이후 마지막에 한번 객체 닫아주기
		// 4.연결 종료
		finally { 
			try {
				if (rs != null) {
				rs.close();
				}if(psmt != null) {
					psmt.close();
				}if(conn != null) {
					conn.close();
					}	
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

		
	}

}
post-custom-banner

0개의 댓글