언제 어디서든 사용할 Connection class와 Close class 만들기

JDBC사용시 꼭 해주어야할 작업이 몇가지 있다.

바로 Java에서 db연결과 db닫기이다.

JDBC사용시 중복의 방지를 위해 해당class의 생성을 추천한다.

 

DBConnection class 예시

package db;

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

public class DBConnection {
	public static void initConnection() { 
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");	
			// 연결이 되면 해당 문구가 실행된다.
			System.out.println("Driver Loading Success");			
		} catch (ClassNotFoundException e) {			
			e.printStackTrace();
		}
	}

	public static Connection getConnection() {		
		Connection conn = null;		
		try {
			conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "hr", "hr");
			System.out.println("Oracle Connection Success!!");
		} catch (SQLException e) {
			System.out.println("DB를 연결하지 못했습니다");
		}
		return conn;		
	}
}

DBClose class 예시

package db;

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

public class DBClose {
	public static void close(Connection conn, PreparedStatement psmt, ResultSet rs) {
		try {
			if(conn != null) {
				conn.close();
			}
			if(psmt != null) {
				psmt.close();
			}
			if(rs != null) {
				rs.close();
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

 

 

DB를 다 사용을 하면 DB의 과부화 방지를 위해 무조건 close 해주어야 한다.

Connection

DB 연결객체

PreparedStatement

Query문을 실행객체

ResultSet

결과 취득 객체

 

해당 class의 close메서드는 dao class에서 Qruery문 사용할 때마다 finally구절에 필히 작성한다.

'IT > JDBC' 카테고리의 다른 글

[JDBC] Java로 DB에 데이터 추가하기  (0) 2021.06.16

 

우선 Open scrapbook to edit SQL statements에서 테이블을 추가한다.

코드 입력 후 Alt + C 

SQL Results에 succeeded 문구가 떠야 테이블이 생성된 것이다.

테이블 생성 후 src 폴더에 저장해준다.
JDBC 사용을 위해 ojdbc6.jar파일도 lib에 추가해 준다.

 

 

DB와 연동할 Class 예시

package main;

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

public class JdbcConnect {
	
	public JdbcConnect() {
		
		try { 
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("Driver Loading Success");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	public Connection getConnection() { // 커넥션 해주는 역할, DB객체
		
		Connection conn = null;
		
		try {
			conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "hr", "hr");
			System.out.println("Oracle Connection Success!!");
		} catch (SQLException e) {
			 System.out.println("DB를 연결하지 못했습니다");
		}
		return conn;
	}
	// 첫번째 방법
	public int insertData(String id, String name, int age) {
		// Query문을 준비
		
		String sql =  " INSERT INTO USERTEST(ID, NAME, AGE, JOINDATE) "
	               +  " VALUES('" + id + "','" + name + "'," + age + ", SYSDATE) ";
   
		
		System.out.println(sql);
		
		// DB Connection
		Connection conn = getConnection();
		Statement state = null;
		int count = 0;
		
		// DB Processing (처리)
		try {
			state = conn.createStatement();
			count = state.executeUpdate(sql);
			
			System.out.println("성공적으로 추가되었습니다.");
			
		} catch (SQLException e) {
			e.printStackTrace();
			
		} finally {
			// DB close 필수!
			 // 접속이 된 것
			try {
				if(state != null) {
					state.close();
				}
				if(conn != null) {
					conn.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			
			}
		} 
		return count;
	}
	// 두번째 방법
	public boolean userInsert(String id, String name, int age) {
		String sql = " INSERT INTO USERTEST(ID, NAME, AGE, JOINDATE) " 
				   + " VALUES(?, ?, ?, SYSDATE) ";
		
		Connection conn = getConnection();
		PreparedStatement psmt = null;
		
		int count = 0;
		
		try {
			psmt = conn.prepareStatement(sql);
			// 첫번째, 두번째, 세번째 데이터를 넣기
			psmt.setString(1, id); 
			psmt.setString(2, name); 
			psmt.setInt(3, age);
			count = psmt.executeUpdate();
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			// DB close 필수!
			 // 접속이 된 것
			try {
				if(conn != null) {
					conn.close();
				}
				if(psmt != null) {
					psmt.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			
			}
		}
		return count > 0 ? true : false; 
	}
}

 

설명

중간중간 나타나는 프린트문은 잘 실행이 되고 있는지 확인하기 위한 깃발이다.(없어도 되는 코드긴 하지만, 어디서 에러가 났는지 확인을 위한 중요한 코드이다.)

 

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

오라클 드라이버가 있는지 확인을 해준다. (lib에 ojdbc6.jar 있는지 확인)

 

Connection

특정 데이터베이스와의 연결(세션)을 해주는 인터페이스이다 . SQL 문이 실행되고 연결 컨텍스트 내에서 결과가 반환된다. - DB 연결

DriverManager.getConnection("jdbc:oracle:thin:@localhost:xe", "hr", "hr")

getConnection(String url)

SQLException 발생 주어진 데이터베이스 URL에 대한 연결 설정을 시도한다.

 

  • 데이터베이스 URL가져오기

Open Perspective 클릭 후 Database Development 클릭 후 Open 클릭한다.

(이미지 생략 선행글에 작성되어있다.)

New Oracle 클릭 후 Properties 클릭

 

Driver Properties 클릭! Connection URL이다. (필자의 ip주소는 가림 처리하였다..)

 

 

첫번째 방법은 현재 많이 사용하지 않는다고 한다. 그래도 혹시 모르니 눈에 담아 두기로 하자!

 

String sql =  " INSERT INTO USERTEST(ID, NAME, AGE, JOINDATE) "
	               +  " VALUES('" + id + "','" + name + "'," + age + ", SYSDATE) ";

Query문을 준비한다.

Query문의 ""안에 맨 앞과 맨 뒤는 떨어뜨려야 오류가 발생하지 않는다.

 

createStatement()

SQL 문을 데이터베이스로 보내기 위한 Statement 객체를 생성하며, 파라미터가 없는 SQL 문은 일반적으로 Statement 객체를 사용하여 실행된다. (DB의 초기화라고 한다..)

SQLException이 발생한다.

executeUpdate()

INSERT, UPDATE 또는 DELETE 문이나 아무것도 반환하지 않는 SQL 문 (예 : SQL DDL 문) 일 수 있는 지정된 SQL 문을 실행한다.

실제 DB에 데이터를 적용하는 부분이다.
반환타입이 int형이다. 0이 넘어오면 정상추가 안된 것이다.

SQLException이 발생한다.

 

필수 실행사항 !

close() : Databasa 꼭! 닫아주기

DB Server는 클라이언트가 30명 이상 접속 시 무거워지기 시작한다.

DB Server는 접속이 이루어지면 데이터를 가지러 가서 데이터를 가지고 나온 후 바로 접속을 끊어버린다.

접속을 끊는 역할을 close()가 해준다.

 

return값으로 count를 넣어준다.

제대로 추가가 되었다면 count값이 증가한다.

 


두번째 방법이 현재 실무에서 많이 사용되는 예시라고 한다.

String sql = " INSERT INTO USERTEST(ID, NAME, AGE, JOINDATE) " 
				   + " VALUES(?, ?, ?, SYSDATE) "; 

Query문을 준비한다. 첫번째 방법과 좀 다르다.

?로 하면 자동으로 ""를 붙여준다.

PreparedStatement

SQL문은 미리 컴파일되어 PreparedStatement 개체에 저장된다. 그런 다음이 개체를 사용하여 이 구문을 여러 번 효율적으로 실행할 수 있다. (Statement의 업그레이드버전) - Query문을 실행

setString

지정된 매개 변수를 주어진 Java String 값으로 설정한다. 드라이버는 데이터베이스로 전송할 때 SQL VARCHAR2 값으로 변환한다.

매개변수는 Query문 첫번째 ? : 1, 두번째 ? : 2, 세번째 ? : 3 ... n번째 ? : n 이 된다.

SQLException이 발생한다.

setInt

지정된 매개 변수를 지정된 Java int 값으로 설정한다. 드라이버는 데이터베이스로 보낼 때 SQL INTEGER 값으로 변환한다.

매개변수는 Query문 첫번째 ? : 1, 두번째 ? : 2, 세번째 ? : 3 ... n번째 ? : n 이 된다.

SQLException이 발생한다.


MainClass 예시

package main;

public class MainClass {
	public static void main(String[] args) {

		 JdbcConnect jc = new JdbcConnect();
		
	//	jc.getConnection(); // DB에서 문서를 꺼내올 수 있다.
		
		 int count = jc.insertData("aaa", "홍길동", 24);
		 
		 if(count > 0 ) {
			 System.out.println("추가되었습니다.");
		 }
		 
		 boolean b = jc.userInsert("bbb", "성춘향", 16);
		 
		 if( b == true) {
			 System.out.println("성공적으로 추가되었습니다.");
		 }
	}
}

 

실행 시 이클립스 console출력 문구

Driver Loading Success
 INSERT INTO USERTEST(ID, NAME, AGE, JOINDATE)  VALUES('aaa','홍길동',24, SYSDATE) 
Oracle Connection Success!!
성공적으로 추가되었습니다.
추가되었습니다.
Oracle Connection Success!!
성공적으로 추가되었습니다.

+ Recent posts