본문 바로가기

java/jsp & sevlet

JDBC(java와 오라클의 통신 방법)

JDBC(Java Database Connectivity) 는 java를 이용해서 db와 통신할 수 있게 해주는 api이다.

기능으로는 주로 다음과 같다.

  • db와의 연결
  • statement 생성 및 쿼리
  • 결과를 받아 분기 처리
  • 트랜잭션 관리에 따른 안전성 보장

 

JDBC 라이브러리를 이클립스에 세팅하기


1. 이클립스에 라이브러리를 path 등록하기

먼저 jdbc 라이브러리를 이클립스에 복사 및 설정해줘야한다.

  • oracle이 설치된 경로에서 lib/ojdbc을 찾아서 복사한다. (내 경우에는 sql developer의 lib/ojdbc.jar 파일을 사용)
  • 이런 외부 라이브러리는 java가 설치된 경로의 lib/ext로 위치시키면 된다.
    • ex | c/program files/jre/lib/ext
  • 이클립스에 복사 및 설정하기
    • window-preference – java- build path- classpath variables 접속
    • 여기에는 이클립스에서 사용할 수 있도록 등록된 jre 라이브러리의 경로를 설정할 수 있다.
    • new를 누르고 사용할 이름(ex: OracleDB)과 아까 위치시킨 jdbc 파일 경로를 설정해준다.

 

2. 프로젝트에 외부 라이브러리 import 하기

등록된 라이브러리를 프로젝트에서 사용할 수 있도록 세팅하는 과정이다.

  1. 프로젝트 우클릭- build path- configure buid path - library - class path - add variable 클릭
  2. 아까 등록한 jdbc 경로(oracleDB)를 선택한다.

 

* 다른 방법: 프로젝트 내에 라이브러리 직접 세팅하기

아까 방법들은 외부의 라이브러리를 절대경로로 가져오는 방법이다.

이 방법은 프로젝트를 자주 지우고 만들 때는 유용하지만, 프로젝트를 배포할 때는 상대경로로 설정해줘야 경로 오류를 방지할 수 있다.

  1. 프로젝트의 web-inf/lib 폴더에 import/file
  2. jdbc.jar 파일을 가져온다(다른 방법으로는 웹 컨테이너 톰켓의 lib 폴더로 jdbc.jar 파일 복사)
  3. src폴더 우클릭 - build path- configure- Libraries → Add JAR → 가져온 jdbc.jar을 선택 후 적용
  4. 이러면 referenced libraries에 추가된다.

 

JDBC 코드 작성하기


JDBC를 코드로 실행하는 방식은 대개 이렇다.

  1. 오라클 드라이브를 불러와 메모리에 할당
  2. java 서버 url과 id, 비번을 매개 변수로 connection 생성
  3. 쿼리를 위한 statement 객체 생성
  4. 쿼리문 작성 및 실행
  5. 결과를 받아와 분기처리
  6. 예외처리 및 리소스 해제

예시

//책 데이터를 db에 추가하는 쿼리
public class Add extends HttpServlet {
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		response.setContentType("text/html; charset=UTF-8");
		response.setCharacterEncoding("UTF-8");
		PrintWriter out = response.getWriter();

		String bookName = request.getParameter("book_name");
		String bookPublishedDate = request.getParameter("book_published_date");

		String url = "jdbc:oracle:thin:@localhost:1521:xe";
		String id = "계정 아이디";
		String password = "계정 비밀번호";

		Connection con = null;
		Statement stmt = null;
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			con = DriverManager.getConnection(url, id, password);
			stmt = con.createStatement();

			String query = "INSERT INTO book(book_id, book_name, book_publiched_date)";
			query += " VALUES (BOOK_SEQ.NEXTVAL, '" + bookName + "', '" + bookPublishedDate + "')";
			int result = stmt.executeUpdate(query);

			if (result == 1) {
				out.println("success!");
			} else {
				out.println("fail");
			}

		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			out.println("fail: 클래스 못찾음");
		} catch (SQLException e) {
			e.printStackTrace();
			out.println("fail: sql 쿼리 이상");
		} finally {
			try {
				if (stmt != null)
					stmt.close();
				if (con != null)
					con.close();
			} catch (Exception e2) {
			}
		}

		System.out.println(bookName + bookPublishedDate);


	}

}
  • result는 이 경우에 삽입한 데이터의 숫자에 따라 결정된다. 위 코드는 1개의 데이터를 삽입했으므로 성공 시 1이 반환
  • 쿼리문 끝에 세미콜론을 넣으면 안된다. 이 부분이 sql을 직접 다룰 때랑 직접 할 때랑 다르니 주의
  • 데이터를 추가삭제업데이트할 때는 excuteUpdate. 검색할 때는 excuteQuery.
    • 후자의 검색 결과는 ResultSet 타입으로 iterator 가능
오라클 DB의 포트 번호 속성 확인
orcacle sql developer에서 데이터베이스의 속성에 들어가  접속 중인 포트번호와 SID가 이클립스 내 String url에 주어진 정보와 일치해야 함

 

참고. 발생 가능한 오류의 종류

java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver

웹 프로젝트에서 import한 클래스를 찾지 못해 발생한다.

웹 컨테이너나 프로젝트의 web-int/libjdbc 파일을 체크해야 한다.

 

only available if source level is 1.5 or greater

컴파일러는 jdk 내부의 것으로 세팅되는데, 프로젝트를 import할 때, 이 부분이 어긋나면 jdk의 컴파일러가 세팅되지 않아 발생한다.

 

해결방법

  • 보편적 설정 방식
    • window-preference-java-compiler로 해결 가능하다.
  • 프로젝트 개별 설정 방식
    • Configure Progject Specific Settings.. 클릭해서 프로젝트 세팅
    • Enable project specific settings를 체크하고, Compiler compliance level을 맞게 설정

 

 

prepare statement


쿼리문을 더 보기 좋게 작성 가능하기 위해 사용하는 방법으로, query 구문에 변수를 일일히 +하는 일반 statement보다

편리하다.

    Class.forName("oracle.jdbc.driver.OracleDriver");
    con = DriverManager.getConnection(url, id, password);
    String query = "UPDATE book SET book_name = ? WHERE book_name LIKE %?%";

    pstmt = con.prepareStatement(query);
    pstmt.setString(1, "updated_super_book");
    pstmt.setString(2, "ok");

    int result = pstmt.executeUpdate();

먼저 쿼리문을 준비하되, 변수가 들어갈 부분은 ?를 입력해둔다.

그리고 preparedStatement 객체를 생성하고 setString 메소드로 ? 자리에 변수를 입력하는 것이다.

 

참고자료


JDBC 및 외부라이브러리 세팅 방법

https://codevang.tistory.com/190

 

 

 

 

 

'java > jsp & sevlet' 카테고리의 다른 글

connection pool  (0) 2024.05.04
DAO와 DTO  (0) 2024.05.04
[jsp&servlet] 인코딩 방식을 통한 한글 깨짐 처리, 정상 출력  (0) 2024.05.04
[jsp&servlet] cookie, session  (0) 2024.05.04
[jsp&servlet] error page 설정 방법  (0) 2024.05.04