BackEnd/JDBC
JDBC
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) {}
}
}
}