JDBC
자바와 DBMS를 연결시켜주는 API.
SQL프롬프트를 사용하지 않고 자바 프로그램에서 SQL문을 써서 DB작업을 할 수 있도록 한다.
DBMS종류에 맞는 JDBC드라이버를 설치해서 사용한다.
1. JDBC 드라이버 다운받아 설치하기.
나는 MySQL을 사용하므로 MySQL JDBC인 Connector j 를 설치해야한다.
(자바프로그램에서 MySQL을 사용하려면 Connector j 필요)
전체 설치가 아닌 jar파일만 필요하므로 Microsoft Window가 아닌, Platform Independent 를 선택한다.
윈도우 환경이면 .zip을 다운받고, 그 외에는 .tar를 다운받는다.
https://dev.mysql.com/downloads/connector/j/
다운받은 폴더안의 .jar파일을 이클립스 프로젝트의 WEB-INF/lib 폴더에 넣는다.
이제 MySQL JDBC API를 사용할 수 있게되어 JSP에서 SQL문 쿼리를 작성할 수 있다.
connector j 의 사용방법은 문서 레퍼런스에 나와있다.
https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-reference.html
2. 드라이버 로드
lib에 jar파일을 넣은게 바로 드라이버를 설치한 것이다.
설치를 했으니 사용하기 위해서는 불러와야한다.
드라이브 클래스 이름은 위 문서 주소의 첫번째 Class Name에서 알 수 있다.
forName()메서드는 드라이버를 못 찾을 경우, 예외를 발생시키므로 반드시 에외처리를 해야한다.
Class.forName("com.mysql.cj.jdbc.Driver");
3. DB연결
드라이브를 연결했으니 이제 DB와 연결할 수 있다.
DB와 연결하기 위해서 DriveManager 클래스와 Connection 인터페이스가 필요하다.
Class.forName()메서드로 클래스를 로딩하면 객체가 생성되고, DriveManager에 등록된다.
그러면 DriceManager는 getConnection()메서드를 통해 Connection객체를 생성한다.
Connection객체가 있어야 SQL문을 실행할 수 있다.
Connection con =
DriverManager.getConnection("프로토콜://localhost:포트번호/DB이름", "root", "비번");
프로토콜: DB종류에 따라 프로토콜이 다 다르다. 프로토콜은 통신 규약인데 DB마다 통신 방법이 다 다르기 때문!
mysql의 프로토콜은 jdbc:mysql 이렇게 표기한다.
포트번호: MySQL설치할때 봤던 포트번호를 적는다.
DB이름: 데이터베이스 이름
4. SQL 구문작성
원하는 작업에 따라 SQL문을 작성한다.
SQL문에 변하는 값은 ?로 대체하여 작성하며, 이 물음표는 나중에 값을 꼭 채워야한다.
# SELECT(검색)
String sql = "select pass from 테이블명 where id=?";
# INSERT(추가)
String sql = "insert into 테이블명(id, pass, name) values(?,?,?)";
# UPDATE(수정)
String sql = "update 테이블명 set name=? where id=? and pass=?";
# DELETE(삭제)
String sql = "delete from 테이블명 where id=? and pass=?";
5. Statement 또는 PreparedStatement 객체 생성
위에서 DriveManager로 Connection객체를 생성하여 DB연결 정보가 Connection객체에 담겨있게 되었다.
이제 이 연결정보로 Statement나 PreparedStatement 객체를 생성해야한다.
이 둘은 실질적으로 DB에 접근하여 sql문을 DB에 보내는 객체다.
(1) Statement
연결정보가 담긴 객체(Connection)로 Statement객체를 생성하고 sql문을 담아 실행한다.
Statement stmt = con.createStatement();
stmt.executeUpdate(sql);
단점: Statement는 실행할때 쿼리문을 가져와서 실행하여 실행할때마다 컴파일 단계를 거쳐서
쿼리문이 많으면 엄청 부담이 된다.
또한 sql문을 하나하나 하드코딩(값을 직접 쓰는거)을 해야해서 보안상 좋지 않다.
ex) String sql = "delete from 테이블명 where id='admin' and pass='1234'";
이런 단점들을 보완하고자 나온것이 PreparedStatement 다.
(2) PreparedStatement
Statement의 단점을 보완한 것으로, 객체를 생성할때 미리 sql문을 가져와서 준비(Prepare)한다.
객체를 생성할 때 단 한번만 컴파일을 하여 준비된 sql문에 값만 바꿔서 실행하는 것이다.
✓ 객체 생성
PreparedStatement pstmt = con.prepareStatement(sql);
// Statement는 createStatement()로 괄호안에 빈공간으로 생성한 것과 다르게
// prepareStatement(sql) 객체 생성시 sql문을 가져와 준비하는 모습.
✓ 물음표 채우기
?값을 sql구문에 채워넣기 : pstmt.setXXXXX(물음표인덱스, 값);
XXXX는 컬럼의 데이터타입에 따라서 변경한다.
null을 넣고싶은경우, 물음표 구간에 직접 null을 담으면 된다.
String sql = "insert into itwill_member(id, age) values(?,?)";
PreparedStatement pstmt = con.prepareStatement(sql);
// 1번물음표에 "admin"값을 넣는다.
pstmt.setString(1, id);
pstmt.setInt(2, 23);
6. SQL 실행
sql문의 준비가 다 끝났으면 실행한다.
insert, update, delete : executeUpdate(); =>DB테이블이 바뀜
select : executeQuery(); =>DB테이블이 안바뀜
pstmt.executeQuery();
pstmt.executeUpdate();
stmt.executeQuery();
stmt.executeUpdate();
7. SQL실행 결과 담기: ResultSet
SELECT문을 실행한 결과는 ResultSet 객체 형태로 반환한다.
ResultSet은 select 쿼리에 의해 생성된 테이블 형태다.
ResultSet rs = pstmt.executeQuery();
ResultSet 메소드
close() | ResultSet객체 반환. 닫기 |
getXXX() | 지정한 컬럼인덱스 또는 컬럼명의 값을 XXX데이터 타입으로 가져온다. ex) rs.getInt(1), rs.getString(2) |
next() | 다음 레코드에 값이 있으면 true, 없으면 false를 반환. |
ResultSet 안에는 cursor(커서)가 있는데
커서로 한칸한칸 옮기듯, 엑셀에서 한칸한칸 옆으로 옮기듯 해서 데이터를 볼 수 있다.
ResultSet 커서 메서드
first() | 처음 레코드 행으로 이동 |
next() | 다음 레코드 행으로 이동 |
last() | 마지막 레코드 행으로 이동 |
8. 종료
DB연결하고 쿼리문 실행을 마쳤으면 종료해야한다.
rs.close();
pstmt.close();
con.close();
<전체 코드>
private Connection getConnect() {
final String DRIVER = "com.mysql.cj.jdbc.Driver";
final String URL = "jdbc:mysql://localhost:3306/DB이름";
final String ID = "root";
final String PASS = "1234";
try { // 예외처리구문: 클래스가 없을때 어떻게 할지 처리.
Class.forName(DRIVER);
con = DriverManager.getConnection(URL, ID, PASS);
System.out.println("DAO: 디비연결 성공!" + con);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return con;
} // 디비연결
'Back-end > JSP' 카테고리의 다른 글
JSP) 모델2 방식 - FrontController 컨트롤러 서블릿 만들기 (0) | 2022.03.16 |
---|---|
JSP) DB 커넥션 풀(Connection Pool) (0) | 2022.03.14 |
JSP) 쿠기(Cookie)의미와 사용하기 (0) | 2022.03.01 |
JSP) Session 생성, 삭제, 초기화 예제 (0) | 2022.03.01 |
JSP) 영역(Scope) 객체와 속성(Attribute), 페이지 이동 방법 4가지 (0) | 2022.03.01 |