Back-end/JSP

JSP) JDBC 설치하여 JSP와 DB연결 및 SQL문 실행하기

luana_eun 2022. 3. 3. 12:59
728x90

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;
	} // 디비연결
728x90