본문 바로가기

JDBC(with Oracle)

뉴렉처[자바 JDBC 프로그래밍] 강의 복습 1강~12강

1강 - JDBC란 무엇인가?

JDBC가 각각 다른 회사의 DB를 연결할때 차이를 극복해주는 역할을 한다.

*JDBC 사용하기

1. JDBC 드라이버 로드하기

2. 연결 객체 생성하기

3. 문장 실행하기

4. 결과집합 사용하기

 

2강 - DBMS와 JDBC Driver 준비하기

오라클 DBMS 설치하기

* 설치 참고 영상

https://www.youtube.com/watch?v=aDTiSKcMtoc&list=PLq8wAnVUcTFVq7RD1kuUwkdWabxvDGzfu&index=2

* 설치 사이트

https://www.oracle.com/database/technologies/xe-downloads.html

 

Oracle DB의 Server Program을 설치 완료하였고, DB Server에 클라이언트가 접근하려면 Client Program(sql Plus, sql developer)을 설치해서 클라이언트 프로그램에 SQL명령문을 사용함으로써 DB Server에 명령을 전달하여 데이터를 가져오고 저장한다.

 

SQL Developer 설치하기

https://www.youtube.com/watch?v=sOFZv_jEk_8&list=PLq8wAnVUcTFVq7RD1kuUwkdWabxvDGzfu&index=3

*설치사이트

https://www.oracle.com/tools/downloads/sqldev-downloads.html

 

3강 - JDBC 기본 코드의 이해

[JDBC 사용하기]

1. JDBC 드라이버 로드하기

==> Class.forName("oracle.jdbc.driver.OracleDriver");

2. 연결 객체 생성하기(①에서 로드한 드라이버의 매니저에서 Connection 객체를 가져온다.)

==> Connection con = DriverManager.getConnection(url, "아이디", "비밀번호");

3. 쿼리 실행 객체 생성하기(②에서 만든 연결 객체로 Statement객체를 가져온다.)

==> Statement st = con.createStatement();

4. 쿼리 실행 후 결과집합 반환

==> Result rs = st.executeQuery(sql);

5. 결과를 포인터(커서)를 옮기며 결과집합 사용(Before Of File(처음) ~ End Of File(끝)까지)

==> rs.next();

6. 해당 포인터의 데이터를 뽑아온다.

String title = rs.getString("title"); //결과 집합에서 title컬럼을 가져오는 예시

4강 - 쿼리 실행하기 실습

[기본 템플릿]

 

String url = "jdbc:oracle:thin:@localhost:1521/xepdb1";

String sql = "SELECT * FROM NOTICE"; //주의!! SQL문에 ' ; ' 세미콜론 없어야한다.

 

Class.forName("oracle.jdbc.driver.OracleDriver");

Connection con = DriverManager.getConnection(url, "newlec", "비밀번호");

Statement st = con.createStatement();

ResultSet rs = st.executeQuery(sql);

 

if(rs.next()) {

String title = rs.getString("TITLE");

System.out.println(title);

}

 

rs.close();

st.close();

con.close();

 

5강 - 혼자 풀어보는 문제#1

[나의 풀이]

while(rs.next() != false) { // while(rs.next())

   int id = rs.getInt("ID");

   String title = rs.getString("TITLE");

   String writerId = rs.getString("WRITER_ID");

   Date regDate = rs.getDate("REGDATE");

   String content = rs.getString("CONTENT");

   int hit = rs.getInt("HIT");

 

   System.out.printf("id: %d, title:%s, writerId: %s, regDate:%s, content:%s, hit:%d \n",

                                 id, title, writerId, regDate, content, hit);

}

 

6강 - 문제#1 풀이 겸 문제#2

[나의 풀이]

while(rs.next()) {

   int id;

   String title;

   String writerId;

   Date regDate;

   String content;

   int hit = rs.getInt("HIT");

 

   if(hit >= 10) {

   id = rs.getInt("ID");

   title = rs.getString("TITLE");

   writerId = rs.getString("WRITER_ID");

   regDate = rs.getDate("REGDATE");

   content = rs.getString("CONTENT");

 

   System.out.printf("id: %d, title:%s, writerId: %s, regDate:%s, content:%s, hit:%d \n",

                             id, title, writerId, regDate, content, hit);

   }

}

 

7강 - #2 풀이

 

8강 - 데이터 입력을 위한 쿼리문 준비하기

 

INSERT INTO notice(

   title,

   write_id,

   content,

   files

) VALUES(

   'TEST',

   'newlec',

   'test content',

   ''

);

 

9강 - 데이터 입력하기와 PreparedStatement

select 와 같이 데이터를 검색할때는 st.executeQuery(sql);

==> 결과집합 ResultSet을 반환

insert, update, delete 와 같이 데이터를 삽입, 수정, 삭제할때는 st.executeUpdate(sql);

==> 결과집합을 반환하지 않고, 영향 받은 행의 개수를 반환한다.

 

값을 넣을때 쿼리식이

 

String title = "TEST2";

String writeId = "newlec";

String content = "hahaha";

String files = "";

 

String sql = "INSERT INTO notice ( " +

   " title, " +

   " writer_id, " +

   " content, " +

   " files " +

") VALUES ( " +

   " '" + title + "', " +

   " '" + writeId + "', " +

   " '" + content + "', " +

   " '' " +

")";

 

으로 함으로써 변수 사이에 '" + + "' 을 써줘야하는 불편한 상황이 발생한다.

이를 개선하기 위해서 PreparedStatement 객체를 사용한다.

 

1) sql문에 입력할 데이터(변수) 값을 ?(물음표)로 치환한다.

String sql = "INSERT INTO notice ( " +

                " title, " +

                " writer_id, " +

                " content, " +

                " files " +

                ") VALUES (?, ?, ?, ?)";

 

2) 실행하기 전에 물음표를 채워 넣을 역할을 하는 객체 PreparedStatement 를 생성해야한다.

PreparedStatement 는 st.executeQuery(sql); 와 같이 실행할때 sql문을 옮기지 않고,

미리 값을 채운 sql문을 준비해서 실행만 할 수 있게 한다.

PreparedStatement st = con.prepareStatement(sql); // PreparedStatement 객체 자체가 sql문을 갖고 있다.

 

3) 자료형에 따른 값을 인덱스 1부터 채워 넣어준다. st.set자료형(물음표 인덱스 순서, 데이터(변수));

ex.

st.setString(1, title);

st.setString(2, writeId);

st.setString(3, content);

st.setString(4, files);

 

4) 실행 st.executeUpdate(); 을 실행

주의!) st.executeUpdate();을 쓸때 괄호 안에 sql을 넣는 실수를 하지 말자!!!!!

실행의 결과값은 영향 받은 행의 개수를 반환한다.

===> int result = st.executeUpdate();

 

10강 - 데이터 수정을 위한 쿼리 준비하기

UPDATE NOTICE 
SET TITLE = TEST3'', CONTENT = 'HAHAHA', FILES = ''
WHERE ID = '4';

 

11강 - 데이터 수정을 구현하기

String title = "TEST3"

String content = "HAHAHA3"

String files = ""

int id = 1

 

String url = "jdbc:oracle:thin:@localhost:1521/xepdb1"

String sql = "UPDATE NOTICE " +

"SET TITLE=?, CONTENT=?, FILES=?" +

"WHERE ID=?"

 

Class.forName("oracle.jdbc.driver.OracleDriver")

Connection con = DriverManager.getConnection(url, "newlec", ".......")

PreparedStatement st = con.prepareStatement(sql)

st.setString(1, title)

st.setString(2, content)

st.setString(3, files)

st.setInt(4, id)

 

int result = st.executeUpdate()

 

System.out.println("영향받은행: " + result)

 

st.close()

con.close()

con.close()

 

12강 - 데이터 삭제하기

int id = 1

 

String url = "jdbc:oracle:thin:@localhost:1521/xepdb1"

String sql = "DELETE NOTICE WHERE ID=?"

 

Class.forName("oracle.jdbc.driver.OracleDriver")

Connection con = DriverManager.getConnection(url, "newlec", "...........")

PreparedStatement st = con.prepareStatement(sql)

 

st.setInt(1, id)

 

int result = st.executeUpdate()

 

System.out.println("영향받은행: " + result)

 

st.close()

con.close()

 

 

 

 

[출처]

뉴렉처

www.youtube.com/watch?v=c0s7g7iVtwc&list=PLq8wAnVUcTFWxwoc41CqmwnO-ZyRDL0og