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
}
}
}
}
📌리플렉션
- 클래스를 직접 메모리에 저장하여 인스턴스를 생성하는 방법
'💻 수업정리 (2020) > 오라클' 카테고리의 다른 글
[7/1] PreparedStatement (0) | 2020.07.01 |
---|---|
[6/30]ConnectionFactory와 ResultSet커서 이용 (0) | 2020.06.30 |
[6/26] 객체권한, 저장프로시저, 트리거 (0) | 2020.06.26 |
[6/25] 인라인뷰와 시퀀스, 권한 부여 (0) | 2020.06.25 |
[6/19] 제약조건과 VIEW (0) | 2020.06.19 |