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 하기
등록된 라이브러리를 프로젝트에서 사용할 수 있도록 세팅하는 과정이다.
- 프로젝트 우클릭- build path- configure buid path - library - class path - add variable 클릭
- 아까 등록한 jdbc 경로(oracleDB)를 선택한다.
* 다른 방법: 프로젝트 내에 라이브러리 직접 세팅하기
아까 방법들은 외부의 라이브러리를 절대경로로 가져오는 방법이다.
이 방법은 프로젝트를 자주 지우고 만들 때는 유용하지만, 프로젝트를 배포할 때는 상대경로로 설정해줘야 경로 오류를 방지할 수 있다.
- 프로젝트의 web-inf/lib 폴더에 import/file
- jdbc.jar 파일을 가져온다(다른 방법으로는 웹 컨테이너 톰켓의 lib 폴더로 jdbc.jar 파일 복사)
- src폴더 우클릭 - build path- configure- Libraries → Add JAR → 가져온 jdbc.jar을 선택 후 적용
- 이러면 referenced libraries에 추가된다.
JDBC 코드 작성하기
JDBC를 코드로 실행하는 방식은 대개 이렇다.
- 오라클 드라이브를 불러와 메모리에 할당
- java 서버 url과 id, 비번을 매개 변수로 connection 생성
- 쿼리를 위한 statement 객체 생성
- 쿼리문 작성 및 실행
- 결과를 받아와 분기처리
- 예외처리 및 리소스 해제
예시
//책 데이터를 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/lib에 jdbc 파일을 체크해야 한다.
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 |