본문 바로가기

Dev/[Java]

[JDBC] 1. 설치 및 환경설정, 이클립스와 연동 방법

반응형

 

 

Oracle XE와 Oracle Developer를 다운받는다. OracleXE 설치함

이후 커맨드라인 띄운다.

 

 

root 로 연결

conn sys as sysdba;

hr 계정 unlock

alter user hr account unlock;

alter user hr identified by hr

 

여기까지 하고,

 

conn hr/hr;

하면 connected. 뜬다.

이후 쿼리문 날린다.

이렇게 하면 테이블에서 여러가지 해볼 수  있다.

 

여기서 계정 생성하나 해본다.

scott 계정생성과 권한부여

create user scott identified by tiger default tablespace users temporary tablespace temp;

grant connect,resource to scott;

 

이후 oracle developer실행해본다.

 

 

 

 

여기서 컬럼, 데이터, 쿼리문 등을 볼 수 있다.

아니면 질의작성기에서 쿼리문 날려봐도된다.

 

 

이후 jdbc드라이버가 필요하다.

보통은 오라클 설치하면 들어있따.

 

 

여기 있는 걸 자바 프로젝트에 복붙

 

 

 

 

 

 

 

여기다가 jar파일 add해준다.

 

 

 

jdbc coding 순서

 

 

 

 

 

 

 

자바에서 new 해서 객체 생성하는 것처럼 oracle은 아래와 같이 객체 생성한다.

 

Class.forName("oracle.jdbc.driver.OracleDriver);

 

Forname이라는 메서드 이용해서 하는 이유는 종속성을 없애기위해..

 

doc에서 lang에 가면 forName이 있다. 

 

주어진 이름으로 클래스나 인터페이스의 클래스를 반환..

 

객체 생성하는것이다.

lang.Thread주고 해도 된다...

 

클래스 이름을 문자열로 줄 수 있어서 나중에 외부 파일로 문자열만 빼면되니까.. 종속성이 없어진다...

그래서 이렇게하는거다

 

properties만들어서 나중에 밖으로 뺄거다..

 

 

 

 

그래서... 이클립스에서 이제 연동할거다...

 

프로젝트하나 생성하고..

아래와 같이 해준다...

 

package jdbc.app;

public class EmployeesSelectTest {
	public static void main(String[] args) {
		
		//1. Driver Class loading
		try {
			Class driver = Class.forName("oracle.jdbc.OracleDriver");
			System.out.println(driver.getName());
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
		
	}

}

 

 

이러면 결과는 이렇게 나온다..

 

 

 

다음 순서는 Connection 만들어주는것이다...

 

DriverManager.getConnection()이 함수를 써서 Connection instance 획득해야댄다

 

//2. connection, DB와의 연결을 담당하는 Connection 객체를 생성한다.
String url = "jdbc:oracle:thin:@127.0.0.1:1521:xe";
String user = "hr";
String pw = "hr";


// DriverManager 의 getConnection()메서드가 T4CConnection 객체를 생성하므로
// Factory Method이다.

// 우리가 배운대로 하면..
// Connection con = new T4CConnection;
// 와 같이 써줘야하는데...
// 왜 이렇게 쓰냐면...
// 아까 말했듯이 벤더 종속적인 방식의 코딩이대면안대기때문이다..


try {
	Connection connection = DriverManager.getConnection(url,user,pw);
	System.out.println(connection.getClass().getName());
} catch (SQLException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
}

 

자바는 하면서 느끼는거지만 함수 사용법이 맞아도 예외처릴 안하면 컴파일타임에 에러를띄운다..

이게 나같은 초보들한텐 좋은 것 같다..

 

나중에 실력이 더 늘었을 때에는 어떨 지 모르겠다.

 

 

 

 

 

여기서 얼마전 강의들었던 Iterator 와 비슷한 개념이쓰임..

 

// 3번째 스텝, SQL문을 전송해주는 statement 객체를 생성..
// createStatement()라는 함수를 팩토리 메서드라고한다.
stmt = con.createStatement();
System.out.println(stmt.getClass().getName());

 

 

// 4. 4번쨰 Step은... SQL 전송 단계이다..
ResultSet resultSet = stmt.executeQuery(sql);
System.out.println(resultSet.getClass().getName());
while(resultSet.next()) {
	int emp_id = resultSet.getInt("employee_id");
	String name = resultSet.getString("first_name");
	Date date = resultSet.getDate("hire_date");
	float salary = resultSet.getFloat("salary");
	System.out.println(emp_id + "\t" + name + "\t" + date + "\t" + salary);
}

 

try {
	// 5. 사용했던 객체를 닫아주어야 한다..
	if(stmt != null) stmt.close();
    if(con != null) con.close();
} catch (SQLException e) {
	// TODO Auto-generated catch block
    e.printStackTrace();
}

 

 

전체 소스코드

 

package jdbc.app;

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

public class EmployeesSelectTest {
	public static void main(String[] args) {
		
		// 1. Driver Class loading
		try {
			Class driver = Class.forName("oracle.jdbc.OracleDriver");
			System.out.println(driver.getName());
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		// 2. connection, DB와의 연결을 담당하는 Connection 객체를 생성한다.
		String url = "jdbc:oracle:thin:@127.0.0.1:1521:xe";
		String user = "hr";
		String pw = "hr";
		String sql = "select * from employees";
		
		// DriverManager 의 getConnection()메서드가 T4CConnection 객체를 생성하므로
		// Factory Method이다.
		
		// 우리가 배운대로 하면..
		// Connection con = new T4CConnection;
		// 와 같이 써줘야하는데...
		// 왜 이렇게 쓰냐면...
		// 아까 말했듯이 벤더 종속적인 방식의 코딩이대면안대기때문이다..
		
		Connection con = null;
		Statement stmt = null;
		try {
			con = DriverManager.getConnection(url,user,pw);
			System.out.println(con.getClass().getName());
			// 3번째 스텝, SQL문을 전송해주는 statement 객체를 생성..
			// createStatement()라는 함수를 팩토리 메서드라고한다.
			stmt = con.createStatement();
			System.out.println(stmt.getClass().getName());
			
			// 4. 4번쨰 Step은... SQL 전송 단계이다..
			ResultSet resultSet = stmt.executeQuery(sql);
			System.out.println(resultSet.getClass().getName());
			while(resultSet.next()) {
				int emp_id = resultSet.getInt("employee_id");
				String name = resultSet.getString("first_name");
				Date date = resultSet.getDate("hire_date");
				float salary = resultSet.getFloat("salary");
				System.out.println(emp_id + "\t" + name + "\t" + date + "\t" + salary);
			}
			
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				// 5. 사용했던 객체를 닫아주어야 한다..
				if(stmt != null) stmt.close();
				if(con != null) con.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
	}

}

 

 

Prepared statement 사용법

근데 이거는 런타임에 sql을 sysout 으로 찍어봐도 ?밖에 보이지 않아서 ..

특별하게 따로 해줘야하는게 있따고 한다.

 

이런게 좀 단점.. 그러나 속도면에서는 이게 더 빠르다고한다..

 

 

package jdbc.app;

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

public class DepartmentsUpdateTest {
	public static void main(String[] args) {
		
		String url = "jdbc:oracle:thin:@127.0.0.1:1521:xe";
		String user = "hr";
		String pw = "hr";
		String sql = "update departments set department_name = ?, manager_id = ? where department_id = ?";
		
		
		
		Connection con = null;
		PreparedStatement pstmt = null;
		try {
			Class.forName("oracle.jdbc.OracleDriver");
			con = DriverManager.getConnection(url,user,pw);
			pstmt = con.prepareStatement(sql);
			pstmt.setString(1, "payrolls");
			pstmt.setInt(2, 205);
			pstmt.setInt(3, 270);
			int rowcnt = pstmt.executeUpdate();
			System.out.println(rowcnt+" 건이 update되었습니다.");
		} catch (Exception e) {
			System.err.println(e.getMessage());
			e.printStackTrace();
		} finally {
			try {
				pstmt.close();
				con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		
		
	}
}

 

 

여기서 Autocommit 쓰기 싫다..?

 

 

 

여담:

 

Oracle도 클라우드 서비스 한다.

그런데 애저나 AWS처럼 범용적인게아닌

자기거하고만 연동되는 서비스를한다.

 

인하우스라는게 있다

배민이 인하우스 2개 서버 돌렸다가 -> 작년인가 AWS로 전부 이전

 

 

 

 

JETBRAIN이라는 회사 있다.

체코 회산데 얘네가 인텔리제이 만들었다.

DataGrip이라는 것도 있따.

 

여기에는 전세계 모든 DB연동이가능하다.

 

 

WebStorm 이라는 것도 있다.

이건 자바스크립트.

반응형