드라이버를 로딩해서 어떤 DBMS를 사용할 것인지도 인식시켰고 DBMS에 직접 연결하기도 했습니다. 우리 무슨 작업하려고 연결했나요?
네 맞습니다. SQL문을 자바를 이용해서 실행하기 위해 연결하셨죠?
이제 SQL문을 실행하기 위한 작업을 해야 합니다.
자바는 하나의 클래스가 하나의 기능을 갖고 있어야 한다고 했습니다. Connection객체는 연결과 관련된 정보와 기능을 갖고 있는 클래스이고 SQL문을 실행하기 위한 역할을 담당하는 클래스는 Statement입니다.
Statement객체는 다음과 같은 하위객체들이 존재합니다.
사실 주로 쓰이는 것은 PreparedStatement객체이지만 먼저 Statement객체부터 살펴보도록 하겠습니다.
Statement객체는 자바의 객체(실제로 실행되는 것은 mapping된 DBMS드라이버안의 API입니다.) 이고 이 객체의 메소드를 이용해서 SQL을 실행하려면 연결정보를 활용해야 겠죠? 어떤 DB서버인지 연결했던 정보들이 필요할 것입니다.
따라서 Statement객체는 Connection객체의 메소드를 이용하여 생성하도록 설계되어 있습니다.
API를 보실까요? API문서에서 java.sql패키지를 선택하고 interface목록에서 Connection을 선택합니다.
API문서의 Connection인터페이스를 보면 createStatement()메소드가 오버로딩되어 있는 것을 확인할 수 있습니다. 모두 Statement를 리턴하고 있죠?
이 메소드를 사용하여 Statement를 생성할 것입니다.
Statement stmt = con.createStatement();
자 이제 연습을 해볼까요? InsertTest.java를 새로 작성하세요.
다음과 같은 코드를 작성한 후 실행합니다.
package api.sql;
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:@127.0.0.1:1521:xe";
String user = "scott";
String password = "tiger";
try {
//1. 드라이버로딩
Class.forName("oracle.jdbc.driver.OracleDriver");
//2. DB서버접속하기
Connection con =
DriverManager.getConnection(url, user, password);
System.out.println("연결성공:"+con);
//3. sql을 실행하기 위한 객체를 Connection으로 부터 생성
Statement stmt = con.createStatement();
System.out.println(stmt);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
생성된 Statement객체를 출력하면 역시 oracle의 API 정보로 출력됩니다.
이제 SQL문을 실행해야 겠네요...API문서에서 Statement 인터페이스를 선택합니다.
메소드 목록을 보시면 executeXXX메소드가 굉장히 많이 있습니다. 모두 SQL실행과 관련된 메소드입니다. 차차 살펴보시도록 하고 우선 우리는 executeUpdate와 executeQuery메소드를 살펴보도록 할것입니다.
executeUpdate메소드는 매개변수로 sql명령문을 String타입의 형태로 전달받으며 int를 리턴합니다. 메소드의 상세설명을 보면 INSERT, UPDATE, DELETE를 실행할 수 있는 명령문이라고 나와있습니다.
리턴하는 데이터는 아래와 같이 DML을 실행했을때 출력되는 결과 행의 갯수입니다.
우선 insert문을 살펴보시도록 하겠습니다.
[Statement객체의 executeUpdate를 이용해서 insert하기]
우선 다음과 같이 테이블을 생성합니다.
create table tb_board(
boardNum number(10) primary key,
id varchar2(20),
title varchar2(20),
content varchar2(20),
write_date date,
hit number(10));
게시판입니다. 게시판의 글번호는 오라클의 시퀀스를 이용하여 값이 자동으로 증가되도록 할 것입니다. 다음과 같이 시퀀스를 생성합니다.
create sequence board_seq
위에서 작업했던 InsertTest.java를 열고 다음과 같이 수정합니다.
package api.sql;
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:@192.168.201.11:1521:xe";
String user = "scott";
String password = "tiger";
String sql = "insert into tb_board values(board_seq.nextval,'kang','jdbc테스트','insert테스트',sysdate,0)";
try {
//1. 드라이버로딩
Class.forName("oracle.jdbc.driver.OracleDriver");
//2. DB서버접속하기
Connection con =
DriverManager.getConnection(url, user, password);
System.out.println("연결성공:"+con);
//3. sql을 실행하기 위한 객체를 Connection으로 부터 생성
Statement stmt = con.createStatement();
System.out.println(stmt);
//4. sql실행하기
int result = stmt.executeUpdate(sql);
//5. 결과처리
System.out.println(result+"개 행이 삽입 성공..");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
네 번 실행하고 오라클에서 데이터를 조회하면 다음과 같이 네 개의 레코드가 추가되는 것을 확인할 수 있습니다.
모든 DB연동 작업은 이제 동일한 패턴으로 작업이 진행될 것입니다.
어떤 작업을 하더라도 모두 DB서버에 접속해야 하고 SQL문을 만들어서 실행되도록 명령어를 호출해야 합니다. 따라서 모든 명령어가 동일하겠죠? 심지어 Insert,Update,Delete작업은 SQL문만 변경해도 실행이 됩니다.
[Statement객체의 executeUpdate를 이용해서 update하기]
게시글번호가 2번인 레코드의 title을 "statement테스트"로 변경하기
SQL문만 변경해도 결과가 나온다고 했었죠? InsertTest.java를 UpdateTest.java로 rename하고 다음과 같이 SQL문을 변경하도록 합니다.
package api.sql;
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:@192.168.201.11:1521:xe";
String user = "scott";
String password = "tiger";
String sql = "update tb_board ";
sql = sql + "set title = 'statement테스트' ";
sql = sql + "where boardNum=2";
try {
//1. 드라이버로딩
Class.forName("oracle.jdbc.driver.OracleDriver");
//2. DB서버접속하기
Connection con =
DriverManager.getConnection(url, user, password);
System.out.println("연결성공:"+con);
//3. sql을 실행하기 위한 객체를 Connection으로 부터 생성
Statement stmt = con.createStatement();
System.out.println(stmt);
//4. sql실행하기
int result = stmt.executeUpdate(sql);
//5. 결과처리
System.out.println(result+"개 행이 수정 성공..");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
SQL문을 정의하고 있는 부분을 보시면 update문 같은 경우 set절과 where절을 같이 구현해 주셔야 하기 때문에 줄바꿈이 들어가고 각각의 문자열을 +연산자로 연결하고 있습니다.
이때 주의하실 점은 "update tb_board"의 끝에 spacebar를 눌러 공백을 주셔야 합니다. 모든 SQL문에 공백을 주어야 set과 where절을 인식할 수 있습니다.
String sql = "update tb_board ";
sql = sql + "set title = 'statement테스트' ";
sql = sql + "where boardNum=2";
위의 소스를 실행하고 테이블을 조회하면 2번 게시글의 title이 변경된 것을 확인할 수 있습니다.
[Statement객체의 executeUpdate를 이용해서 delete하기]
게시글번호가 4번인 레코드를 삭제하도록 하겠습니다. 역시 UpdateTest.java를 rename해서 DeleteTest.java를 작성합니다. SQL문만 변경하면 되는데 +연산자로 연결된 String객체가 많아서 StringBuffer로 바꿔보도록 하겠습니다.
StringBuffer로 바꾸는 경우 다음과 같이 SQL문만 변경하면 됩니다.
StringBuffer sql = new StringBuffer();
sql.append("delete from tb_board ");
sql.append("where boardNum=4" );
DeleteTest.java의 전체 소스입니다.
package api.sql;
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:@127.0.0.1:1521:xe";
String user = "scott";
String password = "tiger";
StringBuffer sql = new StringBuffer();
sql.append("delete from tb_board ");
sql.append("where boardNum=4" );
try {
//1. 드라이버로딩
Class.forName("oracle.jdbc.driver.OracleDriver");
//2. DB서버접속하기
Connection con =
DriverManager.getConnection(url, user, password);
System.out.println("연결성공:"+con);
//3. sql을 실행하기 위한 객체를 Connection으로 부터 생성
Statement stmt = con.createStatement();
System.out.println(stmt);
//4. sql실행하기
int result = stmt.executeUpdate(sql.toString());
//5. 결과처리
System.out.println(result+"개 행이 삭제 성공..");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
SQL문만 바꾸고 코드 한 줄 안 바꿔도 Insert, Delete, Update가 실행되는 거를 보셨죠?
DB연동 부분은 API가 길고 처음 접하는 API라 복잡하게 느껴지지만 작업 패턴이 동일하므로 쉽다라는 것을 느끼실꺼예요...
차근차근 공부하면 되니 화이팅 하실께요...^^
'프로그래밍언어 > Java' 카테고리의 다른 글
이클립스에서 오라클 접속하기 (1) | 2019.06.28 |
---|---|
JDBC - 커넥션설정 (0) | 2019.06.26 |
JDBC - 드라이버로딩 (0) | 2019.06.25 |
JDBC개요 (0) | 2019.06.25 |
JDBC환경설정 (0) | 2019.06.25 |