JDBC 세팅
- java.sql 패키지 (Java SE에서 제공. 인터페이스 덩어리다)
- JDBC 드라이버
(1) 서버 자체 lib폴더에 드라이버의 jar 파일을 넣는다 : 해당 WAS에서 실행하는 모든 웹 어플리케이션에서 사용 가능
(2) 웹 어플리케이션의 프로젝트의 WEB-INF/lib 폴더에 jar을 넣는다 : 해당 웹 어플리케이션에서만 사용 가능
- DB (원하는 데이터 베이스)
1. JDBC 드라이버 로딩
JDBC 드라이버를 사용할 수 있도록 메모리에 준비작업을 해주는 메소드
static Class<?> forname(String className)
사용 예
// 오라클
Class.forName("oracle.jdbc.driver.OracleDriver");
// MySql
Class.forName("com.mysql.cj.jdbc.Driver");
static 이기 때문에 클래스이름.메소드이름() 형태로 사용한다.
2. DBMS 서버 접속
DB서버와의 연결 작업 메소드
아래의 Connection 객체는 네트워크 상의 연결 자체를 의미한다.
static Connextion getConnection(String url, String user, String password)
사용 예
// 오라클
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "scott", "tiger")
// MySql
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/scott", "scott","tiger");
url : @전까지는 오라클 프로토콜 / localhost 는 서버 주소 / 1521 는 서버 포트 / xe 는 DB 이름
user와 password는 DB 서버의 계정과 비밀번호
3. Statement 생성
Connection 로 연결된 길을 만들었고
그 길을 이용해서 SQL문을 DB에 전송하고 응답을 받는 객체,
즉, 데이터를 전달해주는 객체가 statement
Statement createStatement()
사용 예
Statement stmt = conn.createStatement();
4. SQL문 실행
(1) executeQuery
ResultSet executeQuery(String sql)
사용 예
ResultSet rs = stmt.executeQuery("select * from test")
select 한 결괏값을 추출하는 객체
ResultSet 객체는 내부적으로 커서라는 개념이 있다.
추출 된 결괏값은 각 항목 및 값(레코드)을 표로 가지고 있는데
레코드가 없더라도 항상 시작과 끝에 빈 행을 가진다.
ResultSet 객체가 가지는 메소드는 다음과 같다
- void afterLast() : 커서를 끝의 빈 행으로 이동
- void beforeFirst() : 커서를 시작의 빈 행으로 이동
- boolean next() : 커서 다음에 레코드가 있는지를 판단하여 없으면 false를 반환, 있으면 true
- String getInt(int columnIndex) : 칼럼의 값 추출 (int타입으로)
- String getString(String columnLabel) : 칼럼의 값 추출 (String타입으로)
(2) executeUpdate
int executeUpdate(String sql)
update, delete, insert 한 결괏값을 추출하는 객체
결과값은 int로 변경된 레코드의 갯수를 말한다.
5. PreparedStatement 객체
statement 객체와 같은 기능을 수행하는 객체
다른 점은 ? 기호와 함께 작성할 수 있다.
=> 가독성과 유지 보수성이 좋다.
PreparedStatement preparedStatement(String sql)
setString(int parameterIndex, String x);
사용 예
PreparedStatement pstmt = conn.preparedStatement("insert into test values(?,?)");
pstmt.setString(1, id);
pstmt.setString(2, pwd);
pstmt.executeUpdate();
6. 자원 해제
작업을 모두 완료했다면
최근에 사용했던 객체부터 거꾸로 해제한다.
해제 메소드는 아래와 같다.
close()
사용 예
stmt.close(); / pstmt.close();
conn.close();
사용 객체들을 확인하고 난 뒤 마지막으로 연결(conn) 해제를 한다.
DataSource
DB에선 반드시 Connection 관리가 필수다.
위의 2번 예시를 보면
DriverManager를 이용한 방식은 Connection을 Static으로 한개씩 객체를 만들어 낸다.
이는 속도를 느리게 하고 자원의 낭비를 만들어 낸다.
이를 스레드 환경으로 이용하게 해주는 것이 DataSource 객체다.
정리하면 다음과 같다.
- Connection Pool (Connection을 미리 여러개 만들어 놓은 리소스) 의 Connection을 관리하기 위한 객체
- Connection의 획득, 반납 등의 작업을 한다.
- JNDI Server (API 와 SPI 로 이루어져 있음)를 통해서 이용
API : Naming&Directory 서비스 , 자원끼리 연결해주는 기능
SPI : 새로운 서비스를 개발할 때 사용
이용 방법
(1) JNDI Server에서 lookup() 메소드를 통해 DataSource 객체 획득
(2) DataSource 객체의 getConnection() 메소드를 통해서 놀고 있는 Connection 획득
(3) Connection 객체를 통해 DBMS 작업 다 하고 끝나면 다시 Connection Pool 에 Connection 반납
DataSource 사용 시 Import 해야하는 패키지는 아래와 같다.
<%@ page import="java.sql.*" %>
<%@ page import="javax.sql.*" %>
<%@ page import="javax.naming.*" %>
java.sql은 일반 데이터베이스 작업을 위해
javax.sql은 DataSource 객체 사용을 위해
javax.naming은 JDNI 작업을 위해
'프로젝트 진행 공부 > Servlet & JSP' 카테고리의 다른 글
13장 Custom 태그 (0) | 2022.11.09 |
---|---|
12장 EL(Expression Language) 태그 (0) | 2022.11.09 |
10장 표준 액션 태그 / JSP 자바빈즈 (0) | 2022.10.28 |
9장 JSP 내장 객체 (0) | 2022.10.27 |
8장 JSP 프로그래밍 (0) | 2022.10.27 |
댓글