[JAVA] Oracle DB Java 연결하기

Teeput ㅣ 2024. 4. 16. 12:56

📚 들어가기


Use Database Management System : ORACLE

 

📌 Data Source Explorer 연결

 

오른쪽 상단

오른쪽 상단을 보면 Java EE가 있을거다 이걸 클릭한다 없으면 왼쪽에 Open Perspective 를 클릭하여 Java EE를 추가한다

 

기본적으로 아무것도 클릭하지 않았으면 아래 Data Source Explorer가 있을거다

하단

Database Connections에 우클릭 하여 new 클릭한다

 

 

 

자신이 사용하는 데이터베이스를 클릭 후 Next를 눌러준다

 

 

 

그러면 이렇게 아무것도 없는 화면이 나올건데 Drivers : 오른쪽 끝에 동그라미를 클릭한다

 

 

 

자신이 사용하는 데이터베이스 버전 맞춰서 클릭 후 JAR List로 넘어간다

 

 

 

clear all 을 클릭 후 add jar을 클릭하여 jdbc를 추가한다

데이터베이스를 설치할 때 따로 경로를 지정하지 않았으면 아래 경로에 설치됐을 것이다

C:\app\User\product\21c\dbhomeXE\jdbc\lib

다음으로 properties로 넘어간다

 

 

 

자신의 데이터베이스 정보를 입력하고 ok를 클릭한다

 

 

 

필자는 오라클을 공부하고 있어서 xe버전을 사용중이라 이렇게 만들었다 다 완성하고 test Connection을 클릭하면 결과가 나올것이다 정상적으로 ping succeeded 가 나오면 finish를 클릭하여 마친다

 

 

 

이후 연결이 완료된걸 확인할 수 있다

 

 

📌 프로젝트에 적용

C:\app\User\product\21c\dbhomeXE\jdbc\lib 이 경로에서 jdbc를 복사 붙여넣기 한다

 

 

붙여넣은 파일을 우클릭하여 build path를 클릭하면 add to build path... 가 뜰것이다 이걸 클릭하여 레퍼런스 라이브라리를 만들어준다

JDBCTest1 클래스를 만들어서 정상적으로 연결이 됐는지 확인하겠다

 

package jdbc;

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

public class JDBCTest1 {

	public static void main(String[] args) {

		try {
			// 1. 드라이브 클래스 로딩
			Class.forName("oracle.jdbc.OracleDriver");
			System.out.println("드라이버 로딩 완료");

			// 2. 데이터 베이스 접속
			Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:xe", "c##user", "비밀번호 입력");
			System.out.println("DB접속 완료");

			// 3. SQL문 작성
			String sql = "select * from person";

			// 4. Statement 객체 생성
			Statement stmt = conn.createStatement();

			// 5. Statement 객체를 사용해서 sql문 실행
			ResultSet rs = stmt.executeQuery(sql);

			// 6. 결과 출력
			while (rs.next()) {
				/*
				 * // 컬럼 번호 순서로 뽑음 System.out.println(rs.getString(1) + " " + rs.getString(2) +
				 * " " + rs.getInt(3));
				 */
				System.out.println(rs.getString("PID") + " " + rs.getString("PNAME") + " " + rs.getInt("AGE"));
			}
			// 7. close
			rs.close();
			stmt.close();
			conn.close();

		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

}

 

드라이버 로딩 완료
DB접속 완료
0001 김승균 15
0002 홍길동 25
0003 김철수 12
0004 김정용 32
0006 김재석 10
0012 엄준식 33
0042 엄준식식 32
20224 엄정선 22

 

정상적으로 나온걸 확인할 수 있다

 

아래는 코드 설명이다

데이터베이스를 연결할 때
1. 드라이브 클래스 로딩 
Class.forName("드라이브")

2. 데이터베이스 접속
Connection conn = DriverManager.getConnection("url")

3. sql문 작성
String sql = "sql문"

4. statement 객체 생성
Statement stmt = conn.createStatement();
sql문을 작성할 때 ? 로 해서 작성하면 perparedStatement로 만들어줘야 한다

String sql = "insert into car values (?, ?, ?, ?, ?)";

PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setLong(1, CAR_ID); 
pstmt.setString(2, CAR_NAME); 
pstmt.setInt(3, CAR_MAKER_YEAR); 
pstmt.setString(4, CAR_PRICE); 
pstmt.setString(5, CAR_MAKER_CODE);

"set데이터명" 으로 데이터 명을 명시해주고 뒤에 (n번째 ? 숫자, 쿼리 명) 이런식으로 표현해줘야 한다

5. Statement 객체를 사용해서 sql문 실행
ResultSet rs = stmt.executeQuery(sql);
Select 같이 조회 결과가 필요한 경우에는 executeQuery(sql)이고
insert update delete 같이 결과가 아니라 적용된 건수가 나오는 경우에는 executeUpdate()를 사용한다
조심해야할게 Query는 뒤에 (sql)이 들어오고 Update의 경우는 안들어온다

5. 출력결과 확인
while (rs.next()) { System.out.println(rs.getString("PID") + " " + rs.getString("PNAME") + " " + rs.getInt("AGE")); }

6. close
rs.close();
stmt.close();
conn.close();


오라클공식문서 블로그만 참고하는것보다 공식문서도 많이 참고하는 습관을 들이는게 좋다

 

📌 싱글톤 패턴으로 모듈화

package config;

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

import oracle.jdbc.pool.OracleDataSource;

public class DBManager {
	private static DBManager instance = new DBManager();
	private OracleDataSource ods;

	private DBManager() {
		try {
			// OracleDataSource 생성 및 초기화
			ods = new OracleDataSource();
			String url = "jdbc:oracle:thin:@127.0.0.1:1521/xe";
			String user = "c##user";
			String passwd = "비밀번호";
			ods.setURL(url);
			ods.setUser(user);
			ods.setPassword(passwd);
		} catch (SQLException e) {
			e.printStackTrace();
		}

	}

	public static DBManager getInstance() {
		if (instance == null)
			instance = new DBManager();
		return instance;
	}

	public Connection getConnection() throws SQLException {
		return ods.getConnection();
	}

	public void close(Connection conn, Statement stmt, ResultSet rs) {
		try {
			if (rs != null)
				rs.close();
			if (stmt != null)
				stmt.close();
			if (conn != null)
				conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}
공식문서를 참고하면 sql을 연결하는 여러 방법이 나오는데 그중에 하나 선택해서 싱글톤 패턴으로 모듈화 시켰다

connect, exception, close를 모듈화 시켜서 사용할 때 마다 코드를 만들는게 아니라 DBManager에서 가져오도록 만들었다
package jdbc;

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

import config.DBManager;

public class JDBCTest2 {

	public static void main(String[] args) {
		Connection conn = null;
		Statement stmt = null;
		ResultSet rs = null;
		try {
			conn = DBManager.getInstance().getConnection();
			
			String sql = "SELECT * FROM PERSON";
			stmt = conn.createStatement();
			
			rs = stmt.executeQuery(sql);
			while(rs.next()) {
				System.out.println(rs.getString("PID") + " " 
						+ rs.getString("PNAME") + " " +rs.getInt("AGE"));
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			DBManager.getInstance().close(conn, stmt, rs);
		}
	}

}
1. Connection과 Statement, ResultSet를 초기화 시켜주었다

2. conn = DBManager.getInstance().getConnection();로 데이터베이스 연결정보를 가져왔다

3. 마지막으로 finally에서 close 해주는걸 가져왔다

이렇게 모듈화를 시켜두면 코드가 가독성이 좋아지고 필요한 java 코드도 줄어드는걸 확인할 수 있다 그리고 오류가 생기면 어디서 생겼는지 관리감독이 용이하다

 

👨🏻‍💻 활용해보기


Car 테이블을 활용하여 select insert delete update 를 다 사용하는 메뉴를 만들었다
1. 데이터베이스 연결에 필요한 모듈을 싱글톤 패턴을 사용하여 만든다

2. CarJDBCMain을 만들고 필요한 동작을 하는 메서드를 만든다

3. main에서 메뉴를 만들고 사용자가 입력한 메뉴에 맞춰서 메서드를 호출하게 만든다

 

DBManager

package config;

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

import oracle.jdbc.pool.OracleDataSource;

public class DBManager {
	private static DBManager instance = new DBManager();
	private OracleDataSource ods;

	private DBManager() {
		try {
			// OracleDataSource 생성 및 초기화
			ods = new OracleDataSource();
			String url = "jdbc:oracle:thin:@127.0.0.1:1521/xe";
			String user = "c##user";
			String passwd = "비밀번호
            ";
			ods.setURL(url);
			ods.setUser(user);
			ods.setPassword(passwd);
		} catch (SQLException e) {
			e.printStackTrace();
		}

	}

	public static DBManager getInstance() {
		if (instance == null)
			instance = new DBManager();
		return instance;
	}

	public Connection getConnection() throws SQLException {
		return ods.getConnection();
	}

	public void close(Connection conn, Statement stmt, ResultSet rs) {
		try {
			if (rs != null)
				rs.close();
			if (stmt != null)
				stmt.close();
			if (conn != null)
				conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

 

CarJDBCMain

실행하면 Scanner에서 사용자가 입력한 숫자를 입력받아 메뉴에서 해당하는 메서드를 호출한다
package car;

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

import config.DBManager;

public class CarJDBCMain {
	static Connection conn = null;
	static Statement stmt = null;
	static ResultSet rs = null;

	public static void selectAllCar() {
		// Car 테이블에 있는 모든 정보를 조회해서 출력
		// CAR_ID, CAR_NAME, CAR_MAKE_YEAR, CAR_PRICE, CAR_MAKER_NAME
		try {
			conn = DBManager.getInstance().getConnection();

			String sql = "SELECT C.CAR_ID, C.CAR_NAME, C.CAR_MAKE_YEAR, C.CAR_PRICE, CM.CAR_MAKER_NAME FROM CAR C INNER JOIN CAR_MAKER CM ON C.CAR_MAKER_CODE = CM.CAR_MAKER_CODE";
			stmt = conn.createStatement();

			rs = stmt.executeQuery(sql);
			while (rs.next()) {
				System.out.println(
						rs.getLong("CAR_ID") + " | " + rs.getString("CAR_NAME") + " | " + rs.getInt("CAR_MAKE_YEAR")
								+ " | " + rs.getString("CAR_PRICE") + " | " + rs.getString("CAR_MAKER_NAME"));
			}

		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			DBManager.getInstance().close(conn, stmt, rs);
		}
	}

	public static void insertCar() {
		// 자동차 정보한건 입력 받아서 CAR 테이블에 저장
		Scanner sc = new Scanner(System.in);

		System.out.println("------ 차량 추가 (insert) ------");

		System.out.print("차량 번호를 10자리를 입력하세요 : ");
		long CAR_ID = sc.nextLong();

		System.out.print("차량 이름을 입력하세요 : ");
		String CAR_NAME = sc.next();

		System.out.print("차량 연식을 입력하세요 : ");
		int CAR_MAKER_YEAR = sc.nextInt();

		System.out.print("차량 가격을 입력하세요 : ");
		String CAR_PRICE = sc.next();

		System.out.print("차량 제조사 코드를 입력하세요 : ");
		String CAR_MAKER_CODE = sc.next();

		try {
			conn = DBManager.getInstance().getConnection();

			String sql = "insert into car values (?, ?, ?, ?, ?)";
			PreparedStatement pstmt = conn.prepareStatement(sql);

			pstmt.setLong(1, CAR_ID);
			pstmt.setString(2, CAR_NAME);
			pstmt.setInt(3, CAR_MAKER_YEAR);
			pstmt.setString(4, CAR_PRICE);
			pstmt.setString(5, CAR_MAKER_CODE);

			int count = pstmt.executeUpdate();
			System.out.println("적용된 건수 : " + count);

		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			DBManager.getInstance().close(conn, stmt, rs);
		}
	}

	public static void deleteCar() {
		// 삭제할 자동차 ID를 입력 받아서 CAR 테이블에서 삭제 처리
		Scanner sc = new Scanner(System.in);

		System.out.println("------ 차량 삭제 (delete) ------");
		System.out.print("차량 번호를 입력하세요 : ");
		long CAR_ID = sc.nextLong();

		try {
			conn = DBManager.getInstance().getConnection();

			String sql = "delete from car where car_id = ?";
			PreparedStatement pstmt = conn.prepareStatement(sql);

			pstmt.setLong(1, CAR_ID);

			int count = pstmt.executeUpdate();
			System.out.println("적용된 건수 : " + count);

		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			DBManager.getInstance().close(conn, stmt, rs);
		}
	}

	public static void updateCar() {
		// 자동차 금액이 평균 이상인 애들은 금액 10% 할인가로 수정, 소수점은 절삭
		try {
			conn = DBManager.getInstance().getConnection();

			String sql = "update car set car_price = car_price * 0.9 where car_price >=(select TRUNC(avg(car_price), 0) from car)";
			PreparedStatement pstmt = conn.prepareStatement(sql);

			int count = pstmt.executeUpdate();
			System.out.println("적용된 건수 : " + count);

		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			DBManager.getInstance().close(conn, stmt, rs);
		}
	}

	public static void selectCarName() {
		// 자동차 이름을 검색어 일부로 입력 받아서
		// 해당 검색어를 포함하고 있는 자동차들을 모두 조회
		Scanner sc = new Scanner(System.in);

		System.out.print("검색하고 싶은 차량이름을 입력하세요 : ");
		String CAR_NAME = sc.nextLine();

		try {
			conn = DBManager.getInstance().getConnection();

			String sql = "select * from car where car_name = '" + CAR_NAME + "'";
			stmt = conn.createStatement();

			rs = stmt.executeQuery(sql);
			while (rs.next()) {
				System.out.println(
						rs.getLong("CAR_ID") + " | " + rs.getString("CAR_NAME") + " | " + rs.getInt("CAR_MAKE_YEAR")
								+ " | " + rs.getString("CAR_PRICE") + " | " + rs.getString("CAR_MAKER_CODE"));
			}

		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			DBManager.getInstance().close(conn, stmt, rs);
		}
	}

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		while (true) {
			System.out.println("1. 모든 차량 정보 조회");
			System.out.println("2. 차량 등록");
			System.out.println("3. 차량 삭제");
			System.out.println("4. 평균 가격 이상 차량 10% 할인");
			System.out.println("5. 원하는 차량 조회");

			System.out.print("원하시는 메뉴 번호를 입력 : ");
			int menuNumber = sc.nextInt();
			sc.nextLine();
			if (menuNumber == 0)
				break;

			switch (menuNumber) {
			case 1:
				selectAllCar();
				break;
			case 2:
				insertCar();
				break;
			case 3:
				deleteCar();
				break;
			case 4:
				updateCar();
				break;
			case 5:
				selectCarName();
				break;
			default:
				System.out.println("잘못된 번호를 입력하셨습니다.");
			}
		}

	}
}

'Java' 카테고리의 다른 글

[JAVA] 소켓 프로그래밍 (Socket)  (0) 2024.03.28
[JAVA] 스트림 (Stream)  (0) 2024.03.27
[JAVA] 싱글톤 패턴 (Singleton)  (0) 2024.03.26