💻 수업정리 (2020)/오라클

[6/29]JDBC연동 ( + 리플랙션에 대해서 알아두기)

주다람 2020. 6. 29. 16:54

JDBC(JAVA DATABASE CONNECTIVITY)

  • 자바를 이용해서 데이터베이스를 접속하는 프로그램

*자바에서는 인스턴스를 만드는 방법은 다양하다.

*제어의 역행 : 객체를 생성할 때 개발자가 직접 코드로 생성해주는 것이 아닌 컨테이너가 처리해줌으로써 더욱 간단하게 객체를 생성 할 수 있게 된다.

 

📌JDBC연동

1. OravleDriver 클래스를 인스턴스로 생성하여 JDBC드라이버로 등록

  • JDBC 드라이버 : DriverManager클래스에 등록된 Driver인스턴스로 DBMS서버의 URL주소를 이용하여 접속할 수 있는 인스턴스
  • DriverManager클래스jdbc드라이버를 관리하기 위한 기능을 제공하는 클래스
  • Class.forName("oracle.jdbc.driver.OracleDriver");
  • => OracleDriver클래스를 읽어 메모리에 저장한다. 내부적으로 OracleDriver인스턴스를 생성하여 JDBC드라이브로 등록

[비권장]

  • OracleDriver클래스로 인스턴스를 생성 : OracleDriver driver = new OracleDriver();
  • OracleDriver인스턴스를 JDBC드라이버로 등록 : DriverManager.registerDriver(driver);

 

2. JDBC드라이버를 이용하여 DBMS서버에 접속

DriverManager.getConnection(String url,String user,String password) 
  • DBMS 서버에 접속하는 메소드 : Connection 인스턴스 반환
  • 전달된 URL 정보에 따라 다른 DBMS 서버 접속 
  •  SQLException 발생 : JDBC 관련 인스턴스의 메소드에서 발생되는 예외

 

3.SQL명령을 전달하기 위한 인스턴스를 반환받아 저장

  • Connection.createStatement() : Statement 인스턴스를 반환하는 메소드
  • Statement : sql 명령을 접속된 서버에 전달하기 위한 기능을 제공하는 메소드
  • URL : 인터넷에 존재하는 자원을 표현하는 방법 => Protocol:ServerName:Port:Resource
  • Oracle DBMS Server의 JDBC URL
  • 형식 ) jdbc:oracle:thin:@ServerName:Port:SID
String url="jdbc:oracle:thin:@localhost:1521:xe";
String user="scott";
String password="tiger";
  • Connection : DBMS 서버의 접속정보를 저장하기 위한 인스턴스 
  • Connection 인터페이스를 부모로 하는 자식 클래스로 인스턴스 제공
  • con=DriverManager.getConnection(url, user, password);

4.Statement인스턴스로 SQl명령을 전달하고 실행된 결과값을 반환받아 저장

  • Statement.executeUpdate(String sql) : sql명령(Insert,delete,update)을 서버에 전달하는 메소드  => 조작된 행의 갯수를 반환
  • Statement.executeQuery() : sql명령(select)을 서버에 전달하는 메소드 => 검색된 행을 반환

5.sql명령의 실행결과를 출력

6. JDBC관련인스턴스 제거 - close 메소드 호출

  • 인스턴스 생성 순서의 반대로 제거해야 한다.
  •  if구문을 이용하여 널포인트 익셉션을 방지한다.
try {
	//=> if구문을 이용하여 널포인트 익셉션을 방지한다.
	if(stmt != null) stmt.close(); //얘를 먼저 제거를 해야 con이 삭제가된다. 결과를 먼저 삭제를 해야 con이 삭제되므로
	if(con != null) con.close();
	//con이 생성되는 도중에 ?>오류가 발생하면 stmt가 생성되지 않은 상태로 finally로 오기 때문에 nullpointer예외가 발생하므로 조건문을 꼭 이용하낟.
} catch (SQLException e) {
		// TODO Auto-generated catch block
}

 

[excuteUpdate]

import java.sql.Connection;
import java.sql.Date;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class SelectStudentApp {
	public static void main(String[] args) {
		Connection con = null;
		Statement stmt = null;
		ResultSet rs = null;

		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "scott";
			String password = "tiger";
			con = DriverManager.getConnection(url,user, password);
			stmt = con.createStatement();

			String sql = "select * from student order by no";
			// statement.execute(sql) : select 명령을 전달하여 실행하는 메소드
			// =>select 명령에 의해 검색된 행을 ResultSet 인스턴스에 저장하여 반환
			rs = stmt.executeQuery(sql);

			// ResultSet인스턴스에 저장된 검색행을 행단위로 처리하기 위해 커서를 제공
			// => resultSet커서라고 통칭
			// => 초기에는 ResultSet커서가 BOF(before of file)<-> EOF 영역에 위치
			// 커서를 밑으로 내려야함
			// ResultSet.next() : ResultSet커서를 다음행으로 이동하는 메소드 = boolean반환
			// ==> false반환, true반환
			// 1) false반환 : 커서 위치에 행이 존재하지 않을 경우 = EOF영역에 위치한 경우
			// 2) true 반환 : 커서 위치에 행이 존재하는 경우
			if (rs.next()) {
				do {// true라면(다중행을 모두 출력하려면 반복문을 사용해야한다.)
					// System.out.println("[메세지] 검색된 학생정보가 존재합니다.");
					// 커서가 위치한 처리행의 컬럼값을 반환받아 저장
					// ResultSet.getXXX(int columnIndex)
					// ==> XXX는 컬럼값을 반환받기 위한 JAVA자료형으로 표현
					// ==>columnIndex : 검색대상에 대한 위치값(유지보수때문에 잘 쓰지 않음)
					// ==>columnName : 검색대상에 컬럼명(별칭)

					// int no = rs.getInt(1);
					int no = rs.getInt("NO");// 대소문자 구별x
					// String name = rs.getString(2);
					String name = rs.getString("NAME");
					// String phone = rs.getString(3);
					String phone = rs.getString("PHONE");
					// String address = rs.getString(4);
					String address = rs.getString("ADDRESS");
					// String birth = rs.getString(5);
					Date birthday = rs.getDate("BIRTHDAY");// 날짜정보는 date로 받아올 수 있다.

					System.out.println(no + " ," + name + " ," + phone + " ," + address + " ," + birthday);

				} while (rs.next());//조건문으로 시작하지 않는다면 그냥 while문을 사용하면 된다.
				
			} else {
				System.out.println("[메세지] 검색된 학생정보가 없습니다.");
			}

		} catch (ClassNotFoundException e) {
			System.out.println("클래스를 찾지 못했습니다.");
		} catch (SQLException e) {
			System.out.println("jdbc관련오류" + e.getMessage());
		}finally {
			try {
				if(rs != null) rs.close();// 3) rs를 먼저 삭제해야한다.
				if(stmt != null) stmt.close();// 2) stmt는 rs를 만드니까
				if(con != null) stmt.close();// 1) con은 stmt를 만들고
			} catch (Exception e2) {
				// TODO: handle exception
			}
		}
	}
}

 

[excuteQuery]

import java.sql.Connection;
import java.sql.Date;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class SelectStudentApp {
	public static void main(String[] args) {
		Connection con = null;
		Statement stmt = null;
		ResultSet rs = null;

		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "scott";
			String password = "tiger";
			con = DriverManager.getConnection(url);
			stmt = con.createStatement();

			String sql = "select * from student order by no";
			// statement.execute(sql) : select 명령을 전달하여 실행하는 메소드
			// =>select 명령에 의해 검색된 행을 ResultSet 인스턴스에 저장하여 반환
			rs = stmt.executeQuery(sql);

			// ResultSet인스턴스에 저장된 검색행을 행단위로 처리하기 위해 커서를 제공
			// => resultSet커서라고 통칭
			// => 초기에는 ResultSet커서가 BOF(before of file)<-> EOF 영역에 위치
			// 커서를 밑으로 내려야함
			// ResultSet.next() : ResultSet커서를 다음행으로 이동하는 메소드 = boolean반환
			// ==> false반환, true반환
			// 1) false반환 : 커서 위치에 행이 존재하지 않을 경우 = EOF영역에 위치한 경우
			// 2) true 반환 : 커서 위치에 행이 존재하는 경우
			if (rs.next()) {
				do {// true라면(다중행을 모두 출력하려면 반복문을 사용해야한다.)
					// System.out.println("[메세지] 검색된 학생정보가 존재합니다.");
					// 커서가 위치한 처리행의 컬럼값을 반환받아 저장
					// ResultSet.getXXX(int columnIndex)
					// ==> XXX는 컬럼값을 반환받기 위한 JAVA자료형으로 표현
					// ==>columnIndex : 검색대상에 대한 위치값(유지보수때문에 잘 쓰지 않음)
					// ==>columnName : 검색대상에 컬럼명(별칭)

					// int no = rs.getInt(1);
					int no = rs.getInt("no");// 대소문자 구별x
					// String name = rs.getString(2);
					String name = rs.getString("name");
					// String phone = rs.getString(3);
					String phone = rs.getString("phone");
					// String address = rs.getString(4);
					String address = rs.getString("address");
					// String birth = rs.getString(5);
                    
					//Date birthday = rs.getDate("BIRTHDAY");// 날짜정보는 date로 받아올 수 있다.
					//System.out.println(no + " ," + name + " ," + phone + " ," + address + " ," + birthday);
					
                    String birthday = rs.getString("BIRHDAY");// 날짜정보를 String으로 받을때 subString을 이용해서 짤라내서 사용가능
					System.out.println(no + " ," + name + " ," + phone + " ," + address + " ," + birthday.substring(0,10));
                    
				} while (rs.next());//조건문으로 시작하지 않는다면 그냥 while문을 사용하면 된다.
				
			} else {
				System.out.println("[메세지] 검색된 학생정보가 없습니다.");
			}

		} catch (ClassNotFoundException e) {
			System.out.println("클래스를 찾지 못했습니다.");
		} catch (SQLException e) {
			System.out.println("jdbc관련오류" + e.getMessage());
		}finally {
			try {
				if(rs != null) rs.close();// 3) rs를 먼저 삭제해야한다.
				if(stmt != null) stmt.close();// 2) stmt는 rs를 만드니까
				if(con != null) stmt.close();// 1) con은 stmt를 만들고
			} catch (Exception e2) {
				// TODO: handle exception
			}
		}
	}
}

 

📌리플렉션

  • 클래스를 직접 메모리에 저장하여 인스턴스를 생성하는 방법