jmaster 2021. 12. 2. 11:13

1. 정의(1)

package xyz.itwill.jdbc;

public class StaticBlock {
	//정적영역(Static Block) : ClassLoader 프로그램에 의해 클래스가 메모리에 저장된 후
	//자동으로 실행될 명령을 작성하는 영역 - 정적영역의 명령은 프로그램에서 한번만 실행
	static {
		System.out.println("### 클래스의 정적영역에 작성된 명령 실행 ###");
		
		/*
		StaticBlock sb=new StaticBlock();
		sb.display();
		*/
		new StaticBlock().display();
	}
	
	public void display() {
		System.out.println("### StaticBlock 클래스의 display() 메소드 호출 ###");
	}
}

 

2.정의(2)

package xyz.itwill.jdbc;

public class StaticBlockApp {
	public static void main(String[] args) {
		/*
		//ClassLoader 프로그램에 의해 클래스(Class 파일)을 읽어 메모리에 저장 - 자동(1번)
		//new 연산자가 메모리에 저장된 클래스(Clazz)의 생성자를 호출하여 인스턴스 생성
		// => 생성된 인스턴스를 참조변수에 저장
		StaticBlock sb=new StaticBlock();
		
		//참조변수에 저장된 인스턴스의 메소드 호출 - 기능 구현
		sb.display();
		*/
		
		/*
		try {
			//Class : 클래스 정보(Clazz)를 저장하기 위한 클래스
			//Class.forName(String className) : 문자열로 표현된 패키지를 포함한 클래스를 전달받아
			//ClassLoader 프로그램을 이용하여 클래스를 읽어 메모리에 저장하는 메소드
			// => 메모리에 저장된 클래스 정보(Class 인스턴스 - Clazz) 반환
			// => ClassNotFoundException 발생 - 예외처리
			//Class.newInstance() : 메모리에 저장된 클래스(Clazz)를 이용하여 인스턴스를 생성하는 메소드
			// => InstantiationException, IllegalAccessException 발생 - 예외처리
			// => Object 타입의 인스턴스 반환 - 명시적 객체 형변환
			//StaticBlock sb=(StaticBlock)Class.forName("xyz.itwill.jdbc.StaticBlock").newInstance();
			
			//JDK10이상에서는 Class.getDeclaredConstructor() 메소드로 생성자를 반환받아 
			//newInstance() 메소드를 호출하여 인스턴스 생성
			//리플렉션(Reflection) : 인스턴스를 직접 생성하는 사용하는 기술 
			// => 접근지정자에 상관없이 클래스 요소 접근 가능
			StaticBlock sb=(StaticBlock)Class.forName("xyz.itwill.jdbc.StaticBlock").getDeclaredConstructor().newInstance();
			sb.display();
		} catch (ClassNotFoundException e) {
			System.out.println("[에러]클래스를 찾을 수 없습니다.");
		} catch (Exception e) {
			System.out.println("[에러]실행 프로그램에 문제가 발생 하였습니다.");
		} 
		*/
		
		try {
			Class.forName("xyz.itwill.jdbc.StaticBlock");
		} catch (ClassNotFoundException e) {
			System.out.println("[에러]클래스를 찾을 수 없습니다.");
		}
	}
}

3.INSERT

package xyz.itwill.jdbc;

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

//JDBC 프로그램을 작성하기 위해 JDBC Driver 관련 클래스가 포함된 라이브러리를 프로젝트에 빌드 처리
// => Oracle JDBC Driver : ojdbc6.jar, ojdbc8.jar, ojdbc11.jar - JDK 버전 주의

//STUDENT 테이블 : 학번(숫자형-PRIMARY KEY),이름(문자형),전화번호(문자형),주소(문자형),생년월일(날짜형)
//CREATE TABLE STUDENT(NO NUMBER(4) PRIMARY KEY, NAME VARCHAR2(30), PHONE VARCHAR2(20)
//	    , ADDRESS VARCHAR2(100), BIRTHDAY DATE);

//STUDENT 테이블에 학생정보(행)을 삽입하여 저장하는 JDBC 프로그램
public class InsertStudentApp {
	public static void main(String[] args) {
		//JDBC 관련 인스턴스를 저장하기 위한 참조변수는 try 영역 외부에서 선언
		// => 모든 영역에서 참조변수를 사용하여 인스턴스 메소드 호출 가능
		Connection con=null;
		Statement stmt=null;
		try {
			//1.OracleDriver 클래스를 읽어 메모리에 저장
			// => OracleDriver 클래스의 정적영역에서 OracleDriver 인스턴스를 생성하여 DriverManager
			//    클래스에 JDBC Driver로 등록 처리
			// => DriverManager.registerDriver(new OracleDriver()) 명령이 1번만 실행
			//JDBC Driver : DriverManager 클래스에 등록된 다수의 Driver 인스턴스 
			// => Driver 인스턴스 : DBMS 서버에 접속할 수 있는 기능 제공
			// => DriverManager 클래스를 이용하여 URL 주소로 원하는 DBMS 서버 접속
			//DriverManager 클래스 : JDBC Driver를 관리하기 위한 기능을 제공하는 클래스
			// => DriverManager.registerDriver(Driver driver) : Driver 인스턴스를 DriverManager 
			//    클래스의 JDBC Driver로 등록하는 메소드
			Class.forName("oracle.jdbc.driver.OracleDriver");
			
			//2.DriverManager 클래스에 등록된 JDBC Driver를 이용하여 DBMS 서버에 접속하고
			//접속정보(Connection 인스턴스)를 반환받아 저장
			//DriverManager.getConnection(String url, String user, String password)
			// => DBMS 서버에 접속하는 메소드 - 접속 성공시 Connection 인스턴스 반환
			// => 접속 실패시 SQLException 발생 - 예외처리
			//SQLException : JDBC 관련 인스턴스의 메소드 호출시 발생되는 예외
			// => DBMS 서버 접속 오류 또는 SQL 명령에 문제가 있는 경우 예외 발생
			//URL : 인터넷에 존재하는 자원을 표현하기 위한 주소
			// => Protocol:ServerName:Port:Resource - ex) https:www.daum.net:80/index.html
			//Oracle DBMS 서버에 대한 JDBC URL
			//형식)jdbc:oracle:thin:@ServerName:Port:SID
			String url="jdbc:oracle:thin:@localhost:1521:xe";
			String user="scott";
			String password="tiger";
			con=DriverManager.getConnection(url, user, password);
			
			//3.접속된 DBMS 서버에 SQL 명령을 전달하기 위한 Statement 인스턴스를 반환받아 저장
			//Connection.createStatement() : Connection 인스턴스로부터 SQL 명령을 전달할 수
			//있는 Statement 인스턴스를 생성하여 반환하는 메소드 - SQLException 발생
			stmt=con.createStatement();
			
			//4.Statement 인스턴스로 접속된 DBMS 서버에 SQL 명령을 전달하여 실행하고 실행된
			//결과값을 반환받아 저장
			//Statement.executeUpdate(String sql) : INSERT, UPDATE, DELETE 명령을 DBMS 서버에 전달하는 메소드
			// => 조작행의 갯수(int)를 반환 - SQLException 발생
			//String sql="insert into student values(1000,'홍길동','010-1234-5678','서울시 강남구','2000-01-01')";
			String sql="insert into student values(4000,'일지매','010-8784-1324','수원시 팔달구','2002-06-22')";
			int rows=stmt.executeUpdate(sql);
			
			//5.SQL 명령의 실행 결과를 처리 - 출력(프로그램) 또는 반환(메소드)
			System.out.println("[메세지]"+rows+"명의 학생정보를 저장 하였습니다.");
		} catch (ClassNotFoundException e) {
			System.out.println("[에러]OracleDriver 클래스를 찾을 수 없습니다.");
		} catch (SQLException e) {
			System.out.println("[에러]JDBC 관련 오류 = "+e.getMessage());
		} finally {//예외와 상관없이 실행될 명령을 작성하는 영역
			//6.JDBC 관련 인스턴스 제거 : close() 메소드 호출 - SQLException 발생
			// => 인스턴스 생성의 반대 순서대로 제거
			try {
				//if 구문을 이용하여 NullPointerException 발생 방지
				if(stmt!=null) stmt.close();
				if(con!=null) con.close();//DBMS 서버 접속 해제 - 필수
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}	
		}
	}
}

 

4.SELECT

package xyz.itwill.jdbc;

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

//STUDENT 테이블에 저장된 학생정보 중 학번이 [2000]인 학생의 이름을 [임걱정]으로 변경하고
//주소를 [부천시 원미구]로 변경하는 JDBC 프로그램
public class UpdateStudentApp {
	public static void main(String[] args) {
		Connection con=null;
		Statement stmt=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="update student set name='임걱정',address='부천시 원미구' where no=2000";
			int rows=stmt.executeUpdate(sql);
			
			System.out.println("[메세지]"+rows+"명의 학생정보를 변경 하였습니다.");
		} catch (ClassNotFoundException e) {
			System.out.println("[에러]OracleDriver 클래스를 찾을 수 없습니다.");
		} catch (SQLException e) {
			System.out.println("[에러]JDBC 관련 오류 = "+e.getMessage());
		} finally {
			try {
				if(stmt!=null) stmt.close();
				if(con!=null) con.close();
			} catch (Exception e) {}
		}
	}
}

 

5.DELETE

package xyz.itwill.jdbc;

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

//STUDENT 테이블에 저장된 학생정보 중 학번이 [4000]인 학생정보를 삭제하는 JDBC 프로그램 
public class DeleteStudentApp {
	public static void main(String[] args) {
		Connection con=null;
		Statement stmt=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="delete from student where no=4000";
			int rows=stmt.executeUpdate(sql);
			
			if(rows>0) {//삭제행이 존재할 경우
				System.out.println("[메세지]"+rows+"명의 학생정보를 삭제 하였습니다.");
			} else {//삭제행이 존재하지 않을 경우
				System.out.println("[메세지]삭제하고자 하는 학번의 학생정보가 존재하지 않습니다.");
			}
		} catch (ClassNotFoundException e) {
			System.out.println("[에러]OracleDriver 클래스를 찾을 수 없습니다.");
		} catch (SQLException e) {
			System.out.println("[에러]JDBC 관련 오류 = "+e.getMessage());
		} finally {
			try {
				if(stmt!=null) stmt.close();
				if(con!=null) con.close();
			} catch (Exception e) {}
		}
	}
}

6.SELECT

package xyz.itwill.jdbc;

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

//STUDENT 테이블에 저장된 모든 학생정보를 검색하여 출력하는 JDBC 프로그램
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.executeQuery(String sql) : SQL 명령(SELECT)을 전달하는 메소드
			// => SELECT 명령을 실행하여 검색된 행을 ResultSet 인스턴스에 저장하여 반환
			//ResultSet : 검색결과를 테이블(2차원 배열) 형식으로 저장한 인스턴스
			rs=stmt.executeQuery(sql);
			
			//ResultSet 인스턴스에 저장된 검색행을 행단위로 처리하기 위해 커서(Cursor) 제공
			// => ResultSet 커서는 최초 BOF(Before Of File) 영역에 위치
			//ResultSet.next() : ResultSet 커서를 다음행으로 이동하는 메소드 - boolean 반환
			// => false 반환 : ResultSet 커서 위치에 처리행이 없는 경우의 반환값 - EOF(End Of File)
			// => true 반환 : ResultSet 커서 위치에 처리행이 있는 경우의 반환값
			if(rs.next()) {//ResultSet 커서를 다음행으로 이동하여 처리행이 존재하는 경우
				//System.out.println("[메세지]검색된 학생정보가 있습니다.");
				
				//반복문을 이용하여 ResultSet 커서를 다음행으로 이동하여 행을 하나씩 반복 처리
				// => ResultSet 커서 위치에 처리행이 없는 경우 반복문 종료  
				do {
					//ResultSet 커서 위치의 처리행에 컬럼값을 반환받아 저장
					//ResultSet.getXXX(int columnIndex) 또는 ResultSet.getXXX(String columnLabel)
					// => ResultSet 커서 위치의 처리행에 컬럼값을 반환하는 메소드
					// => XXX는 컬럼값을 반환받기 위한 Java 자료형을 표현
					// => columnIndex : 검색행에 대한 컬럼 위치값(OracleIndex : 1부터 1씩 증가되는 정수값)
					// => columnLabel : 검색행에 대한 컬럼명(별칭)
					//int no=rs.getInt(1);
					int no=rs.getInt("no");
					String name=rs.getString("name");
					String phone=rs.getString("phone");
					String address=rs.getString("address");
					//Date birthday=rs.getDate("birthday");
					//ResultSet 커서 위치의 처리행에 컬럼값을 오라클 자료형에 상관없이 
					//getString() 메소드를 호출하여 문자열로 반환 가능
					String birthday=rs.getString("birthday");
					
					System.out.println("학번 = "+no);
					System.out.println("이름 = "+name);
					System.out.println("전화번호 = "+phone);
					System.out.println("주소 = "+address);
					//System.out.println("생년월일 = "+birthday);
					System.out.println("생년월일 = "+birthday.substring(0, 10));
					System.out.println("==================================================");
				} while(rs.next());
			} else {
				System.out.println("[메세지]검색된 학생정보가 없습니다.");				
			}
		} catch (ClassNotFoundException e) {
			System.out.println("[에러]OracleDriver 클래스를 찾을 수 없습니다.");
		} catch (SQLException e) {
			System.out.println("[에러]JDBC 관련 오류 = "+e.getMessage());
		} finally {
			try {
				if(rs!=null) rs.close();
				if(stmt!=null) stmt.close();
				if(con!=null) con.close();
			} catch (Exception e) {}
		}
	}
}