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(); } } } }
댓글