-
JDBC (Java DataBase Connectivity) - 조회 Part 2프로그래밍 언어/JDBC 2020. 11. 13. 17:40728x90반응형
1 - 3) EmpDAOempDAO.selectAll() 메소드 설정
EmpDAO.java에 있는 selectAll()메소드를 설정 하자
public List<Emp> selectAll() { // JDBC 객체 선언(java.sql 패키지에 존재하는 객체) Connection conn = null; // DB와의 연결 정보를 담은 객체 // -> 프로그램과 DB 사이를 연결해주는 일종의 길 Statement stmt = null; // Connection 객체를 통해 DB에 SQL문을 전달하고 실행하여 // 결과를 반환받는 역할을 하는 객체 ResultSet rset = null; // DB에서 SELECT 절의 성공 시 반환되는 객체 // - SELECT문의 결과로 생성된 테이블을 담고 있으며 // '커서(CURSOR)'를 이용해 한 행씩을 참조할 수 있다. List<Emp> empList = null; // DB에서 조회한 결과를 저장할 List try { // 1_5. JDBC 드라이버 클래스 메모리 로드 Class.forName("oracle.jdbc.driver.OracleDriver"); // 프로그램과 DB 사이의 연결 역할을 해주는 JDBC 드라이버 로드 // 오라클 DB와 연결하기 위한 JDBC 드라이버 : "oracle.jdbc.driver.OracleDriver" // 해당 드라이버를 호출함으로써 메모리에 로드된다. // 1_6. DB와의 연걸 작업 준비 /* 연결 정보를 담을 Connection을 얻어옴. -> Connection을 얻어오기 위해서는 DriverManager가 필요 */ conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:xe", "scott", "tiger"); /* jdbc:oracle:thin -> JDBC 드라이버의 타입이 thin 타입임을 의미함 @127.0.0.1 -> 자신의 컴퓨터 로컬 ip (== @localhost 대체가능) :1521 -> 오라클 listener의 포트번호 (포트: 응용 프로그램이 외부와 통신하기 위한 통로) :xe -> 오라클 DB 이름 "scott" : 접속할 사용자 이름(계정 "tiger" : 해당 계정의 비밀번호 */ // DB와의 연결과 관련된 요쇼들은 모두 SQLException을 발생시킬 가능성이 있다. // DB 접속 성공 시 conn을 출력하면 연결객체의 구조가 출력됨. // 실패 시 null 출력 // System.out.println(conn); // oracle.jdbc.driver.T4CConnection@6438a396 // 1_7. DB 접속 성공 시 DB에다가 전달할 SQL구문을 준비하고 // 이를 전달하여 결과를 얻어올 객체 Statement 객체를 생성 String query = "SELECT * FROM EMP"; // **** 주의사항 **** // JAVA단에서 SQL 구문 작성 시 세미콜론을 붙이면 안된다!!! stmt = conn.createStatement(); rset = stmt. executeQuery(query); // *** Statement.executeQuery(query) // -> DB로 SELECT문을 전달하고 결과로 ResultSet을 반환받음. // 1_8. ResultSet rset에 있는 SELECT 처리 결과를 // JAVA단에서 쉽게 사용할 수 있도록 // List객체에 저장 시키기 // DB와의 통신 성공 시 List 객체를 생성. // -> 오류가 났을 경우에 메모리 손실을 방지하기 위해 empList = new ArrayList<Emp>(); while(rset.next()) { // ResultSet.next() : 반환받은 조회 결과를 // 커서를 이용해 순차적으로 한 행씩 접근 // 접근한 행이 존재하면 true, 없으면 false // ResultSet에서 현재 접근한 행의 데이터를 꺼내는 방법 // get[타입]("컬럼명") int empNo = rset.getInt("EMPNO"); // 7369 String eName = rset.getString("ENAME"); // SMITH String job = rset.getString("JOB"); int mgr = rset.getInt("MGR"); Date hireDate = rset.getDate("HIREDATE"); int sal = rset.getInt("SAL"); int comm = rset.getInt("COMM"); int deptNo = rset.getInt("DEPTNO"); // 얻어온 행의 정보를 통해 Emp 객체를 만들어 // empList에 추가하기 empList.add(new Emp(empNo, eName, job, mgr, hireDate, sal, comm, deptNo)); } }catch(ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { // 1_9. JDBC 관련 객체 연결 끊기(자원 반환) // 연결을 끊을 경우 역순으로 끊어 나가기 try { if (rset!=null) { rset.close(); } if (stmt!=null) { stmt.close(); } if (conn!=null) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } return empList; }
프로그램과 DB 사이의 연결 역할을 해주는 JDBC 드라이버 로드인
Class.forName("oracle.jdbc.driver.OracleDriver");
코드를 살펴보자.
JDBC 드라이버 클래스는 oracle에 있는 정보를 연결하기위해 다음줄에 있는
conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:xe", "scott", "tiger");
이 코드의 연결 정보를 가져와 연결할 수 있게 해준다.
coDriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:xe", "scott", "tiger");속의 괄호들을 살펴보면
jdbc:oracle:thin : JDBC 드라이버의 타입이 thin 타입임을 의미
@127.0.0.1 -> 자신의 컴퓨터 로컬 ip (== @localhost 대체가능)
:1521 -> 오라클 listener의 포트번호 (포트: 응용 프로그램이 외부와 통신하기 위한 통로)
:xe -> 오라클 DB 이름
"scott" : 접속할 사용자 이름(계정)
"tiger" : 해당 계정의 비밀번호를 의미한다.
하지만 DB와의 연결과 관련된 요쇼들은 모두 SQLException을 발생시킬 가능성이 있기때문에
try - catch 문을 사용해서 catch에서 예외처리 ClassNotFoundException와 SQLException를 처리해준다.
catch(ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }
DB 접속 성공 시 DB에다가 전달할 SQL구문을 준비하고
오라클의 조회 구문인 SELECT 문을 사용해 JAVA로 불러 오도록 해보자
String query = "SELECT * FROM EMP";
EMP의 모든 사원을 조회하는 SQL구문이다.
이를 전달하여 결과를 얻어올 객체 Statement 객체를 생성한다.
stmt = conn.createStatement(); rset = stmt.executeQuery(query);
연결에 성공한 conn을 생성createStatement()된 stmt에 대입하고
대입한 stmt를 rset에 executeQuery(query)를 써서 DB로 SELECT문을 전달하고 결과로 ResultSet을 반환받는다.
while(rset.next()) { // ResultSet.next() : 반환받은 조회 결과를 // 커서를 이용해 순차적으로 한 행씩 접근 // 접근한 행이 존재하면 true, 없으면 false // ResultSet에서 현재 접근한 행의 데이터를 꺼내는 방법 // get[타입]("컬럼명") int empNo = rset.getInt("EMPNO"); // 7369 String eName = rset.getString("ENAME"); // SMITH String job = rset.getString("JOB"); int mgr = rset.getInt("MGR"); Date hireDate = rset.getDate("HIREDATE"); int sal = rset.getInt("SAL"); int comm = rset.getInt("COMM"); int deptNo = rset.getInt("DEPTNO"); // 얻어온 행의 정보를 통해 Emp 객체를 만들어 // empList에 추가하기 empList.add(new Emp(empNo, eName, job, mgr, hireDate, sal, comm, deptNo)); }
while문을 통해 전달 받은 조회 결과를 empList에 add함수를 이용해 하나씩 추가해준다.
추가를 하기위해선 getInt 또는 getString 을 이용해 데이터를 꺼낸 뒤
오라클에 있는 타입과 컬럼명을 맞춰서 설정 한 후 empList.add()함수에 추가한다.
모든 데이터를 추가 한 후
return empList;
empList 를 return해준다.
전달 하기 전에 finally를 통해 JDBC 관련 객체들의 연결을 끊어줘야 한다.
끊어줄 때는 역순으로 끊어주어야한다.
finally { // 1_9. JDBC 관련 객체 연결 끊기(자원 반환) // 연결을 끊을 경우 역순으로 끊어 나가기 try { if (rset!=null) { rset.close(); } if (stmt!=null) { stmt.close(); } if (conn!=null) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } }
전달을 한 뒤 EmpRun.java파일에 있는 main함수 실행하면
public class EmpRun { public static void main(String[] args) { new EmpView().displayMain(); } }
안에 있는 displayMain() 를 호출해서 출력된다.
오라클 안에 있는 데이터들을 JDBC를 통해 자바와 연결하여 출력한 화면이다.
JDBC 사용 객체
DriverManager
DriverManager란 데이터 원본에 JDBC드라이버를 통하여 커넥션을 만드는 역할로써 Class.forName() 메소드를 통해 생성되며 반드시 예외처리를 해야 한다.
직접 객체 생성이 불가능하고 getConnection() 메소드를 사용하여 객체 생성이 가능하다.
Connection
Connection이란 특정 데이터 원본과 연결된 커넥션을 나타내며 Statement객체를 생성할 때도 Connection객체를 사용하여 createStatement() 메소드를 호출하여 생성한다.
SQL문장을 실행시키기 전에 우선 Connection객체가 있어야 한다.
Statement
Statement란 Connection객체에 의해 프로그램에 리턴되는 객체에 의해 구현되는 일종의 메소드 집합 정의이다. Connection클래스의 createStatement() 메소드를 호출하여 얻어지며 생성된 Statement객체로 질의문장을 String객체에 담아 인자로 전달하여 executeQuery() 메소드를 호출하여 SQL질의를 수행한다.
728x90반응형'프로그래밍 언어 > JDBC' 카테고리의 다른 글
JDBC (Java DataBase Connectivity) - 수정 (0) 2020.11.18 JDBC (Java DataBase Connectivity) - 추가 (0) 2020.11.18 JDBC (Java DataBase Connectivity) - 검색 (0) 2020.11.17 JDBC (Java DataBase Connectivity) - 조회 Part 1 (0) 2020.11.13