자바로 JDBC연동 - API로 작업
** 패키지 import 주의!
1. 오라클 드라이버 로딩
클래스로더를 이용해서 드라이버의 핵심 클래스를 메모리에 로딩
java.lang패키지의 Class라는 클래스의 forName이라는 메소드를 이용해서 오라클 드라이버릐 핵심클래스를 메모리에 로딩
핵심클래스는 드라이버클래스라고 하며 드라이버클래스는 어떤 DBMS를 이용하냐에 따라서 달라진다.
[문법]
class.forName("메모리에 로딩하고 싶은 클래스명(패키지까지 명시)")
[오라클]
Class.forName("oracle.jdbc.driver.OracleDriver") //oracle.jdbc.driver패키지의 OracleDriver.class 파일
-------------------------------
ㄴ> 오라클 드라이브명(오라클 드라이버의 핵심클래스)
2. DB서버에 연결하기
=> java.sql패키지의 API를 이용
DriverManeger의 getConnection메소드를 이용해서 DB서버에 연결
1) static메소드이므로 클래스 이름으로 엑세스
2) throws하고 있는 SQLException은 Exception클래스의 하위 클래스이르모 문법적으로 Exception처리를 해야 한다.
3) 매개변수
* url : 연결문자열(어떤 DBMS를 쓰느냐에 따라 내부에서 인식되어질 문자열을 다른 형식으로 지정 - 교재참고)
[오라클]
jdbc:oracle:thin:@ip:port:데이터베이스의 서비스 명 (나의 데이터 베이스 서비스명 : xe)
--------------------- --------- --------------------------------
오라클에서 사용하는 | ㄴ> 오라클 설치할 때 설정하는 값으로 express edition버전은 xe
프로토콜 |
DBMS가 설치되어 있는
서버의 ip와 접속port(1521)
ex) 127.0.0.1 or localhost => 현재 작업 중인 PC(로컬)
jdbc:oracle:thin:@127.0.0.1:1521:xe
jdbc:oracle:thin:@localhost:1521:xe
jdbc:oracle:thin:@hostIP:1521:xe
* user : 사용자계정(scott)
* password : 패스워드(scott계정의 패스워드 : tiger1234)
4) 리턴타입
java.sql.Connection을 리턴
DriverManager클래스의 getConnection메소드는 DB서버에 연결하고 연결정보를 객체로 만들어서 리턴
------
ㄴjava.sql.Connection
표준 API는 java.sql.Connection을 리턴한다고 명시되어 있지만 DBMS의 드라이버가 어떤 드라이버가 로딩되어 있는지에 따라 달라진다. Connection은 인터페이스
< DB서버에 연결 >
package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class ConnectionTest {
public static void main(String[] args) {
String url = "jdbc:oracle:thin:@172.30.1.37:1521:xe";
//String url = "jdbc:oracle:thin:@127.0.0.1:1521:xe";
String user = "scott";
String password = "tiger1234";
try {
1. 드라이버 로딩
Class.forName("oracle.jdbc.driver.OracleDriver");
System.out.println("드라이버 로딩 성공!!!!");
2. DB서버와 연결(커넥션 설정)
Connection con = DriverManager.getConnection(url, user, password);
System.out.println("DB서버에 연결 성공~~~~~"+con);
}catch(ClassNotFoundException e) {
e.printStackTrace();
}catch(SQLException e) {
e.printStackTrace();
}
}
}
// 연결 안되면 오타확인~!~!~!!
** 자바 API 공식문서 내용
public static Class<?> forName(String className)
throws ClassNotFoundException
ClassNotFoundException 예외는 Runtime Exception이 조상이 아니기 때문에 예외처리 필수로 해줘야 함!!
3. SQL문 실행 기능이 제공되는 객체를 생성
[상속구조]
+-----------------+
| Statement | - 정적SQL을 실행할 때 사용(보안취약)
+-----------------+
^
|
+----------------------------+
| PreparedStatement | - 동적SQL을 실행할 때 사용(보안취약)
+----------------------------+
^
|
+--------------------------+
| CallableStatement | - 각 DBMS에 특화된 SQL로 작성된 명령문을 실행
+--------------------------+ 오라클 : PL-SQL
=> SQL문을 실행하기 위한 메소드를 갖고 있는 클래스
1) Statement객체를 이용
Connection객체가 갖고 있는 createStatement메소드를 이용해서 생성
[형식]
Statement stmt = con.createStatement()
: stmt객체는 어떤 DBMS의 드라이버가 로딩되어 있냐에 따라 달라진다.
4. SQL문 실행하기
** Statement를 사용
① executeUpdate : insert, delete, update 명령문을 실행
매개변수에 전달된 sql문이 실행됨
실행결과로 몇 개의 row가 반영되었는지 리턴
int result = stmt.executeUpdate(sql)
----------
ㄴ> 몇 개의 행이 삽입, 수정, 삭제되었는지 리턴
② executeQuery : select명령문을 실행
실행한 후 조회된 테이블을 리턴, DBMS에서 조회된 테이블을 자바에서 사용하기 위해서 만들어놓은 객체가 ResultSet이다.
실제로는 어떤 DBMS가 사용되었는지에 따라서 다른 ResultSet객체(ResultSet의 하위)가 리턴
5. 결과처리
1) insert, delete, update
- 모두 int를 리턴하므로 동일한 방법으로 처리
int result = stmt.executeUpdate(sql)
2) select
sql-plus프로그램을 이용해서 select sql문을 실행할 때 결과로 보여지는 2차원 표의 데이터를 자바에서 사용할 수 있도록 만들어 놓은 객체가 ResultSet이다.
- select문을 실행하면 ResultSet을 리턴하므로 ResultSet타입의 변수를 선언해서 결과를 참조
ResultSet rs = stmt.ececuteQuery(sql문)
- ResultSet에 있는 테이블의 데이터를 읽기 위해 ResultSet이 제공하는 메소드를 이용해서 작업
Cursor를 다음 레코드로 이동하면서 레코드 갯수만큼 반복작업을 수행
ResultSet객체의 next()메소드를 이용하여 다음레코드로 커서를 이동. next()는 커서를 이동했을 때 레코드가 존재하면 true를 리턴하고 없으면 false를 리턴
while(rs.nest()) { ---> true/false를 리턴하므로 반복문 중 while문을 이용하여 작업
// 레코드의 각 컬럼을 읽는다.
}
- 한 번에 하나의 컬럼만 읽을 수 있다.
ResultSet객체의 getXXX메소드를 이용하여 컬럼값을 읽는다. 타입에 따라 다른 메소드를 이용
오라클타입이 varchar2나 char인 경우 : java의 String
getString(컬럼명) or getString(컬럼순서 index)
--------------
원본 테이블에 정의된 컬럼의 순서가 아니라
조회된 테이블에 포함된 컬럼의 순서
오라클 타입이 number : java의 int
getInt(컬럼명) or getInt(컬럼순서 index)
오라클 타입이 date : java의 int
getDate(컬럼명) or getDate(컬럼순서 index)
while(rs.nest()) { -> 커서를 하나씩 다음레코드로 이동해라
// 조회된 레코드 갯수만큼 반복해서 작업
sysout(rs.getString("name")) -> name이라는 컬럼명으로 정의된 컬럼을 조회
sysout(rs.getString(3)) -> 조회된 테이블의 3번째 컬럼을 조회
}
< 테이블에 데이터 추가하기 >
package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class InsertTest {
public static void main(String[] args) {
String url = "jdbc:oracle:thin:@172.30.1.37:1521:xe";
String user = "scott";
String password = "tiger1234";
String sql = "insert into customer values('kang','1234','강동원','인천', sysdate, 1000, '신의짱')";
try {
//1. 드라이버 로딩
Class.forName("oracle.jdbc.driver.OracleDriver");
System.out.println("드라이버 로딩 성공~");
//2. DB서버와 연결(커넥션 설정)
Connection con = DriverManager.getConnection(url, user, password);
System.out.println("DB서버에 연결 성공!!!"+con);
//3. SQL문을 실행하기 위한 객체를 만들기
Statement stmt = con.createStatement();
System.out.println("Statement객체생성 : "+stmt);
//4. SQL문 실행하기
int result = stmt.executeUpdate(sql);
System.out.println(result + "개 행 삽입성공");
}catch(ClassNotFoundException e) {
e.printStackTrace();
}catch(SQLException e) {
e.printStackTrace();
}
}
}
< 테이블 데이터 수정하기 >
package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class UpdateTest {
public static void main(String[] args) {
String url = "jdbc:oracle:thin:@172.30.1.37:1521:xe";
String user = "scott";
String password = "tiger1234";
String sql = "update customer set addr='서울특별시' where addr='서울'";
try {
//1. 드라이버 로딩
Class.forName("oracle.jdbc.driver.OracleDriver");
System.out.println("드라이버 로딩 성공");
//2. DB서버와 연결(커넥션 설정)
Connection con = DriverManager.getConnection(url, user, password);
System.out.println("DB서버 연결 성공"+con);
//3. SQL문을 실행하기 위한 객체를 만들기
Statement stmt = con.createStatement();
System.out.println("Statement 객체생성 : "+stmt);
//4. SQL문 실행하기
int result = stmt.executeUpdate(sql);
System.out.println(result + "개 행 수정성공");
}catch(ClassNotFoundException e){
e.printStackTrace();
}catch(SQLException e) {
e.printStackTrace();
}
}
}
< 테이블 일부 데이터 삭제하기 >
package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class DeleteTest {
public static void main(String[] args) {
String url = "jdbc:oracle:thin:@172.30.1.37:1521:xe";
String user = "scott";
String password = "tiger1234";
// String sql = "delete from customer where id ='bts77'";
StringBuffer sql = new StringBuffer();
sql.append("delete from customer");
sql.append("where id ='bts77'");
try {
//1. 드라이버 로딩
Class.forName("oracle.jdbc.driver.OracleDriver");
System.out.println("드라이버 로딩 성공");
//2. DB서버와 연결(커넥션 설정)
Connection con = DriverManager.getConnection(url, user, password);
System.out.println("DB서버 연결 성공"+con);
//3. SQL문을 실행하기 위한 객체를 만들기
Statement stmt = con.createStatement();
System.out.println("Statement 객체생성 : "+stmt);
//4. SQL문 실행하기
int result = stmt.executeUpdate(sql.toString());
System.out.println(result + "개 행 삭제성공");
}catch(ClassNotFoundException e){
e.printStackTrace();
}catch(SQLException e) {
e.printStackTrace();
}
}
}
< customer테이블의 모든 정보 조회하기 > - while문 사용!!
package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class SelectTest {
public static void main(String[] args) {
String url = "jdbc:oracle:thin:@172.30.1.37:1521:xe";
String user = "scott";
String password = "tiger1234";
String sql = "select * from customer";
try {
//1. 드라이버 로딩
Class.forName("oracle.jdbc.driver.OracleDriver");
//2. 접속
Connection con = DriverManager.getConnection(url, user, password);
//3. sql실행객체생성
Statement stmt = con.createStatement();
//4.sql실행 - select
ResultSet rs = stmt.executeQuery(sql);
System.out.println("조회된 ResultSet객체 : "+rs);
while(rs.next()) {
System.out.print(rs.getString("id")+"\t");
System.out.print(rs.getString(2)+"\t");
System.out.print(rs.getString(3)+"\t");
System.out.print(rs.getString("addr")+"\t");
System.out.print(rs.getDate("regdate")+"\t");
System.out.print(rs.getInt(6)+"\t");
System.out.println(rs.getString(7)+"\t");
}
}catch(ClassNotFoundException e){
e.printStackTrace();
}catch(SQLException e) {
e.printStackTrace();
}
}
}
** select문이 아닌 다른 명령어는 ResultSet이 없음!! Update사용하기
< 테이블의 특정 데이터 조화하기. 단, 테이블에 없는 내용을 입력하면 "로그인실패" 출력하기 >
package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class LoginTest {
public static void main(String[] args) {
String url = "jdbc:oracle:thin:@172.30.1.37:1521:xe";
String user = "scott";
String password = "tiger1234";
String sql = "select * from customer where id='jang' and pass = '1234'";
try {
//1. 드라이버 로딩
Class.forName("oracle.jdbc.driver.OracleDriver");
//2. 접속
Connection con = DriverManager.getConnection(url, user, password);
//3. sql실행객체생성
Statement stmt = con.createStatement();
//4.sql실행 - select
ResultSet rs = stmt.executeQuery(sql);
System.out.println("조회된 ResultSet객체 : "+rs);
if(rs.next() == false){
System.out.println("로그인실패");
}else {
System.out.print(rs.getString("id")+"\t");
System.out.print(rs.getString(2)+"\t");
System.out.print(rs.getString(3)+"\t");
System.out.print(rs.getString("addr")+"\t");
System.out.print(rs.getDate("regdate")+"\t");
System.out.print(rs.getInt(6)+"\t");
System.out.println(rs.getString(7)+"\t");
}
}catch(ClassNotFoundException e){
e.printStackTrace();
}catch(SQLException e) {
e.printStackTrace();
}
}
}
** 결과가 하나이므로 if문 사용 가능. 대부분 while문 사용함
'Oracle' 카테고리의 다른 글
2022-11-12 JDBC 정리, 복습하기 (0) | 2022.11.12 |
---|---|
2022-11-08 1-1 시퀀스(Sequence), JDBC (0) | 2022.11.08 |
2022-11-07 서브쿼리, 뷰, 데이터 조작어, 데이터 정의어, 제약 조건 (0) | 2022.11.08 |
Do it! 오라클로 배우는 데이터베이스 입문 p.240 4번 문제 리뷰 (0) | 2022.11.05 |
2022-11-04 조인, 서브쿼리 (0) | 2022.11.04 |
댓글