[1] JDBC란?
✔  SQL을 작성할 수 있는 사람의 쿼리실행도구 ▶ DB Client program : Oracle, MS SQL (연결/인증, 문장실행, 결과패치)
: 데이터 베이스 이용을 위해서 사용자 요구에 부합한 쿼리를 만듦

 

✔ SQL을 작성할 수 없는 사람의 쿼리실행도구 ▶ 업무용 프로그램
: 업무용프로그램 ▶ SQL ▶ DB API 순으로 접속

[2] DBC (DataBase Connectivity)
: 회사마다 DB API가 다름 (DBMS가 여러개라 교체하는 경우 데이터베이스 연결문제가 생김)
: 업무용 프로그램 또한 여러 페이지가 기능은 같지만 UI가 다를 수 있다
▶ JDBC의 등장. (java database connectivity)  DBMS에 직접연결이 아닌, JDBC에 연결. (Connection, Statement, ResultSet - 항상 같은 함수 기능을 제공)
: 마치 다른 나라에 갈때 쓰는 코드어댑터 역할
▶ 연결방법이 단일화된다

업무용프로그램 > SQL > JDBC(여기로 연결시킴) > JDBC Driver(DB와 연결된 실제구동코드) > Oracle/MS SQL


[3] JDBC드라이버 다운로드
: 이클립스 내 자바 프로젝트에서 클래스 생성 ▶ 프로젝트에 build path - configure buildpath-libraries - add External JARs ▶ 드라이버.jar파일 추가

[4] JDBC 기본코드 이해
✔ JDBC 사용순서 (&학습순서)
1. 드라이버 로드하기 Class.forName("oracle.jdbc.driver.OracleDriver"); 클래스를 객체화시키는게 로드.
2. 연결생성 Connection con = DriverManager.getConnection(...);
3. 문장 실행 Statement st = con.createStatement(); //사용자로부터 요구받은 쿼리문 실행
4. 결과 집합 사용 ResultSet rs = st.executeQuery(sql);
- Before Of File : 파일의 시작점 / End Of File : 파일의 끝점
: 클라이언트가 실행결과를 받을땐 한번에 받는게 아니라 조금씩 받기 때문에 데이터와 함께 커서가 생성됨 (결과 '집합'인 이유) 
5.  rs.next(); //커서가 하나 넘어갈때마다 ResultSet에 담김
6. String title = rs.getString("title");

 

[5] 쿼리실행

ROLE - MEMBER_ROLE - MEMBER - NOTICE - COMMENT

Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection(url, "myid", "****"); //서버,아이디,패스워드
Statement st = con.createStatement();
ResultSet rs = st.executeQuery(sql);

rs.next();

String name=rs.getString("TITLE");
System.out.printf(name);

rs.close(); // 자원을 사용 후 클로즈
st.close();
con.close();

 

 

[6] SQL developer 준비

: 다운로드 후 jdk 연결하는데 17까지만 가능하대서 다시 jdk17을 다운받고 연결했다.

테스트해서 상태가 성공으로 뜨면 완료

 

 

[7] 오라클 연결

: db에 데이터 insert후 커밋까지 완료 후 연결 

 

헤맨사항 ❣ 콘솔창에 자꾸 흰 화면만 뜨길래 다른 사람들처럼 아예 xepdb1과 연결이 안되었나 싶어서 cmd창으로 조회하고 드라이버도 새로 연결하고 별 짓을 다 하다가, 다른분 코드를 참고해서 각 절차마다 하나씩 프린트를 해보았다. 그렇게 보니 연결은 잘 됐네? 오라클에도 select해보니 값들은 잘 들어가있는데...

그럼 단순히 문장을 못읽어오거나 / 출력을 못하거나. 둘 중 하나인것 같아 rs.next()이후로 한줄씩 다시 써보면서 오류메세지가 나오는 지점을 찾아보려 했는데 그냥 rs.next(); 단계에서 구문이 출력됐다.  알고보니... rs.next(); if(rs.next()){} 로 적어놨음.........바보니........ 

 

새삼 다시 깨닫는다.어느지점에서 오류가 났는지 모를 때에는, (특히 지금처럼 메세지가 하나도 없이 반응이 없을때에는) 단계별로 프린트를 해서 확인을 해보자.........나는 아직 심각한 오류가 날 정도의 실력도 아니라서 아주 기초적인것을 뒤져보면 거기에 다 답이 있다 ㅎㅎㅎ

 

 

[8] 원하는 데이터만 불러오기. hit 이 10이상인 게시글만 불러오려면?

내가 생각한 답은 콘솔출력에 if을 추가했는데, sql초보 + 자바만 잘한 사람의 정답이란 말씀을 하셨다 🤣 틀린말은 아닌데..쒸익쒸익

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");
            
            if(hit>=10)
			System.out.printf("id:%d, title: %s , writerId:%s , regDate: %s ,content: %s , hit: %d%n", id, title,
					writerId, regDate, content, hit);
		}

		rs.close(); // 자원을 사용 후 클로즈
		st.close();
		con.close();

	}

 

이럴땐 SQL부터 필터링을 걸어줘야 한다.

String sql = "SELECT * FROM NOTICE WHERE HIT>10";

왜냐하면 while을 다 돌린 후에 추출하기 때문에 쌓이는 데이터량이 많아지게 됨 & 비효율. 애초부터 필터링을 해서 데이터를 가져오면 됨.

public static void main(String[] args) throws ClassNotFoundException, SQLException {
		String url = "jdbc:oracle:thin:@localhost:1521/xepdb1"; // local host도 가능 @192.168.0.15:1521/xepdb1
		String sql = "SELECT * FROM NOTICE WHERE HIT>10";

 👉 자바는 UI 레이아웃 (어떤 포맷으로 보여질것인가) 만 담당하고, 데이터 가공처리(필터링, 정렬, 그룹화 등 데이터연산)는 SQL이 담당한다.

 

 

 

 

 

+ Recent posts