관리 메뉴

개발 노트

8/3 JDBC, 데이터베이스, 스키마, DB연결, JDBC 프로그래밍 단계 및 Class 본문

프로젝트 기반 JAVA 응용 SW개발 : 22.07.19~23.01.20/JDBC

8/3 JDBC, 데이터베이스, 스키마, DB연결, JDBC 프로그래밍 단계 및 Class

hayoung.dev 2022. 8. 4. 09:19

[19. JDBC]

1. 데이터베이스 개요

연관된 데이터들의 묶음을 데이터베이스라고 한다.

- 데이터베이스에서는 정보를 저장하기 위해서 테이블을 사용

- 테이블은 표처럼 볼 수 있도록 로우(ROW)와 칼럼(COLUMN)으로 구성

2. 데이터베이스 Table의 구성 및 Script

 

이것이 스키마이다. 데이터구조임.

CREATE TABLE DEPT
( "DEPTNO" NUMBER(2,0), 
"DNAME" VARCHAR2(14 BYTE), 
"LOC" VARCHAR2(13 BYTE), 
PRIMARY KEY ("DEPTNO")
)

 

3. DB 연결하기

1) 위의 파일을 복사해서

C:\Program Files\jdk-11.0.12\bin

경로에 붙여넣기

 

2) OraDr.java

package ch18;

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

public class OraDr {

	public static void main(String[] args) throws SQLException {
		String driver 	= "oracle.jdbc.driver.OracleDriver";
		//127.0.0.1은 IP번호, 1521은 PORT번호, xe는 SID(Service ID)
		//127.0.0.1 주소는 나 자신임.
		//C:\oraclexe\app\oracle\product\11.2.0\server\network\ADMIN\tnsnames.ora
		//에 (SERVICE_NAME = XE) 라고 적혀있다. 데이터베이스를 구별하는 아이디. 원하는 곳에 접속할 때 사용
		String url 		= "jdbc:oracle:thin:@127.0.0.1:1521:xe";
		
		//driver가 없을 수 있으므로 예외처리
		try {
			Class.forName(driver);
			//접속하려는 DB주소, 아이디, 비번
			Connection conn = DriverManager.getConnection(url, "scott", "tiger");
			System.out.println("Start");
			//DB 접근 성공 여부 확인함.
			if(conn != null) {
				System.out.println("Success 연결 성공");
			} else {
				System.out.println("Fail");
			}
			conn.close();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
}

*oracle에서 scott 우클릭 > 속성 > 세부정보에 적혀있는 호스트이름, 포트번호, SID가 같은것을 볼 수 있음.

 

*포트번호 개념

unix는 물리서버이다. unix 안에 g/w, m/w, web/DB 등이 있음. 이들은 논리서버이다.

이 논리서버를 가리킬 때 포트번호를 사용함. 즉 구체적인 주소임.

 

3) ch18 우클릭 > build path > configure build path> libraries > classpath > add External JARs > ojdbc6.jar 파일 선택하여 연결 (버전이 올라가도 똑같이 이렇게 해 주기)

 

연결 결과

 

4. JDBC 프로그래밍 단계 및 Class

차례로 사용클래스를 써가며 단계를 수행한다.

- SQL문 전송에서 select는 executeQuery()를 사용해야 하고, insert, delete, update는 executeUpdate()를 사용해야 한다.

select일 경우 결과받기를 ResultSet을 통해 해줘야 한다. (insert, delete, update는 ResultSet이 필요없다.)

- (면접에서 물어볼 수 있음)

java.sql.Statement 문은 보안에 취약함. secure코딩을 하려면 java.sql.preparedStatement 문을 써야 함. 이 객체를 쓰려면 sql 작성 시 ?을 사용함. 또한 오히려 이것이 가독성있음.

 

1) java.sql.Statement : execute에 sql문장을 줌.

2) java.sql.preparedStatement : prepared에 sql문장을 줌

3) CallableStatement : preparedStatement와 비슷한 구조를 가지며 그래서 이것도 보안이 좋음. (사실은 CallableStatement가 preparedStatement의 자식임.)

 

 

5.OraSelect1.java 

package ch18;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;

public class OraSelect1 {

	public static void main(String[] args) throws SQLException {
		Scanner sc = new Scanner(System.in);
		System.out.println("부서 코드를 입력하세요");
		int deptno = sc.nextInt();
		// 서버정보. 아까 연결 성공 했으므로 복붙으로 쓰기.
		String driver = "oracle.jdbc.driver.OracleDriver";
		String url = "jdbc:oracle:thin:@127.0.0.1:1521:xe";
		String sql = "Select dname, loc From Dept Where deptno=" + deptno;

		// 자동완성은 sql로 해야 함.
		Connection conn = null; // DB 연결
		Statement stmt = null; // sql 처리 기본 객체
		ResultSet rs = null; // select를 하면 꼭 result를 가져와야 함.
		try {
			//드라이버 클래스 로딩
			Class.forName(driver);
			//Connection 객체 생성
			conn = DriverManager.getConnection(url, "scott", "tiger");
			stmt = conn.createStatement(); // stmt

			rs = stmt.executeQuery(sql);
			// rs.next : 값이 있는지 확인
			if (rs.next()) {
				String dname = rs.getString("dname"); // rs.getString(1) <-- dname
				String loc = rs.getString("loc"); // rs.getString(2) <-- loc
				//String loc = rs.getString(2); //바로 윗 줄 이렇게도 쓸 수 있음.
				System.out.println("부서번호 : " + deptno);
				System.out.println("부서명 : " + dname);
				System.out.println("위치 : " + loc);
			} else {
				System.out.println("자료가 없습니다");
			}
		} catch (Exception e) {
			System.out.println(e.getMessage());
		} finally {
			if (rs != null)
				rs.close();
			if (stmt != null)
				stmt.close();
			if (conn != null)
				conn.close();

		}
		sc.close();
	}

}

출력 결과

 

6. OraInsert.java

package ch18;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;

public class OraInsert {

	public static void main(String[] args) throws SQLException {
		Scanner sc = new Scanner(System.in);
		System.out.println("부서번호 입력?");	String deptno = sc.nextLine();
		System.out.println("부서명 입력?"); 	String dname = sc.nextLine();
		System.out.println("위치 입력?"); 		String loc = sc.nextLine();
				
		Connection conn = null;
		Statement stmt = null;
		String driver = "oracle.jdbc.driver.OracleDriver";
		String url = "jdbc:oracle:thin:@127.0.0.1:1521:xe";
		//String sql = "Insert INTO dept VALUES (" + deptno+ ",'"+ dname + "', '" + loc + "') ";
		String sql = String.format("Insert INTO dept VALUES (%s, '%s', '%s')", deptno, dname, loc);
		System.out.println("sql->"+sql);
		
		try {
			Class.forName(driver);
			conn = DriverManager.getConnection(url, "scott", "tiger");
			stmt = conn.createStatement(); // stmt
			
			//insert delete update는 resultset을 쓰지 않음.
			int result = stmt.executeUpdate(sql);
			if (result > 0)
				System.out.println("입력성공");
			else
				System.out.println("입력실패");
		} catch (Exception e) {
			System.out.println(e.getMessage());
		} finally {
			if (stmt != null)
				stmt.close();
			if (conn != null)
				conn.close();
		}
		sc.close();
	}

}

출력 결과

Oracle DB 화면

 

OraDelete.java (과제 : pk(deptno)를 입력하여 지우기)

package ch18;

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

public class OraDelete {

	public static void main(String[] args) throws SQLException {
		
		Scanner sc = new Scanner(System.in);
		System.out.println("삭제할 부서번호를 입력하세요");
		String deptno = sc.nextLine();
		Connection conn = null;
		Statement stmt = null;
		String driver = "oracle.jdbc.driver.OracleDriver";
		String url = "jdbc:oracle:thin:@127.0.0.1:1521:xe";
		String sql = String.format("DELETE dept WHERE deptno = %s", deptno);
		System.out.println("sql->" + sql);
		
		try {
			Class.forName(driver);
			conn = DriverManager.getConnection(url, "scott", "tiger");
			stmt = conn.createStatement();
			
			int result = stmt.executeUpdate(sql);
			if (result > 0)
				System.out.println("삭제성공");
			else
				System.out.println("삭제실패");
			
		} catch (Exception e) {
			System.out.println(e.getMessage());
		} finally {
			if (stmt != null)
				stmt.close();
			if (conn != null)
				conn.close();
		}
		sc.close();

	}

}

출력 결과

 

원래 테이블

삭제 후 테이블

 

반응형