-
Cinephile 스프링 프로젝트 시작(JDBC 복습)3프로젝트 2020. 9. 13. 00:23
아오 머리가 복잡하고 잘 돌아가지 않아 프로젝트는 일단 접었다. 그리고 영화를 볼까 했지만 그럴때가 아니다라는 생각이 번뜩 들어 JDBC부터 다시 복습하기로 했다.
JDBC 피피티를 열고 1페이지를 천천히 읽어보았다.
JDBC는 그 전에 설명을 들었을때도 '정확이 뭐다'라는 개념이 서지 않았는데 오늘에야 JDBC가 뭔지 깨달은 기분이다.
JDBC는 인터페이스다.
인터페이스가 또 뭐냐? 뭔지도 모르고 인터페이스, 인터페이스 하고 다녔다.
인터페이스는 '규칙에 맞는 요청'이다.
인터페이스의 역할은 어떤 A와 어떤 B를 이어주는, 상호작용 하게 해주는 것인데
상호작용 하려면 인터페이스에서 요구하는 규칙에 맞게 해야 한다는 소리 같다.
프로그래밍을 배우면서 들었던 API(Application Programming Interface), UI(User Interface) 등등 역시 같은 개념같다.
UI를 예로들면 사람과 컴퓨터사이에 상호작용 하려면 마우스, 키보드, 모니터 등등이 필요하다.
상호작용 하기위해 따라야 하는 규칙이라고 하면
마우스는 어떤 프로그램을 실행하기 위해 좌클릭을 해야 한다는 규칙을 따라야 하고
한글을 입력하고 싶다면 한/영 키를 눌러 한글로 바꿔야 한다는 규칙을 따라야 한글을 입력할수 있는 규칙 뭐 이런것을 말하는것 같다.
API는 프론트와 백엔드를 이어주는, 상호작용하는 것이고
OpenAPI는 누군가 어떤 백엔드를 만들어 놓고 여기에 백엔드 주소와 사용규칙을 공개한 것을 의미.
일단 이렇게 이해하기로 했다.
아무튼 다시
JDBC는 인터페이스인데 어떤 인터페이스냐 하면 질의문(SQL)을 실행하기 위한 인터페이스(자바와 DB사이에서 상호작용 하는거 같음) 이다.
JDBC를 쓰려면 JDBC에서 요구하는 규칙을 따라야 하겠지?
이 규칙을 따르면 데이터베이스 종류에 구애받지 않고 접근가능하다. 라고 저 위의 그림은 말을 하는것 같다.
아무튼 이제 JDBC의 규칙을 알아봐야하는데
SimpleJdbcEx/Main01.java
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; /** * @File Main01.java * @Discription 자바에서 MySQL에 접속하는 코드 * @Author 장혁준 newjhj31@gmail.com */ public class Main01 { public static void main(String[] args) { // 데이터베이스에 접속하기 위한 정보 정의하기 String db_hostname = "localhost"; int db_portnumber = 3306; String db_database = "myschool"; String db_charset = "utf8"; String db_username = "root"; String db_password = "123qwe!@#"; Connection conn = null; //null로 초기화 한다. /**데이터 베이스 접속처리 */ //사용하려는 데이터베이스명을 포함한 URL기술 // --> jdbc:mysql://localhost:3306/myschool?characterEncoding=utf8&serverTimezone=UTC String urlFormat = "jdbc:mysql://%s:%d/%s?characterEncoding=%s&serverTimezone=UTC"; String url = String.format(urlFormat, db_hostname, db_portnumber, db_database, db_charset); //MySql JDBC의 드라이버 클래스를 로딩해서 DriverManager클래스에 등록한다. //접속과정에서 예외처리가 요구된다. try { //MySQL JDBC의 드라이버 클래스를 로딩해서 DriverManager클래스에 등록한다. Class.forName("com.mysql.cj.jdbc.Driver"); //Driver 가 JDBC를 할 수 있게 해주는 그거 //jdbc.driver가 자바를 mysql이랑 연동하기 위해 필요. 옛날에는 씨디나 뭐 그런거 넣었어야 하짐나 지금은 //이명령으로 불러올수 있는 코드. //DriverManager 객체를 사용하여 DB에 접속한다. //-> 접속URL, 아이디, 비밀번호를 전달 //-> DriverManager에 등록된 Driver 객체를 사용하여 DB에 접속 후, // Connection 객체를 리턴받는다. //-->import java.sql.DriverManager 필요함 conn = DriverManager.getConnection(url, db_username, db_password); //명령 프롬프트에서 하는것 과 같다. //성공메세지 출력 System.out.println("===DATABASE Connect Success==="); }catch(ClassNotFoundException e) { //실패시 메시지와 에러내용 출력 System.out.println("===DATABASE Connect Fail==="); System.out.println(e.getMessage()); }catch(SQLException e) { //실패시 메시지와 에러내용 출력 System.out.println("===DATABASE Connect Fail==="); System.out.println(e.getMessage()); } /**데이터베이스 접속 해제 처리 */ try { conn.close(); System.out.println("===DATABASE Disconnect Success==="); }catch(Exception e) { System.out.println("===DATABASE Disconnect Fail==="); System.out.println(e.getMessage()); } conn = null; //연결을 끊으면서 초기화 하는 코드 } }
위에서 확인할 수 있는 규칙은
- mysql-connector라는 jar 파일을 라이브러리에 포함시키고 JDBC에 import(java.sql.Connection)하고 접속 객체를 만든다.
- 데이터베이스에 접속하기 위한 정보를 정의한다.
- 데이터베이스 접속 처리를 한다.
- (SQL을 수행한다)
- 데이터베이스 접속을 해제한다.
매번 JDBC를 사용해서 SQL을 수행하려면 위의 과정(1, 2, 3, 5)이 필요하기 때문에
이와 같이 재사용을 필요로 하는 코드는 별도의 파일에 SingleTon 클래스로 묶어 호출하는 형태로 만들어 사용 할 수 있다.
DBHelper.java
package study.java.helper; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; /** * @File DBHelper.java * @Discription 재사용을 필요로하는 코드 helper 만들기 * @Author 장혁준 newjhj31@gmail.com */ public class DBHelper { //데이터베이스에 접속하기 위한 정보 정의하기 private static final String db_hostname = "localhost"; private static final int db_portnumber = 3306; private static final String db_database = "myschool"; private static final String db_charset = "utf8"; private static final String db_username = "root"; private static final String db_password = "123qwe!@#"; private Connection conn = null; //------싱글톤 객체 생성 시작 ---------- private static DBHelper current; //싱글톤객체 선언!! 다른 매서드들과 관계없는 독립적인 객체 public static DBHelper getInstance() { if(current == null) { current = new DBHelper(); } return current; } public static void freeInstance() { //객체에 null을 대입하면 메모리에서 삭제된다. current = null; } //기본생성자를 private로 은닉하게 되면 new를 통한 객체 생성이 금지된다. private DBHelper() { super(); } //------싱글톤 객체 생성 끝 ----------- /** 데이터베이스에 접속후, 접속 객체를 리턴한다.*/ public Connection open() { //중복 실행될 경우 발생될 문제를 방지하기 위하여, //Connection 객체가 null인 경우만 처리하도록 if문으로 구성 if(conn == null) { /**데이터 베이스 접속처리 */ //사용하려는 데이터베이스명을 포함한 URL기술 // --> jdbc:mysql://localhost:3306/myschool?characterEncoding=utf8&serverTimezone=UTC String urlFormat = "jdbc:mysql://%s:%d/%s?characterEncoding=%s&serverTimezone=UTC"; String url = String.format(urlFormat, db_hostname, db_portnumber, db_database, db_charset); //MySql JDBC의 드라이버 클래스를 로딩해서 DriverManager클래스에 등록한다. //접속과정에서 예외처리가 요구된다. try { //MySQL JDBC의 드라이버 클래스를 로딩해서 DriverManager클래스에 등록한다. Class.forName("com.mysql.cj.jdbc.Driver"); //이클립스에서 내장 되어있는 클래스 //DriverManager 객체를 사용하여 DB에 접속한다. //-> 접속URL, 아이디, 비밀번호를 전달 //-> DriverManager에 등록된 Driver 객체를 사용하여 DB에 접속 후, // Connection 객체를 리턴받는다. //-->import java.sql.DriverManager 필요함 conn = DriverManager.getConnection(url, db_username, db_password); //명령 프롬프트에서 하는것 과 같다. //성공메세지 출력 System.out.println("===DATABASE Connect Success==="); }catch(ClassNotFoundException e) { //실패시 메시지와 에러내용 출력 System.out.println("===DATABASE Connect Fail==="); System.out.println(e.getMessage()); }catch(SQLException e) { //실패시 메시지와 에러내용 출력 System.out.println("===DATABASE Connect Fail==="); System.out.println(e.getMessage()); } } return conn; } /**데이터베이스의 접속을 해제한다. */ public void close() { if(conn != null) { /**데이터베이스 접속 해제 처리*/ try { conn.close(); System.out.println("===DATABASE Disconnect Success==="); }catch(Exception e) { System.out.println("===DATABASE Disconnect Fail==="); System.out.println(e.getMessage()); } conn = null; } } }
DBHelper에서 접속 정보는 프로그램 실행중에 변경될 필요가 없는 정보이므로, final 키워드를 사용하여 상수 형태로 정의하였다. 접속객체는 멤버변수 형태로 선언한다.그리고 open()으로 데이터베이스 접속처리를 하고 close()로 해제처리를 한다.
이제 필요한 SQL문을 수행하는데 그중 입력, 수정, 삭제의 처리절차는 다음과 같다.
JDBC를 통해 데이터 입력을 구현하고 싶다면
SimpleJdbcEx/Main02.java (더보기)
더보기import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; import study.java.helper.DBHelper; /** * @File Main02.java * @Discription 데이터 추가!! * @Author 장혁준 newjhj31@gmail.com */ public class Main02{ public static void main(String[] args){ // 'department' 테이블에 `컴퓨터정보과` 추가하기 위한 SQL String sql = "INSERT INTO department (deptno, dname, loc) VALUES (300, '컴퓨터정보과', '5호관')"; /** DBHelper를 통한 DB 접속 처리*/ DBHelper db = DBHelper.getInstance(); Connection conn = db.open(); //helper에서 연결된 거를 여기와서 conn형태로 넘겨 받음 /**SQL 구문 실행하기*/ //SQL문을 실행할 수 있는 객체 Statement stmt = null; //Statement 형 stmt에 널값을 주었다. //결과값 (저장된 데이터의 수) int result = 0; try { //SQL문을 실행할 수 있는 객체 생성(예외처리 요구됨) stmt = conn.createStatement(); //SQL문 실행하기 --> 결과 행 리턴 됨(예외처리 요구됨) result = stmt.executeUpdate(sql); }catch (SQLException e) { System.out.println("MySQL SQL Fail : " + e.getMessage()); }finally { //SQL 구문의 에러 여부에 상관 없이 stmt 객체를 닫기 위하여 finally 블록 사용. //-> 객체의 유효범위 설정을 위해서 stmt 객체는 try 블록 밖에 선언되었다. //JDBC관련 객체들은 사용이 완료된 후에는 반드시 close 처리를 수행해야 한다. //이떄, 생성된 순서의 역순으로 처리한다. if(stmt != null) { // 객체 닫기 try { stmt.close(); }catch(SQLException e) {} } } //결과출력 System.out.println(result + " Record Insert"); /**DB 접속 해제*/ db.close(); } }
- 값을 추가하기 위한 SQL문을 String 타입으로 만들어 놓는다.
- DBHelper를 통해 데이터베이스에 접속하고(CMD에서 SQL문을 쓰기 직전의 상태 /같음)
- SQL구문을 실행한다.
-stmt = (CMD에서 SQL문을 쓰기 직전의 상태 + sql /같음)
-result = (CMD에서 SQL문을 쓰기 직전의 상태 + sql + ENTER키 / 해서 나온 결과 같음) - 데이터베이스 접속을 해제한다.
JDBC를 통해 데이터 수정을 구현하고 싶다면
SimpleJdbcEx/Main03.java (더보기)
더보기import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; import study.java.helper.DBHelper; /** * @File Main03.java * @Discription 데이터 수정 * @Author 장혁준 newjhj31@gmail.com */ public class Main03 { public static void main(String[] args) { // 'department' 테이블에 `컴퓨터정보과` 추가하기 위한 SQL String sql = "UPDATE department SET loc='6호관' WHERE deptno=300"; /** DBHelper를 통한 DB 접속 처리*/ DBHelper db = DBHelper.getInstance(); Connection conn = db.open(); /**SQL 구문 실행하기*/ //SQL문을 실행할 수 있는 객체 Statement stmt = null; //결과값 (저장된 데이터의 수) int result = 0; try { //SQL문을 실행할 수 있는 객체 생성(예외처리 요구됨) stmt = conn.createStatement(); //SQL문 실행하기 --> 결과 행 리턴 됨(예외처리 요구됨) result = stmt.executeUpdate(sql); }catch (SQLException e) { System.out.println("MySQL SQL Fail : " + e.getMessage()); }finally { //SQL 구문의 에러 여부에 상관 없이 stmt 객체를 닫기 위하여 finally 블록 사용. //-> 객체의 유효범위 설정을 위해서 stmt 객체는 try 블록 밖에 선언되었다. //JDBC관련 객체들은 사용이 완료된 후에는 반드시 close 처리를 수행해야 한다. //이떄, 생성된 순서의 역순으로 처리한다. if(stmt != null) { // 객체 닫기 try { stmt.close(); }catch(SQLException e) {} } } //결과출력 System.out.println(result + "Record UPdate"); /**DB 접속 해제*/ db.close(); } }
- 값을 추가하기 위한 SQL문을 String 타입으로 만들어 놓는다.
- DBHelper를 통해 데이터베이스에 접속하고(CMD에서 SQL문을 쓰기 직전의 상태 /같음)
- SQL구문을 실행한다.
-stmt = (CMD에서 SQL문을 쓰기 직전의 상태 + sql /같음)
-result = (CMD에서 SQL문을 쓰기 직전의 상태 + sql + ENTER키 / 해서 나온 결과 같음) - 데이터베이스 접속을 해제한다.
JDBC를 통해 데이터 삭제를 구현하고 싶다면
SimpleJdbcEx/Main04.java (더보기)
더보기import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; import study.java.helper.DBHelper; /** * @File Main04.java * @Discription 데이터 삭제 * @Author 장혁준 newjhj31@gmail.com */ public class Main04 { public static void main(String[] args) { // 'department' 테이블에 `컴퓨터정보과` 추가하기 위한 SQL String sql = "DELETE FROM department WHERE deptno=300"; /** DBHelper를 통한 DB 접속 처리*/ DBHelper db = DBHelper.getInstance(); Connection conn = db.open(); /**SQL 구문 실행하기*/ //SQL문을 실행할 수 있는 객체 Statement stmt = null; //결과값 (저장된 데이터의 수) int result = 0; try { //SQL문을 실행할 수 있는 객체 생성(예외처리 요구됨) stmt = conn.createStatement(); //SQL문 실행하기 --> 결과 행 리턴 됨(예외처리 요구됨) result = stmt.executeUpdate(sql); }catch (SQLException e) { System.out.println("MySQL SQL Fail : " + e.getMessage()); }finally { //SQL 구문의 에러 여부에 상관 없이 stmt 객체를 닫기 위하여 finally 블록 사용. //-> 객체의 유효범위 설정을 위해서 stmt 객체는 try 블록 밖에 선언되었다. //JDBC관련 객체들은 사용이 완료된 후에는 반드시 close 처리를 수행해야 한다. //이떄, 생성된 순서의 역순으로 처리한다. if(stmt != null) { // 객체 닫기 try { stmt.close(); }catch(SQLException e) {} } } //결과출력 System.out.println(result + "Record Delete"); /**DB 접속 해제*/ db.close(); } }
- 값을 추가하기 위한 SQL문을 String 타입으로 만들어 놓는다.
- DBHelper를 통해 데이터베이스에 접속하고(CMD에서 SQL문을 쓰기 직전의 상태 /같음)
- SQL구문을 실행한다.
-stmt = (CMD에서 SQL문을 쓰기 직전의 상태 + sql /같음)
-result = (CMD에서 SQL문을 쓰기 직전의 상태 + sql + ENTER키 / 해서 나온 결과 같음) - 데이터베이스 접속을 해제한다.
데이터 입력, 수정, 삭제는 수행하면 결과가 '1개의 데이터가 입력, 수정, 삭제 되었습니다. 이런 식으로 나오기 때문에 처리과정이 비슷하다.
다음 단일행 조회는
입력, 수정, 삭제 보다 조회 데이터를 보여주어야하는 처리가 추가되어있다.
단일 데이터 조회
SimpleJdbcEx/Main05.java (더보기)
더보기import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import study.java.helper.DBHelper; /** * @File Main05.java * @Discription 단일 데이터 조회 * @Author 장혁준 newjhj31@gmail.com */ public class Main05 { public static void main(String[] args) { // 'department' 테이블에 `컴퓨터정보과` 추가하기 위한 SQL String sql = "SELECT count(studno) FROM student WHERE grade=4"; /** DBHelper를 통한 DB 접속 처리*/ DBHelper db = DBHelper.getInstance(); Connection conn = db.open(); /**SQL 구문 실행하기*/ //SQL문을 실행할 수 있는 객체 Statement stmt = null; //SELECT 결과를 저장할 객체 //-->import java.sql.ResultSet; ResultSet rs = null; try { //SQL문을 실행할 수 있는 객체 생성(예외처리 요구됨) stmt = conn.createStatement(); //SELECT 구문을 실행한 후, 결과셋을 리턴받는다. rs= stmt.executeQuery(sql); //조회 결과의 첫 번째 줄로 이동(학생 데이터베이스에 홍길동, (다음줄) 둘리 ,(다음줄) 또치 이런식으로 데이터가 저장되어있다) boolean first = rs.next(); if(first) { //SELECT절에 명시된 `1`번쨰 항목을 int 형으로 추출하기 int count = rs.getInt(1); // //결과출력 System.out.println("4학년 학생은 "+count+"명 입니다."); } }catch (SQLException e) { System.out.println("MySQL SQL Fail : " + e.getMessage()); }finally { //resetset 닫기 --> 생성도니 순서의 역순으로 객체를 닫는다. if(rs != null) { try { rs.close(); }catch(SQLException e) {} } //SQL 구문의 에러 여부에 상관 없이 stmt 객체를 닫기 위하여 finally 블록 사용. //-> 객체의 유효범위 설정을 위해서 stmt 객체는 try 블록 밖에 선언되었다. //JDBC관련 객체들은 사용이 완료된 후에는 반드시 close 처리를 수행해야 한다. //이떄, 생성된 순서의 역순으로 처리한다. if(stmt != null) { // 객체 닫기 try { stmt.close(); }catch(SQLException e) {} } } /**DB 접속 해제*/ db.close(); } }
- 값을 조회하기 위한 SQL문을 String 타입으로 만들어 놓는다.
- DBHelper를 통해 데이터베이스에 접속하고(CMD에서 SQL문을 쓰기 직전의 상태 /같음)
- SQL구문을 실행한다.
-stmt = (CMD에서 SQL문을 쓰기 직전의 상태 + sql /같음)
-rs = (CMD에서 SQL문을 쓰기 직전의 상태 + sql + ENTER키 / 해서 나온 결과 같음)
위와 같이 조회 결과가 나오는데 rs.next();가 노란색 화살표처럼 한칸 내려와서 값이 있는지 없는지 확인하는 작업을 하는것 같다.
(rs.getInt(1);을 수행하면 SELECT절에 명시된 '1'번째 항목을 int 형으로 추출하는 것)
4. 필요한 작업이 끝났으니 rs 닫고 stmt 닫고 DB접속 해제한다.(생성된 순서의 역순으로 닫기)
(조회문은 조회한 데이터를 보여주어야 하니까 java.sql.ResultSet를 import하고 rs로 객체를 만든다.)
단일행 결과를 조회
SimpleJdbcEx/Main06.java (더보기)
더보기import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import study.java.helper.DBHelper; /** * @File Main06.java * @Discription 단일 데이터 조회 * @Author 장혁준 newjhj31@gmail.com */ public class Main06 { public static void main(String[] args) { // '김도훈' 교수의 정보 조회하기 String sql = "SELECT profno, name, userid, position, sal, hiredate, comm, deptno FROM professor WHERE name='남은혁'"; /** DBHelper를 통한 DB 접속 처리*/ DBHelper db = DBHelper.getInstance(); Connection conn = db.open(); /**SQL 구문 실행하기*/ //SQL문을 실행할 수 있는 객체 Statement stmt = null; //SELECT 결과를 저장할 객체 //-->import java.sql.ResultSet; ResultSet rs = null; try { //SQL문을 실행할 수 있는 객체 생성(예외처리 요구됨) stmt = conn.createStatement(); //SELECT 구문을 실행한 후, 결과셋을 리턴받는다. rs= stmt.executeQuery(sql); //조회 결과의 첫 번째 줄로 이동 boolean first = rs.next(); if(first) { //SELECT절에 명시한 컬럼 이름을 사용하여 데이터 추출 int profNo = rs.getInt("profno"); String name = rs.getString("name"); String userId = rs.getString("userid"); String position = rs. getString("position"); int sal = rs.getInt("sal"); String hiredate = rs.getString("hiredate"); int comm = rs.getInt("comm"); int deptno = rs.getInt("deptno"); System.out.printf("교수번호: %d\n " ,profNo); System.out.printf("이름: %s\n " ,name); System.out.printf("아이디: %s\n " ,userId); System.out.printf("직급: %s\n " ,position); System.out.printf("급여: %d\n " ,sal); System.out.printf("입사일: %s\n " ,hiredate); System.out.printf("보직수당: %d\n " ,comm); System.out.printf("학과번호: %d\n " ,deptno); }else { System.out.println("조회 결과가 없습니다."); } }catch (SQLException e) { System.out.println("MySQL SQL Fail : " + e.getMessage()); }finally { //resetset 닫기 --> 생성도니 순서의 역순으로 객체를 닫는다. if(rs != null) { try { rs.close(); }catch(SQLException e) {} } //SQL 구문의 에러 여부에 상관 없이 stmt 객체를 닫기 위하여 finally 블록 사용. //-> 객체의 유효범위 설정을 위해서 stmt 객체는 try 블록 밖에 선언되었다. //JDBC관련 객체들은 사용이 완료된 후에는 반드시 close 처리를 수행해야 한다. //이떄, 생성된 순서의 역순으로 처리한다. if(stmt != null) { // 객체 닫기 try { stmt.close(); }catch(SQLException e) {} } } /**DB 접속 해제*/ db.close(); } }
- 값을 조회하기 위한 SQL문을 String 타입으로 만들어 놓는다.
- DBHelper를 통해 데이터베이스에 접속하고(CMD에서 SQL문을 쓰기 직전의 상태 /같음)
- SQL구문을 실행한다.
-stmt = (CMD에서 SQL문을 쓰기 직전의 상태 + sql /같음)
-rs = (CMD에서 SQL문을 쓰기 직전의 상태 + sql + ENTER키 / 해서 나온 결과 같음)
위와 같이 조회 결과가 나오는데 rs.next();가 노란색 화살표처럼 한칸 내려와서 값이 있는지 없는지 확인하는 작업을 하는것 같다. 여러 값들이 나왔으므로 if(first)문을 수행하여 조회된 값을 확인할 수 있다.
4. 필요한 작업이 끝났으니 rs 닫고 stmt 닫고 DB접속 해제한다.(생성된 순서의 역순으로 닫기)
(조회문은 조회한 데이터를 보여주어야 하니까 java.sql.ResultSet를 import하고 rs로 객체를 만든다.)
다음 다중행 조회는
다중행 조회
SimpleJdbcEx/Main07.java (더보기)
더보기import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import study.java.helper.DBHelper; /** * @File Main07.java * @Discription 다중 행의 결과를 조회하기 위한 SQL구문 준비하기 * @Author 장혁준 newjhj31@gmail.com */ public class Main07 { public static void main(String[] args) { // 학과목록 조회하기 String sql = "SELECT deptno, dname, loc FROM department ORDER BY deptno ASC"; /** DBHelper를 통한 DB 접속 처리*/ DBHelper db = DBHelper.getInstance(); Connection conn = db.open(); /**SQL 구문 실행하기*/ //SQL문을 실행할 수 있는 객체 Statement stmt = null; //SELECT 결과를 저장할 객체 //-->import java.sql.ResultSet; ResultSet rs = null; try { //SQL문을 실행할 수 있는 객체 생성(예외처리 요구됨) stmt = conn.createStatement(); //SELECT 구문을 실행한 후, 결과셋을 리턴받는다. rs= stmt.executeQuery(sql); //한 줄씩 스캔하는 반복문 구성 while (rs.next()) { int deptNo= rs.getInt("deptno"); String dname = rs.getString("dname"); String loc = rs.getString("loc"); System.out.printf("학과번호: %d\n", deptNo); System.out.printf("학과이름: %s\n", dname); System.out.printf("위치: %s\n", loc); System.out.println(); } }catch (SQLException e) { System.out.println("MySQL SQL Fail : " + e.getMessage()); }finally { //resetset 닫기 --> 생성도니 순서의 역순으로 객체를 닫는다. if(rs != null) { try { rs.close(); }catch(SQLException e) {} } //SQL 구문의 에러 여부에 상관 없이 stmt 객체를 닫기 위하여 finally 블록 사용. //-> 객체의 유효범위 설정을 위해서 stmt 객체는 try 블록 밖에 선언되었다. //JDBC관련 객체들은 사용이 완료된 후에는 반드시 close 처리를 수행해야 한다. //이떄, 생성된 순서의 역순으로 처리한다. if(stmt != null) { // 객체 닫기 try { stmt.close(); }catch(SQLException e) {} } } /**DB 접속 해제*/ db.close(); } }
- 값을 조회하기 위한 SQL문을 String 타입으로 만들어 놓는다.
- DBHelper를 통해 데이터베이스에 접속하고(CMD에서 SQL문을 쓰기 직전의 상태 /같음)
- SQL구문을 실행한다.
-stmt = (CMD에서 SQL문을 쓰기 직전의 상태 + sql /같음)
-rs = (CMD에서 SQL문을 쓰기 직전의 상태 + sql + ENTER키 / 해서 나온 결과 같음)
이번 sql에에서 여러행의 데이터가 조회되기때문에 또 얼마나 조회될지 모른다고 했을때 while(rs.nect())문을 사용한다.
위와 같이 조회 결과가 나오는데 rs.next();가 노란색 화살표처럼 한칸 내려와서 값이 있는지 없는지 확인하는 작업을 반복 하는것 같다.
4. 필요한 작업이 끝났으니 rs 닫고 stmt 닫고 DB접속 해제한다.(생성된 순서의 역순으로 닫기)
(조회문은 조회한 데이터를 보여주어야 하니까 java.sql.ResultSet를 import하고 rs로 객체를 만든다.)
지금까지 JDBC를 다시 공부해 보았는데 정리하자면
JDBC는 자바프로그램 안에서 SQL문을 수행을 하기위한 인터페이스이다.
여기서 JDBC 인터페이스의 역할은 자바와 데이터베이스 사이에서 규칙에 맞는 요청을 통해 상호작용하는 것이다.
여기서 규칙은 Main01에 정리했던
- mysql-connector라는 jar 파일을 라이브러리에 포함시키고 JDBC에 import(java.sql.Connection)하고 접속 객체를 만든다.
- 데이터베이스에 접속하기 위한 정보를 정의한다.
- 데이터베이스 접속 처리를 한다.
- SQL을 수행한다.
- 데이터베이스 접속을 해제한다.
이렇다고 정리하고 넘어가면 좋을것 같다.
사실 JDBC의 방법이 다음에 공부할 DAO, MyBatis, ServiceLayer 의 방법으로 업그레이드가 되는거 같으니 아직 Cinephile 작업에 어떻게 적용하는지는 생각 하지 않아도 될것 같다.
'프로젝트' 카테고리의 다른 글
Cinephile 스프링 프로젝트 시작(MyBatis)6 (0) 2020.09.14 Cinephile 스프링 프로젝트 시작(DAO 패턴)5 (0) 2020.09.13 Cinephile 스프링 프로젝트 시작(PrepareStatement)4 (0) 2020.09.13 Cinephile 스프링 프로젝트 시작(account) 2 (0) 2020.09.12 Cinephile 스프링 프로젝트 시작(login) 1 (0) 2020.09.11