package ch02_insert;

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

/*
 * # JDBC 절차
 * 1. DriverManager 에 해당 DBMS Driver 등록
 * 2. Driver로 부터 Connection instance 획득
 * 3. Connection 객체의 PreparedStatement() 메서드 사용해서 PreparedStatement 객체 생성
 *    - 해당 인수 데이터에 대해 위치홀더(?)를 사용해서 SQL 문장을 정의. 
 * 4. 쿼리 실행 결과.
 * 
 * # PreparedStatement : java.sql.PreparedStatement → String sql의 쿼리를 실행해줌.
 * - 쿼리 실행을 위한 class
 * - 쿼리 실행 메서드
 * 	 > int executeUpdate() : insert, delete, update 문을 실행해서 성공한 행의 수를 반환.
 * 	   ResultSet executeQuery() : select 문을 실행한 결과의 테이블 내용을 Resultset에 담아서 반환. 
 */
class Insert {
	// 연결 정보
	private String url = "jdbc:oracle:thin:@localhost:1521:xe";
	private String id = "DBTEST";
	private String pw = "a1234";
	
	public Insert() {
		// jdbc 드라이버 할당.
		try {
			Class.forName("oracle.jdbc.OracleDriver");
			System.out.println("로딩 성공...");
		} catch (Exception e) {
			System.out.println("로딩 실패...");
			e.printStackTrace();
		}
	} // Insert() end
	
	public Connection getConnection() {
		Connection con = null;
		try {
			// DB연결 객체 생성 -> getConnection : connection 객체 생성
			con = DriverManager.getConnection(url,id,pw);
			System.out.println("연결 성공...");
		} catch (Exception e) {
			System.out.println("연결 실패...");
			e.printStackTrace();
		}
		return con;
	} // getConnection() end
	
	// 회원 추가
	public void insertArticle() {
		Scanner sc = new Scanner(System.in);
		System.out.print("이름 입력 > ");
		String name = sc.next();
		System.out.print("나이 입력 > ");
		int age = sc.nextInt();
		System.out.print("키 입력   > ");
		double height = sc.nextDouble();
		
		Connection con = null;
		PreparedStatement pstmt = null;
		int res = 0;
		try {
			// 질의 문자열
			String sql = "insert into member values(?,?,?,sysdate)"; // ?:데이터 위치 지정. SQL INJECTION 보안 문제 때문에, 나중에 완성해서 DB에 처리.
			con = getConnection();               // connection 객체 생성
			pstmt = con.prepareStatement(sql);	 // 쿼리문 실행 객체 생성
			pstmt.setString(1, name);            // 쿼리문완성 1
			pstmt.setInt(2, age);           	 // 쿼리문완성 2
			pstmt.setDouble(3, height);          // 쿼리문완성 3
			res = pstmt.executeUpdate(); 		 // 쿼리문실행 = 성공한 행의 수 반환 
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if(pstmt!=null) pstmt.close();
				if(con!=null) con.close();
				if(sc!=null) sc.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		System.out.println(res + "개의 행이 추가되었습니다.");
	} // insertArticle() end
}

public class InsertTest {
	public static void main(String[] args) {
		Insert data = new Insert();
		data.insertArticle();
	}
}