본문 바로가기

JAVA

[JAVA] JDBC 사용하기

728x90

JDBC란?

JDBC(Java Database Connectivity)는 자바에서 데이터베이스의 종류에 상관 없이 접속해서 DB프로그래밍을 할 수 있는 API이다.

 

 

순서

1) JDBC 드라이버 로드

2) DB 연결

3) DB 활용

4) DB 연결 종료

 

 

JDBC 드라이버

 

각각의 데이터베이스 (ORACLE, MySQL, MSSQL 등) 별로 알맞은 JDBC 드라이버가 필요하다 (jar파일)

 

\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib

 

오라클의 경우 드라이버의 경로는 위 사진과 같으며

 

ojdbc5는 하위버전이며 ojdbc6_g는 디버그 전용 드라이버라고 한다.

불필요한 로그가 발생할 수 있으니 ojdbc6.jar을 사용한다.

 

 

드라이버 파일을 자바에 연결하는 방법은 프로젝트에 라이브러리를 추가해주면 된다.

 

(연결하는 방법은 여러가지가 있다.)프로젝트 파일 우클릭하여 Configure Build Path를 클릭한다.

 

External JARs에서 드라이버 파일을 찾아 적용해주면 끝

 

 


JDBC 연결

 

public class DbUtil {

	/** DB 연결 정보 */
	/** JDBC 드라이버(driver) */
	// static final String driver = "oracle.jdbc.OracleDriver";
	static final String DRIVER = "oracle.jdbc.driver.OracleDriver";
	/** JDBC URL */
	static final String URL = "jdbc:oracle:thin:@localhost:1521:xe";
	/** DB account(ID) */
	static final String USER_ID = "hr";
	/** DB account(PW) */
	static final String USER_PW = "hr";

	/**
	 * DB 연결 <br>
	 * <br>
	 * 용례) DbUtil.connect(); <br>
	 * 
	 * @return DB 연결 객체
	 */
	public static Connection connect() {

		/** DB 연결 객체 */
		Connection con = null;

		try {

			// JDBC driver 등록
			Class.forName(DRIVER);

			// JDBC URL, ID, PW를 이용하여 연결 객체 생성
			try {

				con = DriverManager.getConnection(URL, USER_ID, USER_PW);

			} catch (SQLException e) {
				System.err.println("DB 연결에 실패하였습니다.");
				e.printStackTrace();
			}

		} catch (ClassNotFoundException e) {
			System.err.println("JDBC 드라이버 로딩에 실패하였습니다.");
			e.printStackTrace();
		}

		return con;
	} //

 

DB연결 코드 흐름은 위와 같다.

 

Connection 클래스는 java.sql 패키지 안에 있어 JAVA와 DB의 연결 객체를 생성한다.

 

Class.forName(DRIVER);

위 구문은 JVM에 드라이버 정보를 생성하고 초기화 시켜주는 역할을 한다.

 

DriverManager.getConnection()

위 구문은 sql 패키지소속 DriverManager 클래스의 getConnection 메소드를 이용하여 연결 정보를 매개변수로 넘겨준다.

 


DB 활용 (코드 분석)

 

public MemberVo getMember(String memberId) {

		// 리턴(반환값) 처리
		MemberVo member = new MemberVo();

		// 실행 메서드명
		String methodName = new Exception().getStackTrace()[0].getMethodName();
		// DB 연결
		Connection con = DbUtil.connect();

		// SQL 처리 객체
		PreparedStatement pstmt = null;

		// SQL 결과셋 객체 (DQL:select)
		ResultSet rs = null;

		// SQL 구문
		String sql = "SELECT * FROM member WHERE member_id=?";
		// String sql = "SELECT * FROM member WHERE "
		// + "member_id='"+memberId+"'";

		// SQL, 인자 (선)처리, 예외처리
		try {
			pstmt = con.prepareStatement(sql);
			pstmt.setString(1, memberId);
			// SQL 실행
			rs = pstmt.executeQuery();

			if (rs.next()) {

				member.setMemberId(rs.getString("member_id"));
				member.setMemberPassword(rs.getString("member_password"));
				member.setMemberNickname(rs.getString("member_nickname"));
				member.setMemberName(rs.getString("member_name"));
				member.setMemberGender(rs.getString("member_gender").charAt(0));
				member.setMemberEmail(rs.getString("member_email"));
				member.setMemberPhone(rs.getString("member_phone"));
				member.setMemberBirth(rs.getDate("member_birth"));
				member.setMemberZip(rs.getString("member_zip"));
				member.setMemberAddressBasic(rs.getString("member_address_basic"));
				member.setMemberAddressDetail(rs.getString("member_address_detail"));
				member.setMemberJoindate(rs.getDate("member_joindate"));
			}

		} catch (SQLException e) {
			System.err.println(methodName + " : " + e.getMessage());
		} finally {
			// 자원 반납
			DbUtil.close(con, pstmt, rs);
		}

		// 리턴(반환)
		return member;
	}

 

member_id를 이용하여 특정 행을 조회하는 메소드의 코드이다.

 

1. 첫 번째 줄 소스, 메소드 명

public MemberVo getMember(String memberId) {

쿼리의 질의결과를 JVM을 통해 출력받기 위해 사전에 작성해놓은 MemberVo 클래스를 리턴값으로 선언해준다.

그리고 memberId를 이용하여 조회하므로 매개변수 값은 memberId로 설정한다.

 

 

2. 두 번째 줄, 리턴 처리

MemberVo member = new MemberVo();

MemberVo 객체를 리턴 값으로 사용한다.

 

 

3. 예외처리시 메소드 명 호출

String methodName = new Exception().getStackTrace()[0].getMethodName();

예외 발생시 예외가 발생한 메소드를 추적하는 소스이다.

 

4. DB 연결

Connection con = DbUtil.connect();

DB 연결 클래스인 Connection를 사용하여 변수를 생성 후 위에 새로 생성한 DbUtil클래스의 connect 메소드를 대입해준다.

 

5. SQL 처리, 결과셋 객체 생성

PreparedStatement pstmt = null;
ResultSet rs = null;

자바와 DB의 인터페이스 역할을 하는 Statement 인터페이스를 사용하여 변수를 초기화해준다.

PreparedStatement 는 Statement 상위기능의 인터페이스로 와일드카드(?)를 사용하여 구문을 작성할 수 있어

인수가 많은경우 사용하기 좋다.

 

ResultSet클래스로 결과값을 담을 rs 변수를 초기화 해준다.

 

6. SQL 구문 작성

String sql = "SELECT * FROM member WHERE member_id=?";

sql구문 작성

 

7. SQL 인자/예외 처리

try {
			pstmt = con.prepareStatement(sql);
			pstmt.setString(1, memberId);
			// SQL 실행
			rs = pstmt.executeQuery();

			if (rs.next()) {

				member.setMemberId(rs.getString("member_id"));
				member.setMemberPassword(rs.getString("member_password"));
				member.setMemberNickname(rs.getString("member_nickname"));
				member.setMemberName(rs.getString("member_name"));
				member.setMemberGender(rs.getString("member_gender").charAt(0));
				member.setMemberEmail(rs.getString("member_email"));
				member.setMemberPhone(rs.getString("member_phone"));
				member.setMemberBirth(rs.getDate("member_birth"));
				member.setMemberZip(rs.getString("member_zip"));
				member.setMemberAddressBasic(rs.getString("member_address_basic"));
				member.setMemberAddressDetail(rs.getString("member_address_detail"));
				member.setMemberJoindate(rs.getDate("member_joindate"));
			}

		} catch (SQLException e) {
			System.err.println(methodName + " : " + e.getMessage());

인터페이스 변수에 sql값을 대입해주고

sql에 있는 와일드카드인 물음표에 값을 매칭해주기 위해

pstmt.setString(1, memberId); 를 작성한다.

앞에는 와일드카드의 인덱스이며 뒤에는 매개변수가 들어간다.

 

executeQuery 메소드로 쿼리를 실행하고 실행 결과를 rs변수에 저장한다.

 

rs.next()는 rs내부에 들어온 데이터 값을 조회하여 다음에 조회할 행이 있으면 true값을 리턴하고 없으면 false를 리턴한다.

 

사전에 작성해둔 MemberVo클래스의 getter/setter 구문을 통해 rs변수의 값을 포맷에 맞게 출력해준다.

(rs의 저장된 member_id 값을 get 하여 MemberVo의 MemberId메소드를 통해 set한 뒤 member객체변수에 저장한다.)

 

그리고 위 구문을 try로 감싸 sql문이나 pstmt값 대입에 예외가 발생시 처리해주는 구문을 만든다.

 

catch문에는 3번에서 작성한 methodName 변수를 호출하여 예외 발생시 예외가 일어난 메소드 이름를 확인한다.

(굳이 이렇게 하지 말고 getStackTrace() 메소드를 써도 좋다.)

 

8. 자원 반납

} finally {
			// 자원 반납
			DbUtil.close(con, pstmt, rs);

사전에 작성해둔 DbUtil.close 메소드를 이용해 db자원을 종료해준다.

 

DbUtil.close메소드의 구문은 아래와 같다.

public static int close(Connection con, Statement stmt, ResultSet rs) {
		  
		  int result = 0;
		  
		  try {
		  
			  if (rs != null) { 
				  rs.close(); 
				  System.out.println("SQL 결과셋을 반납하였습니다."); 
				  result = 1;
			  } //
			  
			  if (stmt != null) { 
				  stmt.close(); 
				  System.out.println("SQL 처리객체를 반납하였습니다."); 
				  result = 2;
			  } //
			  if (con != null) { 
				  con.close();
				  System.out.println("DB 연결 객체를 반납하였습니다.");
				  result = 3;
			  } 
		  
		  } catch (SQLException e) { 
			  System.err.println("DB 자원 반납에 실패하였습니다.");
		  	  e.printStackTrace(); 
		  } //
	 
		  return result;
	}

 

 

9. 리턴

return member;

member 변수에 db값을 잘 저장했으니

이를 return값에 대입해주면 완성

 


테스트 해보기

public class MemberTest {

	public static void main(String[] args) {

		MemberDao dao = MemberDaoImpl.getInstance();
		
		System.out.println(dao.getMember("java"));
     }
}

해당되는 클래스 객체를 생성하여 매개변수 값을 입력 후 getMember 메서드를 호출하자.

 

값이 정상적으로 출력된다.