[JDBC] 이클립스(Eclipse)와 Oracle 연동하기2

Jungwook·2023년 6월 11일
0

JDBC

목록 보기
6/6

JDBC 사용하기(Oracle 연동)을 클래스화 하기

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

// DB연결을 클래스화 

public class DBcon {

	public static Connection dbConn;

	public static Connection getConnection() {

		Connection con = null;

		try {
			String user = "유저이름";
			String pw = "비밀번호";
			String url = "jdbc:oracle:thin:@localhost:1521:xe";

			// jdbc:oracle:thin
			// 오라클에 접속하겠다고 알려줌

			// 내 ip 주소
			// @localhost

			// 포트 번호 -> 1521
			// 접속할 DB 이름 xe

			Class.forName("oracle.jdbc.driver.OracleDriver"); // JDBC 드라이버(ojdbc6~8.jar)를 로딩하는 부분이다.

			con = DriverManager.getConnection(url, user, pw); // 데이터베이스 연결

			if (con != null) {
				System.out.println("연결성공");

			}

		} catch (ClassNotFoundException e) {
			// 로딩 실패 classNotFoundException
			System.out.println("데이터베이스 연결 에러!" + e.toString());
		} catch (SQLException e) {
			System.out.println("DB접속 실패 :" + e.toString());
		}

		return con;

	}
}

SELECT 테스트

1. JDBC를 이용하여 Oracle의 CAFE 테이블을 조회(SELECT)해보자.

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

public class PreparedStatementTest {

	public static void main(String[] args) {

		Connection con = null; // DB연결된 상태(세션)을 담는 객체
		PreparedStatement pstm = null; // sql문을 나타내는 객체
		ResultSet rs = null; // 쿼리문을 날린 것에 대한 반환값을 담는 객체

		// 쿼리문을 전송할 수 있는 인터페이스 2가지
		// 공통점
		// 둘다 쿼리를 전송기능을 가지고 있다.
		// try ~ catch문으로 throw를 처리해야된다. 예외처리!
		// String객체를 전달한다.
		// Statement 정적인 쿼리문을 처리할 수 있다.
		// 쿼리문에 값이 미리 입력 되어있어야한다.

		// Statement 컴파일이 될 때마다 서버에가서 컴파일을 계속해서
		// 정보를 가지고 온다.

		try {
			// sql 문장을 만들고 만약 문장이 질의어(select문)라면
			// 그 결과를 담는 resultset객체를 준비한 후 실행한다.

			// SQL 쿼리 실행
			String quary = "SELECT * FROM CAFE";

			con = DBcon.getConnection();
			pstm = con.prepareStatement(quary);
			rs = pstm.executeQuery();

			// 결과 처리
			while (rs.next()) {

				// 결과 값 추출
				String CAFEID = rs.getString("CAFEID");
				String CAFENAME = rs.getString("CAFENAME");
				String CORPORATION = rs.getString("CORPORATION");
				int PRICE = Integer.parseInt(rs.getString("PRICE"));

				// 필요한 작업 수행
				System.out.print(CAFEID);
				System.out.print(CAFENAME);
				System.out.print(PRICE);
				System.out.print(CORPORATION);
				System.out.println();

			}

		} catch (SQLException e) {
			System.out.println("select  문에서 예외가 발생할 수 있다.");
		} finally {
			// 연결 및 자원 해제
			try {
				if (rs != null) {
					rs.close();
				}
				if (pstm != null) {
					pstm.close();
				}
				if (con != null) {
					con.close();
				}

			} catch (Exception e) {
				System.out.println(e.toString());
			}
		}

	}
}

2. JDBC를 이용하여 Oracle의 BEVERAGES테이블, ORDER_DETAILS 테이블을 동시에 조회(SELECT)해보자.

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

public class BEVERAGES1 {

	public static void main(String[] args) {

		Connection con = null; // DB연결된 상태(세션)을 담는 객체
		PreparedStatement pstm = null; // sql문을 나타내는 객체
		ResultSet rs = null; // 쿼리문을 날린 것에 대한 반환값을 담는 객체

		try {
			// sql 문장을 만들고 만약 문장이 질의어(select문)라면
			// 그 결과를 담는 resultset객체를 준비한 후 실행한다.

			con = DBcon.getConnection();

			// SQL 쿼리 실행
			// BEVERAGES테이블
			String quary = "SELECT * FROM BEVERAGES";
			pstm = con.prepareStatement(quary);
			rs = pstm.executeQuery();

			// 결과 처리
			System.out.println("BEVERAGES 테이블");
			while (rs.next()) {

				// 결과 값 추출
				String NAME = rs.getString("NAME");
				int PRICE = Integer.parseInt(rs.getString("PRICE"));
				String BTYPE = rs.getString("BTYPE");

				// 필요한 작업 수행
				System.out.print(NAME);
				System.out.print(PRICE);
				System.out.print(BTYPE);
				System.out.println();
			}

			// ORDER_DETAILS테이블
			String quary2 = "SELECT * FROM ORDER_DETAILS";
			pstm = con.prepareStatement(quary2);
			rs = pstm.executeQuery();

			System.out.println("ORDER_DETAILS 테이블");
			while (rs.next()) {

				// 결과 값 추출
		
				int ORDER_ID = Integer.parseInt(rs.getString("ORDER_ID"));
				int BEVERAGE_ID = Integer.parseInt(rs.getString("BEVERAGE_ID"));
				int COUNT = Integer.parseInt(rs.getString("COUNT"));

				// 필요한 작업 수행
				System.out.print(ORDER_ID + ",");
				System.out.print(BEVERAGE_ID + ",");
				System.out.print(COUNT );
				System.out.println();
			}

		} catch (SQLException e) {
			System.out.println("select  문에서 예외가 발생할 수 있다.");
		} finally {
			// 연결 및 자원 해제
			try {

				if (rs != null) {
					rs.close();
				}
				if (pstm != null) {
					pstm.close();
				}
				if (con != null) {
					con.close();
				}

			} catch (Exception e) {
				System.out.println(e.toString());
			}
		}

	}
}

INSERT 테스트

3. JDBC를 이용하여 Oracle의 TEST 테이블에 값을 INSERT 해보자.

Statement 활용

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class StatementTest {

	public static void main(String[] args) {

		Connection con = null; // DB연결된 상태(세션)을 담는 객체
		Statement stm = null; // sql문을 나타내는 객체

		try {
			con = DBcon.getConnection();
			stm = con.createStatement();

			String quary = "INSERT INTO TEST VALUES('ID1','PW1','NAME1')";
			

			int success = stm.executeUpdate(quary);

			if (success > 0) {
				System.out.println("데이터 입력 성공");
			} else {
				System.out.println("데이터 입력 실패");
			}

		} catch (SQLException sql) {
			System.out.println(sql.toString());
		}

	}
}

PreparedStatement 활용


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

public class PreparedStatementInsert {

	public static void main(String[] args) {

		Connection conn = null; // DB연결된 상태(세션)을 담은 객체
		PreparedStatement pstm = null; // SQL 문을 나타내는 객체

		try {

			String quary = "INSERT INTO TEST VALUES(?, ?, ?)";

			conn = DBcon.getConnection();
			pstm = conn.prepareStatement(quary);

			// 쿼리에 값을 세팅한다.
			// 여기서 1, 2, 3은 첫번째, 두번째, 세번째 위치홀더 라는 뜻
			pstm.setString(1, "id2");
			pstm.setString(2, "pw2");
			pstm.setString(3, "name2");

			int success = pstm.executeUpdate();

			if (success > 0)
				System.out.println("데이터 입력 성공");
			else
				System.out.println("데이터 입력 실패");

		} catch (SQLException sql) {
			System.out.println(sql.toString());
		}

	}
}

Statement 활용했을 때와 PreparedStatement 활용했을 때 모두 값이 정상적으로 입력된 것을 확인할 수 있다.

Statement 활용했을 때와 PreparedStatement 활용했을 때의 차이점은?

  1. 컴파일과 실행 단계:
  • Statement: SQL 문이 실행되기 전에 매번 SQL 문이 데이터베이스로 보내져서 컴파일되고 실행된다.
  • PreparedStatement: SQL 문은 데이터베이스로 보내지기 전에 먼저 컴파일되어 데이터베이스에서 미리 컴파일된 상태로 캐시된다. 이후 동일한 SQL 문이 다시 실행되면 컴파일 단계를 거치지 않고 미리 컴파일된 실행 계획을 사용하여 실행. 따라서 PreparedStatement는 반복적으로 실행되는 쿼리에 효율적이다.
  1. 매개 변수 바인딩:
  • Statement: 매개 변수를 사용하여 동적인 쿼리를 작성할 수 없다. SQL 문 안에 하드코딩된 값을 사용해야 한다.
  • PreparedStatement: SQL 문에 매개 변수를 사용하여 동적인 쿼리를 작성할 수 있다. 쿼리에 ?와 같은 플레이스홀더를 사용하고, 실행하기 전에 매개 변수를 해당 플레이스홀더에 바인딩할 수 있다. 이는 SQL 쿼리의 재사용성과 보안성을 향상시킨다.
  1. SQL 인젝션 방어:
  • Statement: Statement는 문자열을 직접 쿼리에 추가하므로 악의적인 사용자가 입력한 데이터에 대한 검증이 충분하지 않을 경우 SQL 인젝션 공격에 취약할 수 있다.
  • PreparedStatement: PreparedStatement는 매개 변수 바인딩을 통해 SQL 인젝션을 방어한다. 데이터베이스가 매개 변수를 쿼리로 취급하고 처리하기 때문에 인젝션 공격의 위험이 줄어든다.
  1. 성능:
  • Statement: 매번 SQL 문이 컴파일되므로 실행할 때마다 오버헤드가 발생할 수 있다.
  • PreparedStatement: 미리 컴파일된 실행 계획을 사용하므로 반복 실행 시에는 성능 향상을 기대할 수 있다.

0개의 댓글