JDBC DB에 접속

최주영·2023년 4월 13일
0

JDBC

목록 보기
2/4
  • JDBC 대표적인 표준 인터페이스 기능

(1) : java.sql.Connection - DB에 연결
(2) : java.sql.Statement - SQL을 담은 내용
(3) : java.sql.ResultSet - SQL 요청 응답


✅ 순서

(1) : jar 파일이 제공하는 클래스가 있는지 확인

Class.forName("oracle.jdbc.driver.OracleDriver"); 
// 반드시 try-catch로 예외처리해야함 (ClassNotFoundException) -> 클래스가 없을 경우 예외처리

(2) : DriverManager 클래스를 이용하여 접속 객체 만들기 -> 커넥션 얻기
getConnection 메소드를 이용하여 DB가 있는 URL에 접속! -> 3개의 매개변수 필요!

커넥션 생성에 대해 더 자세하게 알려면 ->

		첫번째 인수 : 접속할 DB의 주소, 버전정보, 포트번호(String)
		오라클 : jdbc:oracle:thin:@ip주소:포트번호:버전
		두번째 인수 : DB접속 계정명 (String)
		세번재 인수 : DB접속 계정 비밀번호 (String
Connection conn = DriverManager.getConnection(
						"jdbc:oracle:thin:@localhost:1521:xe",
						"student",  // DB 계정명
						"student");  // DB 계정 비밀번호

(3) : 접속된 DB에 SQL문을 실행하고 결과를 가져오기

(3)-1 : 쿼리문 작성

String sql = "SELECT * FROM MEMBER";

(3)-2 : Statement 객체 가져오기
Connection 클래스가 제공하는 멤버메소드인 createStatement() 메소드를 이용

Statement stmt = conn.createStatement(); // // SQLException 해야함

(3)-3 : 쿼리문 실행

ResultSet rs = stmt.executeQuery(sql);  
// Statement가 제공하는 executeQuery() 실행하고 반환은 ResultSet 객체로 받는다

SELECT : executeQuery("sql문") 실행 -> ResultSet 객체를 반환 [하나의 객체 자체 (여러컬럼 있음)]
INSERT, UPDATE, DELETE : executeUpdate("sql문") 실행 -> int 반환

(3)-4 : 반환된 값 이용하기 (ResultSet 또는 int)

  • ResultSet 객체 자료형
    -> Iterator 방식과 동일 ( 다음 데이터를 갖고 올 수 있음)
    -> ResultSet객체가 제공하는 메소드를 이용해서 컬럼별 값을 가져올 수 있음

  • ResultSet 메소드
    -> next() : 데이터의 다음 row를 지정 [반환형 : boolean]
    -> get[String,Int,Date]("컬럼명"||인덱스번호)

    getString() : char, varchar2, nchar, nvarchar2 자료형을 가져올 때
    getInt() / getDouble() : number 자료형을 가져올 때
    getDate() / getTimeStamp() : date, timestamp 자료형을 가져올 때

		// 하나의 데이터를 가져올 때 경우
			rs.next(); // 1번째 row를 지칭
			String memberId = rs.getString("member_id"); // 문자열 자료형인 member_id 컬럼을 가져옴
		 	String memberPwd = rs.getString("member_pwd"); // 문자열 자료형인 member_pwd 컬럼을 가져옴
			int age = rs.getInt("age"); // 숫자 자료형인 age 컬럼을 가져옴
			Date enrollDate = rs.getDate("enroll_date"); // 날짜 자료형인 enroll_date 컬럼을 가져옴
            
      
      // 다수의 데이터를 가져올 때 경우
      // 반복문을 사용하여 next() 함수를 사용한다
      			while(rs.next()) {
				String memberId = rs.getString("member_id");
				String memberPwd = rs.getString("member_pwd");
				int age = rs.getInt("age");
				Date enrollDate = rs.getDate("enroll_date");
				System.out.println(memberId + " "+ memberPwd+" "+age+" "+enrollDate);
			}

(4) 생성한 객체는 반드시 반환해줘야함 -> (close) 메소드

finally {
			//5. 생성한 객체를 반드시 반환해줘야한다
			// Connection, Statement, ResultSet
			// close() 메소드를 이용해서 반환을 한다.
			// 생성한 역순으로 반환해줌
			try {
				if(rs!=null)rs.close();
				if(stmt!=null)stmt.close();
				if(conn!=null)conn.close();
			}catch(SQLException e) {
				e.printStackTrace();
			}

		}

위에서 배운 모든 내용을 코드로 정리하기

package com.jdbc.controller;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import com.jdbc.model.vo.Member;

public class BasicJdbcTest {

	public static void main(String[] args) {

		// finally 부분에다 쓰기 위해서 맨위에다 선언함
		Connection conn = null;
		Statement stmt = null;
		ResultSet rs = null;
		
		// jdbc를 이용해서 오라클 연동해보기
		// 1. 오라클에서 제공하는 ojdbc.jar 파일을 버전에 맞춰서 다운로드
		// 2. 이클립스에서 프로젝트를 생성하고 생성된 프로젝트 라이브러리에 다운받은 jar 파일을 추가한다
		
		// 프로젝트 (애플리케이션)에서 DB에 접속하기
		// 1. jar 파일이 제공하는 클래스가 있는지 확인하기 -> jar 파일 등록여부 확인
		// jar파일 없거나 오타나면 오류남
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			// 2. DriverManager 클래스를 이용해서 접속하는 객체를 만들어준다.
			// DrvierManager 클래스가 제공하는 getConnection() static 메소드를 이용해서
			// Connection 객체를 가져온다. -> getConnection() 메소드는 Connection 객체를 반환
			// getConnection 이용하기 -> 3개의 매개변수가 선언되어있음
			// 첫번째 인수 : 접속할 DB의 주소, 버전정보, 포트번호(String)
			//  접속할 DBMS별로 문자열 패턴을 정해놓음!
			//  오라클 : jdbc:oracle:thin:@ip주소:포트번호:버전
			// 두번째 인수 : DB접속 계정명 (String)
			// 세번재 인수 : DB접속 계정 비밀번호 (String)
			conn = DriverManager.getConnection(
						"jdbc:oracle:thin:@localhost:1521:xe",
						"student",
						"student");
			
			// 트렌젝션을 개발자가 직접 처리하겠다.
			conn.setAutoCommit(false); // 자동커밋하지 못하도록 막음
			
			System.out.println("DB 접속 확인 완료"); // 잘접속했는지 확인 문구
			
			// 3. 접속된 DB에 SQL문을 실행하고 결과를 가져와야함
			// SQL문을 실행하기 위해서 실행할 객체가 필요함
			// StateMent, PreparedStateMent : 문자열로 작성한 sql 구문을 연결된 DB에서
			// 실행하는 객체
			// sql문을 실행하려면 Statement의 멤버메소드 executeQuery(), executeUpdate() 메소드를 이용
			// SELECT : executeQuery("sql문") 실행  -> ResultSet 객체를 반환
			// INSERT, UPDATE, DELETE : executeUpdate() 실행 -> int 반환
			
			// 3.1) 쿼리문 작성하기
			// member 테이블에 있는 아이디가 admin인 사원 조회하기
			// SELECT * FROM MEMBER WHERE MEMBER_ID = 'admin';
			// 문자열 변수에 sql문을 저장할때는 ;를 생략한다!
			// String sql = "SELECT * FROM MEMBER WHERE MEMBER_ID = 'admin'";
			// 등록된 회원 전체 가져오기
			String sql = "SELECT * FROM MEMBER";
			
			// 3.2) Statement 객체 가져오기
			// import할때 인터페이스꺼 import 하기
			// Connection 클래스가 제공하는 멤버메소드인 createStatement() 메소드를 이용
			stmt = conn.createStatement(); // SQLException 해줘야함
			// 3.3) 쿼리문 실행하기
			// Statement가 제공하는 executeQuery() 실행하고 반환은 ResultSet 객체로 받는다
			rs = stmt.executeQuery(sql);
			System.out.println(rs);
			
			// 3.4) ResultSet 이용하기 (Iterator 방식과 동일함 (다음 데이터를 가져옴))
			// 반환된 SELECT 문의 실행결과는 ResultSet객체가 제공하는 메소드를 이용해서
			// 컬럼별 값을 가져온다.
			// next() : 데이터의 row를 지정 -> row 데이터를 가져옴  [반환형: booelan]
 			// get자료형[String,Int,Date]("컬럼명"||인덱스번호) 
			// getString() : char, varchar2, nchar, nvarchar2 자료형을 가져올 때
			// getInt()/getDouble() : number 자료형을 가져올 때
			// getDate() / getTimeStamp() : date, timestamp 자료형을 가져올 때
//			rs.next(); // 1번째 row를 지칭
//			//컬럼명과 테이블명은 대소문자 구분 안함
//			String memberId = rs.getString("member_id");
//			String memberPwd = rs.getString("member_pwd");
//			int age = rs.getInt("age");
//			// SQL date를 import하는것이 좋음
//			Date enrollDate = rs.getDate("enroll_date");

			
// 다수의 데이터 가져오기
			
			
//			while(rs.next()) {
//				String memberId = rs.getString("member_id");
//				String memberPwd = rs.getString("member_pwd");
//				int age = rs.getInt("age");
//				Date enrollDate = rs.getDate("enroll_date");
//				System.out.println(memberId + " "+ memberPwd+" "+age+" "+enrollDate);
//			}

			// DB의 row를 가져왔을때 자바에서는 클래스로 저장해서 관리
			

			
			// row 한개만 가져올때 경우
//			Member m = new Member();
//			while(rs.next()) {
//				m.setMemberId(rs.getString("member_Id"));
//				m.setMemberPwd(rs.getString("member_pwd"));
//				m.setMemberName(rs.getString("member_name"));
//				m.setGender(rs.getString("gender"));
//				m.setAge(rs.getInt("age"));
//				m.setEmail(rs.getString("email"));
//				m.setPhone(rs.getString("phone"));
//				m.setAddress(rs.getString("address"));
//				m.setHobby(rs.getString("hobby"));
//				m.setEnrollDate(rs.getDate("enroll_date"));
//
//				System.out.println(m);
//		}
			

		
			
			// row 여러개를 가져올 때 경우
			// member 리스트에는 Member 객체만 들어갈수있다
			List<Member> members = new ArrayList();
			
			while(rs.next()) {
				Member m = new Member();
				m.setMemberId(rs.getString("member_id"));
				m.setMemberPwd(rs.getString("member_pwd"));
				m.setMemberName(rs.getString("member_name"));
				m.setGender(rs.getString("gender"));
				m.setAge(rs.getInt("age"));
				m.setEmail(rs.getString("email"));
				m.setPhone(rs.getString("phone"));
				m.setAddress(rs.getString("address"));
				m.setHobby(rs.getString("hobby"));
				m.setEnrollDate(rs.getDate("enroll_date"));
				members.add(m);
			}
			
			members.forEach((m)-> System.out.println(m));
			
			
			// DML구문 실행하기
			// insert, update, delete문
			// 트렌젝션처리를 해줘야한다
			// 1. sql문 작성 -> 리터럴 형태에 맞춰서 작성해야함
			
			sql = "INSERT INTO MEMBER VALUES('inhoru','inhoru',"
					+ "'최인호','M',26,'inhoru@inhoru.com',"
					+ "'0101234145','금천구','영화감상,애니감상,코딩',SYSDATE)";
			int result = stmt.executeUpdate(sql);
			
			
			// 트렌젝션구문으로 처리하기
			if(result>0) conn.commit(); // 행이 잘 삽입됬으면 커밋
			else conn.rollback(); // 그렇지 않으면 되돌리기
			
			System.out.println(result);
			
			

			
			
		}catch(ClassNotFoundException e) {
			e.printStackTrace();
		}catch(SQLException e) {
			e.printStackTrace();
		}finally {
			//5. 생성한 객체를 반드시 반환해줘야한다
			// Connection, Statement, ResultSet
			// close() 메소드를 이용해서 반환을 한다.
			// 생성한 역순으로 반환해줌
			try {
				if(rs!=null)rs.close(); // 값이 널값일때 .연사자로 접근하면 Nullpoint 예외처리 발생하기때문
				if(stmt!=null)stmt.close();
				if(conn!=null)conn.close();
			}catch(SQLException e) {
				e.printStackTrace();
			}

		}
		
		
		
	}

}
profile
우측 상단 햇님모양 클릭하셔서 무조건 야간모드로 봐주세요!!

0개의 댓글