3월 ~ 5월) 자바/jdbc
32Day - InsertStudentApp / UpdateStudentApp / SelectStudentApp / TransatctionControlApp
첼로그
2023. 5. 12. 18:13
※ 먼저 생성해야함
user.sql
0.00MB
package xyz.itwill.jdbc;
// JDBC(Java DataBase Connectivity) : Java를 사용하여 DBMS 서버에 접속해 SQL 명령을 전달하여
// 실행하기 위한 기능을 제공하는 Java API(클래스 또는 인터페이스)
// java.sql : JDBC 기능의 프로그램을 작성하기 위한 클래스 및 인터페이스가 선언된 패키지
// > java.sql 패키지에서는 JDBC 기능 구현을 위해 인터페이스 제공 - DBMS 종류가 다양하므로 클래스로 제공 불가능
// > DBMS 프로그램을 관리하는 그룹에서 JDBC 기능을 구현하기 위한 클래스(JDBC Driver)를 배포하여 제공
// > JDBC Driver가 포함된 라이브러리 파일(Jar 파일)를 다운로드 받아 프로젝트 빌드 처리해야만
// 라이브러리의 클래스를 사용하여 JDBC 프로그램 작성 가능
// Oracle DBMS를 이용한 JDBC 프로그램을 작성하기 위한 환경설정
// 1.https://www.oracle.com 사이트에서 Oracle JDBC Driver 관련 라이브러리 파일을 다운로드
// > Oracle JDBC Driver : ojdbc11.jar - JDK 버전 참고
// 2.Oracle JDBC Driver 관련 라이브러리 파일(ojdbc11.jar)을 프로젝트 폴더에 붙여넣기
// 3.프로젝트 폴더에 저장된 라이브러리 파일을 프로젝트에서 사용할 수 있도록 연결 - 빌드(Build)
// > 라이브러리 파일(Jar)의 클래스 및 인터페이스를 프로젝트에서 사용 가능하도록 설정
// > 프로젝트 >> 마우스 오른쪽 버튼 >> Properties >> Java Build Path >> Libraries >>
// classpath >> Add Jars >> 프로젝트의 내부의 Jar(ojdbc11.jar) 선택 >> Apply And Close
// STUDENT 테이블 생성 : 학번(숫자형-PRIMARY KEY),이름(문자형),전화번호(문자형),주소(문자형),생년월일(날짜형)
// CREATE TABLE STUDENT(NO NUMBER(4) PRIMARY KEY,NAME VARCHAR2(50),PHONE VARCHAR2(20)
// ,ADDRESS VARCHAR2(100),BIRTHDAY DATE);
// STUDENT 테이블에 학생정보를 삽입하는 JDBC 프로그램 작성
InsertStudentApp
package xyz.itwill.jdbc;
// STUDENT 테이블에 학생정보를 삽입하는 JDBC 프로그램 작성
public class InsertStudentApp {
public static void main(String[] args) {
// JDMC 관련 객체를 저장하기 위한 참조변수는 try 영역 외부에서 선언
// > try 영역을 포함한 모든 영역에서 참조변수를 이용하여 객체 사용 가능
Connection con = null;
Statement stmt = null;
try {
// 1.OracleDriver 클래스로 객체를 생성하여 DriverManager 클래스의 JDBC Driver 객체로 등록
// > OracleDriver 클래스를 읽어 메모리에 저장하여 자동으로 OracleDriver 객체를 생성하여
// DriverManager 클래스의 JDBC Driver 객체 등록
// JDBC Driver 객체 : DriverManager 클래스에 등록되어 관리되는 Driver 객체
// Driver 객체 : DBMS 서버에 접속하여 SQL 명령을 전달하는 기능을 제공하는 객체
// DriverManager 클래스 : Driver 객체를 관리하기 위한 기능을 제공하는 클래스
// DriverManager.registerDriver(Driver driver) : Driver 객체를 매개변수로 전달받아
// DriverManager 클래스가 관리할 수 있는 JDBC Driver 객체로 등록하는 메소드
// > 동일한 클래스로 생성된 Driver 객체가 DriverManager 클래스에 여러개 등록 가능
// > 불필요한 Driver 객체가 존재하여 성능의 저하 발생
// DriverManager.registerDriver(new OracleDriver());
// Class.forName(String className) 메소드를 호출하여 ClassLoader 프로그램을 이용하여
// OracleDriver 클래스를 읽어 메모리에 저장
// > OracleDriver 클래스의 정적영역에서 OracleDriver 클래스를 객체로 생성하여
// DriverManager 클래스의 JDBC Driver로 등록하는 메소드 호출
Class.forName("oracle.jdbc.driver.OracleDriver");
// 2.DriverManager 클래스에 등록된 JDBC Driver 객체를 이용하여 DBMS 서버에 접속
// DriverManager.getConnection(String url, String user, String password)
// > DriverManager 클래스에 등록된 JDBC Driver 객체를 이용하여 DBMS 서버에 접속하는 메소드
// > DBMS 서버에 접속된 정보가 저장된 Connection 객체를 반환
// > 접속 URL 주소의 프로토콜을 이용하여 특정 DBMS 서버에 접속
// URL (Uniform Resource Location) : 인터넷에 존재하는 자원의 위치를 표현하는 주소
// 형식) Protocol:ServerName:Port:Resource >> http://www.itwill.xyz:80/test/index.html
// Oracle DBMS 서버에 접속하여 데이타베이스에 접근하기 위한 URL 주소
// 형식) jdbc:oracle:thin:@ServerName:Port:SID
// JDBC 관련 클래스의 메소드를 호출한 경우 반드시 SQLException 발생 - 일반예외
String url = "jdbc:oracle:thin:@localhost:1521:xe"; // @localhost:1521:xe → 서버에따라 바뀔수 있음.
String user = "scott";
String password = "tiger";
con = DriverManager.getConnection(url, user, password);
// 3.Connection 객체로부터 SQL 명령을 전달할 수 있는 Statement 객체를 반환받아 저장
// Connetction.createStatement() : SQL 명령을 전달할 수 있는 Statement 객체를
// 생성하여 반환하는 메소드
// Statement 객체 : SQL 명령을 현재 접속중인 DBMS 서버에 전달하기 위한 기능을 제공
stmt = con.createStatement();
// 4.Statement 객체를 사용하여 SQL 명령(INSERT,UPDATE,DELETE,SELECT)을 DBMS 서버에
// 전달하여 실행하고 실행결과를 반환받아 저장
// Statement.executeUpdate(String sql) : DML 명령을 전달하여 실행하는 메소드
// > DML 명령의 실행결과로 조작행의 갯수가 저장된 정수값를 반환
// Statement.executeQuery(String sql) : SELECT 명령을 전달하여 실행하는 메소드
// > SELECT 명령의 실행결과로 검색행이 저장된 ResultSet 객체를 반환
//String sql = "insert into student values(1000,'홍길동','010-1234-5678','서울시 강남구','00/01/01')";
//String sql = "insert into student values(2000,'임꺽정','010-5754-1241','서울시 종로구','00/05/05')";
String sql = "insert into student values(3000,'전우치','010-8742-2101','서울시 도봉구','99/12/25')";
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 { // 예외 발생과 상관없이 무조건 실행되는 명령을 작성하는 영역
try {
// 6.JDBC 관련 객체를 모두 제거 - 객체가 생성된 순서의 반대로 제거
// Statement.close() : Statement 객체를 삭제하는 메소드
// > NullPointerException이 발생할 수 있으므로 예외 발생을 방지하기 위해 if 구문 사용
// NullPointerException : 참조변수에 NULL이 저장된 상태에서 메소드를 호출한 경우 발생되는 예외
if (stmt != null) stmt.close();
// Connection.close() : Connection 객체를 삭제하는 메소드 - 접속 종료
if(con != null) con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
[에러]JDBC 관련 오류 = ORA-00001: 무결성 제약 조건(SCOTT.SYS_C008319)에 위배됩니다
UpdateStudentApp
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 (SQLException e) { }
}
}
}
TransatctionControlApp
package xyz.itwill.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
// JDBC 프로그램은 기본적으로 AutoCommit 기능이 활성화 되어있어 SQL명령(DML)이 전달되면
// 실행되어 자동으로 커밋처리
// > 프로그램 실행시 예외가 발생된 경우 발생전 전달되어 실행된 SQL 명령에 대한 롤백 처리
// JDBC 프로그램에서 AutoCommit 기능을 비활성화 처리하고 예외 발생없이 프로그램이 정상적으로
// 실행되면 커밋 처리하고 예외가 발생된 경우 롤백 처리하는 것을 권장
// STUDENT 테이블에 저장된 학생정보 중 학번이 [2000]인 학생의 이름을 [임꺽정]으로 변경하는 JDBC
public class TransatctionControlApp {
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);
// Connection.setAutoCommit(boolean autoCommit) : AutoCommit 기능의 사용유무를 변경하는 메소드
// > false : AutoCommit 기능 비활성화, true : AutoCommit 기능 활성화 - 기본값
con.setAutoCommit(false);
stmt = con.createStatement();
String sql = "update student set name='임꺽정' where no=2000";
int rows = stmt.executeUpdate(sql);
// if(con!=null) throw new Exception(); // 인위적 예외 발생
if(rows > 0) {//조작행이 있는 경우
System.out.println("[메세지]" + rows + "명의 학생정보를 변경 하였습니다.");
} else { //조작행이 없는 경우
System.out.println("[메세지]변경 처리할 학번의 학생정보를 찾을 수 없습니다.");
}
// Connection.commit() : 커밋 처리하는 메소드 - 전달된 SQL 명령이 실제 테이블에 적용
con.commit();
} catch (Exception e) {
System.out.println("[에러]프로그램에 예기치 못한 오류가 발생 되었습니다.");
try {
// Connection.rollback() : 롤백 처리하는 메소드 - 전달된 SQL 명령의 실행을 취소
con.rollback();
} catch (SQLException e1) { }
} finally {
try {
if(stmt != null) stmt.close();
if(con != null) con.close();
} catch (SQLException e) { }
}
}
}