코북
Keep going
코북
전체 방문자
오늘
어제
  • 분류 전체보기 (114)
    • Computer Science (20)
      • 인터넷 (10)
      • 운영체제 및 일반지식 (4)
      • 공통 요구사항 (4)
      • WAS (2)
    • DataBase (18)
    • JavaScript (22)
    • Spring (15)
    • Java (4)
    • ASP.NET (5)
    • C# (6)
    • 알고리즘 (8)
    • HTML5 + CSS (5)
    • Git & GitHub (5)
    • Machine Learning (5)
    • 좋은 글 공유 (1)

최근 글

최근 댓글

티스토리

hELLO · Designed By 정상우.
코북

Keep going

[JDBC/Oracle] Java에서 DB연결
Java

[JDBC/Oracle] Java에서 DB연결

2021. 8. 2. 10:47

안녕하세요 코북입니다.

오늘은 JDBC 연결하는 방법을 기록하려고 합니다.

 

Java에서 DB를 연결하려면 먼저 mysql, 오라클 DB 등이 설치되어있어야 합니다.

각 회사마다 Driver가 다르기 때문에 자신이 설치한 DB에 맞는 Driver를 사용해야 합니다.

연결 순서는 아래와 같습니다.

 

  1. 드라이버 로드
  2. Connection DB 연결
  3. Statement SQL 쿼리 실행
  4. excute() 결괏값 처리
  5. close() DB 연결 해제

1. 드라이버 로드

먼저 로드를 원하는 프로젝트에서 properties를 들어갑니다.

 

 

Java Build Path에서 Add External JARs 를 해줍니다.

 

 

ojdbc.jar 파일을 열면 끝입니다.

 

 

 

properties -> Java Build Path -> Add External JARs -> ojdbc.jar 파일 열기

를 통해 JDBC 드라이버 로딩을 완료했습니다.

완료 후 lib에 ojdbc.jar파일이 잘 생성되었는지 확인해주면 좋습니다.

 

 

2. Connection DB 연결

Class.forName("oracle.jdbc.driver.OracleDriver");
String db_url = "jdbc:oracle:thin:@localhost:1521:xe";
String db_id = "id";
String db_pw = "pw";
Connection conn = DriverManager.getConnection(db_url, db_id, db_pw);

 

Class.forName(“driver”)을 사용해서 Driver Class를 로딩하여 객체를 생성합니다.

생성된 객체는 DriverManager에 등록됩니다.

DriverManager 클래스는 로드된 JDBC드라이버를 통해서 Connection을 활성화해주는(만드는) 객체입니다.

 

DriverManager.getConnection() 메소드로 Connection 객체 생성해줍니다.

Connection은 DB와 연결하는 객체입니다.

 

DriverManager.getConnection()은 DB_ID, DB_PW, DB_URL을 매개변수로 갖습니다.

 

 

3. Statement SQL쿼리 실행

통로를 생성하고 연결하는 작업을 해줬습니다.

이제 실행할 sql문을 작성해 sql쿼리를 실행할 수 있습니다.

 

String sql = "insert into model1 values(?,?,?)";
PreparedStatement psmt = conn.prepareStatement(sql);
psmt.setString(1,id);
psmt.setString(2,pw);
psmt.setString(3,name);
int cnt = psmt.executeUpdate();

 

prepareStatement() 메소드에 sql문을 전달해 PreparedStatement 객체를 생성합니다.

PreparedStatement는 SQL문장을 실행하고 결과를 반환하는 기능들을

캡슐화한 인터페이스이며, PreparedStatement는 Statement를 상속받고 있습니다.

PreparedStatement가 상속을 받고 있기 때문에, Statement보다 추가된 기능을 사용할 수 있습니다.

 

setString() 메소드로 sql문의 ? 에 값을 넣어줄 수 있습니다. 

매개변수는 첫 번째는 ? 의 위치, 두 번째는 넣어줄 값입니다.

이때, "?"가 아닌 그냥 ? 를 사용합니다.

 

 

4. execute() 결괏값 처리 

 

execute() 메소드를 사용해 SQL쿼리 실행 후 결괏값을 저장합니다.

위에서는 insert구문을 실행시켰기 때문에 int로 값을 받았습니다.

만약, select구문을 실행시켰다면 다음과 같이, ResultSet객체로 값을 리턴 받은 후,

next()메소드와 getInt(), getString() 등의 메소드를 통해 값을 가져올 수 있습니다.

next() 메소드는 테이블의 다음 행을 가리켜줍니다.

get() 메소드는 매개변수로 쓰인 숫자의 위치에 있는 값을 가져옵니다.

 

Stirng sql = "select * from model1 where user =?";
try{
	psmt = conn.prepareStatement(sql);
	psmt.setString(1, id)
    
	rs = psmt.executeQuery();

	if(rs.next()) {
		int num = rs.getInt(1);
		String id =rs.getString(2);
		String pw = rs.getString(3);
	}

	dto = new Model1DTO(num, id, pw);

 

 

 

5. close() DB 연결 해제

 

통로를 연결하고 작업을 처리했기 때문에 이제 연결했던 통로를 다시 닫아 줘야 합니다.

꼭 열었던 순서의 역순으로 닫아 줘야 합니다.

닫아야 할 자원의 값이 null이라면 Error가 발생하기 때문에, if문으로 조건을 걸어줍니다.

 

try{
    if (rs != null) {
		rs.close();
	}
	if (psmt != null) {
		psmt.close();
	}
	if (conn != null) {
		conn.close();
	} catch (SQLException e) {
		e.printStackTrace();
	}

 

실행 메소드 

메소드명(매개변수) 리턴타입 기능
execute() boolean sql문 실행, 성공하면 false를 리턴, 모든 구문 수행가능
executeQuery() ResultSet Select구문 실행, ResultSet객체의 값을 리턴
executeUpdate() int Select 이외의 구문을 실행, int타입의 값을 리턴
insert, update, delete문을 실행하고 영향을 받은 행의 개수를 반환
create, drop관련 구문에서는 -1을 반환
close() void PreparedStatement의 자원을 반납

전체 소스코드 

Connection conn = null;
PreparedStatement = null;
ResultSet rs = null;
int cnt = 0;

try{
	Class.forName("oracle.jdbc.driver.OracleDriver");
	String db_url = "jdbc:oracle:thin:@localhost:1521:xe";
	String db_id = "id";
	String db_pw = "pw";
	conn = DriverManager.getConnection(db_url, db_id, db_pw);
    
	String sql = "insert into model1 values(?,?,?)";
	psmt = conn.prepareStatement(sql);
	psmt.setString(1,id);
	psmt.setString(2,pw);
	psmt.setString(3,name);
	cnt = psmt.executeUpdate();
    
} catch (ClassNotFoundException e) {
	e.printStackTrace();
} catch (SQLException e) {
	e.printStackTrace();
} finally { 
	try{
		if (rs != null) {
			rs.close();
		}
		if (psmt != null) {
			psmt.close();
		}
		if (conn != null) {
			conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
    
if (cnt>0){
	System.out.println("회원가입 성공");
} else {
	System.out.println("회원가입 실패");
}

 

DAO 클래스에 메소드를 저장시켜서 사용

 

다음과 같이 클래스를 만들어 놓으면 inset() 메소드 한 줄로도 간편하게 모든 과정을 처리할 수 있다.

package Model;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

public class DAO {
	Connection conn = null;
	PreparedStatement psmt = null;
	ResultSet rs = null;
	int cnt = 0;

	public void conn() {
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			String db_url = "jdbc:oracle:thin:@localhost:1521:xe";
			String db_id = "hr";
			String db_pw = "hr";
			conn = DriverManager.getConnection(db_url, db_id, db_pw);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void close() {
		try {
			if (rs != null) {
				rs.close();
			}
			if (psmt != null) {
				psmt.close();
			}
			if (conn != null) {
				conn.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
    
	public int insert(id) {
		conn();
		String sql = "insert into model1 values(?,?,?)";
		try{			
			psmt = conn.prepareStatement(sql);
			psmt.setString(1,id);
			psmt.setString(2,pw);
			psmt.setString(3,name);
			cnt = psmt.executeUpdate();
            
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
        	close();
        }
   		return cnt;
    }

 

지금까지 JDBC연결 방법에 대해서 알아봤습니다.

끝까지 읽어주셔서 감사합니다 : )

'Java' 카테고리의 다른 글

[Java] public static void main(String[] agrs) 선언의 이해  (0) 2022.02.15
[error/Java]Implicit super constructor Unit() is undefined. Must explicitly invoke another constructor  (0) 2022.01.31
[error/jsp] duplicate local variable  (0) 2021.08.04
    'Java' 카테고리의 다른 글
    • [Java] public static void main(String[] agrs) 선언의 이해
    • [error/Java]Implicit super constructor Unit() is undefined. Must explicitly invoke another constructor
    • [error/jsp] duplicate local variable
    코북
    코북

    티스토리툴바