본문 바로가기
Library/JDBC

[국비] JDBC 내용정리 Day01

by tpleehan 2021. 12. 15.

JDBC (Java Data Base Connectivity)

자바와 데이터베이스를 접속하기 위해서 만들어진 자바API이다. (자바와 DB를 연결해주는 통로 역할이라 보면 된다.)

Java의 문법은 데이터베이스가 읽을 수 없고, 데이터베이스의 문법은 Java가 읽을 수 없다.
하지만, JDBC Template의 라이브러리를 이용해서 자바 언어로 데이터베이스를 사용할 수 있다.

Insert

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;

public class JDBCInsert {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		
		System.out.println("*** 회원 가입 페이지 ***");
		
		System.out.print("아이디: ");
		String id = sc.next();
		
		System.out.print("비밀번호: ");
		String pw = sc.next();
		
		System.out.print("이름: ");
		String name = sc.next();
		
		System.out.print("이메일: ");
		String email = sc.next();
		
		
		////////////////////////////////////////////////////////////////////
		
		// SQL문 작성
		// SQL문은 String 형태로 작성한다.
		// 변수가 들어갈 자리에 ?(물음표)를 채운다.
		String sql = "INSERT INTO members VALUES (?, ?, ?, ?)";
		
		// DB 연동 순서
		// 1. DB 사용자 계정명, 암호, DB url 등 초기 데이터 변수 설정
		String url = "jdbc:oracle:thin:@localhost:1521:xe";
		String uid = "hr";
		String upw = "hr";
		
		// 사용할 객체의 변수를 미리 선언 (finally에서 사용하기 위함)
		Connection conn = null;
		PreparedStatement pstmt = null;
		
		try {
			// 2. JDBC 커넥터 드라이버를 호출
			Class.forName("oracle.jdbc.driver.OracleDriver");
			
			// 3. DB 연동을 위한 클래스들의 객체를 생성
			/*
			 * # a. Connection 객체
			 *  DB와의 연결(접속)을 위한 객체 
			 *  Connection 객체는 직접 new 연산자를 통해 객체를 생성하는 것이 아니고
			 *  DriverManager 클래스가 제공하는 정적 메서드인 
			 *  getConnection()을 호출하여 객체를 받아온다.
			 */
			conn = DriverManager.getConnection(url, uid, upw);
			
			/*
			 * # b. PreparedStatement 객체
			 *  SQL문을 실행시키기 위한 객체
			 *  pstmt 객체는 conn 객체가 제공하는 메서드 
			 *  prepareStatement() 메서드를 호출하여 객체를 받아온다.
			 *  매개값으로 실행시킬 sql문을 전달한다.
			 */
			pstmt = conn.prepareStatement(sql);
			
			/*
			 * # c. 물음표 채우기 (SQL문 완성하기)
			 *  pstmt 객체를 생성했다면 SQL의 ?를 채운다.
			 *  - ?는 첫번째 물음표부터 1번 인덱스값을 가지며, 순차적으로 인덱스가 1씩 증가한다.
			 *  - DB 테이블의 컬럼 타입에 따라 
			 *    setString(), setInt(), setDouble() ... 등의 메서드를 통해 ?를 채운다.
			 */
			pstmt.setString(1, id);
			pstmt.setString(2, pw);
			pstmt.setString(3, name);
			pstmt.setString(4, email);
			
			/*
			 * # d. pstmt 객체를 통한 SQL문 실행
			 * 1. INSERT, UPDATE, DELETE 명령일 경우
			 *    executeUpdate() 를 호출한다.
			 * 2. SELECT 명령일 경우 executeQuery()를 호출한다.
			 * 3. executeUpdate()는 sql문 실행 시
			 *    성공한 쿼리문의 개수를 리턴하고 실패 시 0을 리턴한다. 
			 */
			 
			int rn = pstmt.executeUpdate();
			
			if (rn == 1) {
				System.out.println("DB에 회원정보 저장 성공");
			} else {
				System.out.println("DB에 회원정보 저장 실패");
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			/*
			 * 4. DB 연동 객체들 자원 반납
			 * - 원활한 JDBC 프로그래밍을 위해 사용한 자원을 반납한다.
			 */
			try {
				pstmt.close();
				conn.close();
				sc.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		
	}

}

Update

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;

public class JDBCUpdate {

	public static void main(String[] args) {
		
		// ID를 입력받는다.
		// 수정할 이름과 이메일도 입력 받는다.
		// 지목한 ID의 이름과 이메일을 새로운 값으로 수정한다.
		// (ID)는 존재하는 ID를 넣어야 수정이 가능하다.
		
		Scanner sc = new Scanner(System.in);
		
		System.out.println("*** 회원  수정 페이지 ***");
		
		System.out.print("수정할 아이디: ");
		String id = sc.next();
		
		System.out.print("수정할 이름: ");
		String name = sc.next();
		
		System.out.print("수정할 이메일: ");
		String email = sc.next();
		
		String sql = "UPDATE members SET name = ?, email = ? WHERE id = ?";
		
		String url = "jdbc:oracle:thin:@localhost:1521:xe";
		String uid = "hr";
		String upw = "hr";
		
		Connection conn = null;
		PreparedStatement pstmt = null;
		
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn = DriverManager.getConnection(url, uid, upw);
			pstmt = conn.prepareStatement(sql);

			pstmt.setString(1, name);
			pstmt.setString(2, email);
			pstmt.setString(3, id);
			int rn = pstmt.executeUpdate();
			
			if (rn == 1) {
				System.out.println("회원정보 수정 성공");
			} else {
				System.out.println("회원정보 수정 실패");
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				pstmt.close();
				conn.close();
				sc.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		
	}

}

Selete

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class JDBCSelect {

	public static void main(String[] args) {
		
		String sql = "SELECT * FROM members";
		
		String url = "jdbc:oracle:thin:@localhost:1521:xe";
		String uid = "hr";
		String upw = "hr";
		
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null; // SELECT문에서만 사용하는 객체
		
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn = DriverManager.getConnection(url, uid, upw);
			pstmt = conn.prepareStatement(sql);
			
			// SELECT문은 executeQuery()를 통해 ResultSet 객체를 받아온다.
			// rs는 SELECT문의 쿼리 실행 결과 전체를 가지고 있다.
			rs = pstmt.executeQuery();
			
			/*
			 * - SELECT 쿼리문의 실행 결과, 조회할 데이터가 단 한 줄이라도 존재한다면
			 *   rs 객체의 next() 메서드는 true값을 리턴하면서 해당 행을 지목한다. 
			 *   (리턴값이 true이기 때문에 while을 사용 / 정확한 범위를 모르기 때문에 for보다 while이 좋다.) 
			 *   rs에게 데이터를 읽어올 때 반드시 next() 메서드를 먼저 호출해서
			 *   데이터의 존재 유무를 물어보고 확인해야 한다.
			 *   next() 메서드를 호출을 해야 행 하나만 지목되면서 데이터를 부를 수 있다.
			 */
			int count = 0;
			while (rs.next()) {
				/*
				 * - SELECT의 실행 결과 컬럼을 읽어오려면
				 *   rs의 getString(), getInt(), getDouble() ...
				 *   메서드를 사용해서 리턴을 받는다. (컬럼의 타입에 따라)
				 */
				String id = rs.getString("id"); // getString(컬럼명) 컬럼명은 반드시 정확하게 입력해야한다.
				String pw = rs.getString("pw"); // DB 컬럼명 확인을 해야 한다.
				String name = rs.getString("name");
				String email = rs.getString("email");
				
				System.out.printf("# 아이디: %s\n# 비밀번호: %s\n# 이름: %s\n# 이메일: %s\n", id, pw, name, email);
				System.out.println("-----------------------------------------");
				count++;
			} 
			System.out.println("조회된 행의 개수: " + count + "개");
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				rs.close();
				pstmt.close();
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		
	}

}

JDBC Quiz

사용자에게 Scanner를 이용해서 job_id를 입력 받는다.
입력 받은 job_id에 해당하는 사람들의 first_name, salary를 콘솔창에 출력한다.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;

public class JDBCSelect2 {

	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);
		
		System.out.print("조회할 job_id 입력 : ");
		String jobId = sc.next();
		
		String sql = "SELECT first_name, salary FROM employees WHERE job_id = ?";
		
		String url = "jdbc:oracle:thin:@localhost:1521:xe";
		String uid = "hr";
		String upw = "hr";
		
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn = DriverManager.getConnection(url, uid, upw);
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, jobId);
			
			rs = pstmt.executeQuery();
			
			int count = 0;
			while (rs.next()) {
				String firstName = rs.getString("first_name");
				int salary = rs.getInt("salary");
				
				System.out.printf("# first_name: %s\n# salary: $%d\n", firstName, salary);
				System.out.println("-----------------------");
				count++;
			}
			if (count == 0) {
				System.out.println("해당 job_id에 대한 조회 결과가 없습니다.");
				
			} else {
				System.out.println("조회된 행의 수: " + count + "개");
				
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				rs.close();
				pstmt.close();
				conn.close();
				sc.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		
	}

}​

 

댓글