[JSP]JDBC로 데이터베이스와 JSP연동

2023. 12. 18. 15:21· 공부/JSP
목차
  1. JDBC의 개요
  2. JDBC(Java DataBase Connectivity)
  3. JDBC 드라이버 란?
  4. JDBC를 사용한 JSP와 데이터베이스의 연동
  5. JDBC 드라이버 로딩 및 DBMS 접속
  6. JDBC 드라이버 로딩하기
  7. Connection 객체 생성하기
  8. 데이터베이스 연결 닫기
  9. 데이터베이스 쿼리 실행
  10. Statement 객체로 데이터 접근하기
  11. PreparedStatement 객체로 데이터 접근하기
  12. 쿼리문 실행 결과 값 가져오기
  13. ResultSet 객체
반응형

JDBC의 개요

JDBC(Java DataBase Connectivity)

  • 자바/JSP 프로그램 내에서 데이터베이스와 관련된 작업을 처리할 수 있도록 도와주는 자바 표준 인터페이스
  • 관계형 데이터베이스 시스템에 접근하여 SQL 문을 실행하기 위한 자바 API 또는 자바 라이브러리
  • JDBC API를 사용하면 DBMS의 종류에 상관없이 데이터베이스 작업을 처리할 수 있음

Untitled.png

JDBC 드라이버 란?

  • 다양한 DBMS 제조사들은 본사에서 개발한 DBMS를 Sun사의 JAVA 프로그램과 연동할 수 있도록 기술을 지원하는 것을 의미

JDBC를 사용한 JSP와 데이터베이스의 연동

  1. java.sql.* 패키지 import
  2. JDBC 드라이버 로딩
  3. 데이터베이스 접속을 위한 Connection 객체 생성
  4. 쿼리문을 실행하기 위한 Statement/PreparedStatement/CallableStatement 객체 생성
  5. 쿼리 실행
  6. 쿼리 실행의 결과 값(int, ResultSet) 사용
  7. 사용된 객체(ResultSet, Statement/PreparedStatement/CallableStatement,Connection) 종료

Untitled.png

JDBC 드라이버 로딩 및 DBMS 접속

JDBC 드라이버 로딩하기

  • JDBC 드라이버 로딩 단계에서는 드라이버 인터페이스를 구현하는 작업
  • Class.forName() 메소드를 이용하여 JDBC 드라이버를 로딩
Class.forName(String className); 
  • JDBC 드라이버가 로딩되면 자동으로 객체가 생성되고 DriverManager 클래스에 등록

[MySQL 드라이버 로딩 예]

<%
	try{
		Class.forName("com.mysql.jdbc.Driver");
	} catch(SQLException e){
			// 예외 발생 처리
			out.println("DB 오류 발생");
	} finally {
			// 무조건 실행되는 부분, DB 연동 해제 작업 필요
	}
%>
  • JDBC 드라이버 로딩은 프로그램 수행 시 한 번만 필요

Connection 객체 생성하기

  • JDBC 드라이버에서 데이터베이스와 연결된 커넥션을 가져오기 위해 DriverManager 클래스의 getConnection( ) 메소드를 사용
  • DriverManager 클래스로 Connection 객체를 생성할 때 JDBC 드라이버를 검색하고, 검색된 드라이버를 이용하여 Connection 객체를 생성한 후 이를 반환

🛠 getConnection(”url”, “사용자 아이디”, “사용자 패스워드”);

<%
	Connection conn = null;
	try {
		Class.forName("com.mysql.jdbc.Driver");
		conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/데이터베이스명?user=유저명&password=비밀번호");
		} catch(SQLException ex) {
		// 예외 발생 처리
		}
%>

데이터베이스 연결 닫기

  • 데이터베이스 연결이 더 이상 필요하지 않으면 데이터베이스와 JDBC 리소스가 자동으로 닫힐 때까지 대기하는 것이 아니라 close( ) 메소드로 생성한 Connection 객체를 해제
  • 일반적으로 데이터베이스 리소스를 사용하지 않기 위해 사용을 끝내자마자 리소스를 해제하는 것이 좋음
<%
	Connection conn = null;
	try{
		// JDBC 드라이버 로딩
		// Connection 객체 생성
		Class.forName("com.mysql.jdbc.Driver");
		conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/데이터베이스명?user=유저명&password=비밀번호");
	} catch(SQLException e){
			// 예외 발생 처리
			out.println("DB 오류 발생");
	} finally {
			// conn이 null이 아니면 연결을 닫아준다
			if (conn != null) conn.close();
	}
%>

드라이버 복사

🛠 C:\Program Files (x86)\MySQL\Connector J 8.0 안에 jar 파일을 →
이클립스 작업폴더 - 해당 패키지 - src - main - webapp - WEB-INF - lib 로 복사

<%
		Connection conn = null;
		try {
			String url = "jdbc:mysql://localhost:3306/데이터베이스명";
			String user = "root";
			String password = "1234";
			
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection(url, user, password);
			out.println("데이터베이스 연결이 성공했습니다.");
		} catch(ClassNotFoundException e) { // forName에서 드라이버를 찾지 못했을 때
			out.println("연결실패 : 드라이버 복사 필요"); 
		} catch (SQLException ex) { // 데이터베이스 연결이 실패 하였을 때
			out.println("데이터베이스 연결이 실패했습니다.<br>");
			out.println("SQLException :" + ex.getMessage());
		} finally {
			if (conn != null)
				conn.close();
		}
	%>

데이터베이스 쿼리 실행

Statement 객체로 데이터 접근하기

  • Statement 객체 ( 문장 객체 )
    • DB 연결로부터 SQL 문을 실행하기 위해서 사용
    • Connection 객체로부터 createStatement() 호출로 생성
    • 정적인 쿼리에 사용
      • 하나의 쿼리를 사용하고 나면 더는 사용할 수 없음
    • 하나의 쿼리를 끝내면 close( ) 를 사용하여 객체를 즉시 해제해야 함
      • close( ) 를 사용하여 객체를 즉시 해제하지 않으면 무시할 수 없는 공간이 필요하며 페이지가 다른 작업을 수행하는 동안 멈추지 않기 때문
    • 복잡하지 않은 간단한 쿼리문을 사용하는 경우가 좋음
Statement createStatement() throws SQLException 

Untitled.png

SELECT에만 excuteQuery 를 사용한다

INSERT, UPDATE, DELECT 등은 executeUpdate 문을 사용하여 성공/실패 유무만 int형으로 반환받음 ( 1: 성공, 0: 실패)

  • executeQuery( ) 메소드로 데이터 조회하기. select 문에 사용
ResultSet executeQuery(String sql) throws SQLException 

Untitled.png

  • executeUpdate( ) 메소드로 데이터 삽입, 수정, 삭제하기
int executeUpdate(String sql) throws SQLException 

Untitled.png

PreparedStatement 객체로 데이터 접근하기

  • PreparedStatement 객체
    • SQL에 필요한 변수 데이터 대신 “?” 로 기술하고 그 값을 메서드를 통해 설정하는 방식
    • setXxx( ) 메서드는 기본 자료형별로 제공됨
  • 하나의 객체로 여러 번의 쿼리를 실행할 수 있음
    • 동일한 쿼리문을 특정 값만 바꾸어서 여러 번 실행
    • 매개변수가 많아서 쿼리문을 정리해야 할 때 유용
  • 많이 사용되는 SQL 문장이 있는 경우 이것을 미리 SQL 문장으로 만들어 두고 필요할때마다 사용
  • 동적인 쿼리에 사용
  • Statement 객체보다 구조적이고 편리해 권장됨

Untitled.pngUntitled.png

  • executeQuery( ) 메소드로 데이터 조회하기. select 문에 사용
    • executeQuery( ) 메소드는 동적인 SELECT 쿼리문을 통해 데이터를 검색하는 데 사용
    Untitled.png
  • executeUpdate( ) 메소드로 데이터 삽입, 수정, 삭제하기
    • executeUpdate( ) 메소드는 INSERT, UPDATE, DELETE 쿼리문을 통해 데이터를 삽입, 수정, 삭제하는 데 사용

Untitled.png

Statement , preparedStatement의 차이

Statement 사용

<%@ include file="dbconn.jsp" %>
	<%
		request.setCharacterEncoding("utf-8");
	
		String id = request.getParameter("id");
		String passwd = request.getParameter("passwd");
		String name = request.getParameter("name");
		
		
		Statement stmt = null;
		
		try {
			String sql = "INSERT INTO Member(id, passwd, name) VALUES ('" +
			id + "','" + passwd + "' ,'" + name + "')";
			stmt = conn.createStatement();
			stmt.executeUpdate(sql);
			out.println("Member 테이블 삽입이 성공 했습니다.");
		} catch (SQLException ex) {
			out.println("Member 테이블 삽입이 실패했습니다.<br>");
			out.println("SQLException : " + ex.getMessage());
		} finally {
			// 닫는 순서는 처음 연 것을 가장 마지막에 닫는다.
			if (stmt != null)
				stmt.close();
			if (conn != null)
				conn.close();
		}
	%>

PreparedStatement 사용

<%@ include file="dbconn.jsp" %>
	<%
		request.setCharacterEncoding("utf-8");
	
		String id = request.getParameter("id");
		String passwd = request.getParameter("passwd");
		String name = request.getParameter("name");
		
		
		PreparedStatement pstmt = null;
		
		try {
			String sql = "INSERT INTO Member(id, passwd, name) VALUES(?,?,?)";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, id);
			pstmt.setString(2,passwd);
			pstmt.setString(3,name);
			pstmt.executeUpdate();
			out.println("Member 테이블 삽입이 성공 했습니다.");
		} catch (SQLException ex) {
			out.println("Member 테이블 삽입이 실패했습니다.<br>");
			out.println("SQLException : " + ex.getMessage());
		} finally {
			// 닫는 순서는 처음 연 것을 가장 마지막에 닫는다.
			if (pstmt != null)
				pstmt.close();
			if (conn != null)
				conn.close();
		}
	%>

PreparedStatement를 사용하면

SQL 구문안에 들어갈 값을 “?” 로 만들어 주고 밑에서 해당하는 자료형 INT, String 등을 지정하여 훨씬 보기 쉽게 그리고 코드의 재사용을 쉽게 작성할 수 있다.

String id = request.getParameter(”id”); // form에서 id 값을 id 변수에 대입
String sql = “SELECT id FROM member WHERE id = ?” // 해당 SQL을 만든다.
PreparedStatement pstmt = conn.prepareStatement(sql); // prepareStatement를 선언
pstmt.setString(1, id); // SQL에서 첫번째 물음표부분에 id 변수값으로 설정
pstmt.executeUpdate(); // pstmt의 Query를 실행한다.

쿼리문 실행 결과 값 가져오기

ResultSet 객체

  • Statement 또는 PreparedStatement 객체로 SELECT 문을 사용하여 얻어온 레코드 값을 테이블 형태로 가진 객체.

Untitled.png

getString , getInteger, getChar 등등 사용 가능

[Statement 객체를 사용하는 경우]

ResultSet executeQuery(String sql) throws SQLException 

[PreparedStatement 객체를 사용하는 경우]

ResultSet executeQuery() throws SQLException 
  • ResultSet 객체에는 select 문장에 의해 추출된 모든 레코드가 들어 있음.
  • 한 번에 하나의 레코드만 접근 가능 → cursor라는 포인터 제공됨
  • cursor를 움직이기 위한 다양한 메소드가 제공됨
    • 커서의 초기값은 첫 번째 레코드 이전을 가리킨다.
    • 다음 레코드가 있으면 true, 없으면 false

SQL의 번호는 1부터 시작함!

배열과 다르게 ResultSet의 인덱스는 1부터 시작한다.

while(rs.next()) {
	out.println(rs.getString(2) + ", " + rs.getString(3) + "<br>");
} // 2번째 컬럼, 3번째 컬럼
  • rs.getString(”컬럼명”) 으로 사용해도 됨
반응형
  1. JDBC의 개요
  2. JDBC(Java DataBase Connectivity)
  3. JDBC 드라이버 란?
  4. JDBC를 사용한 JSP와 데이터베이스의 연동
  5. JDBC 드라이버 로딩 및 DBMS 접속
  6. JDBC 드라이버 로딩하기
  7. Connection 객체 생성하기
  8. 데이터베이스 연결 닫기
  9. 데이터베이스 쿼리 실행
  10. Statement 객체로 데이터 접근하기
  11. PreparedStatement 객체로 데이터 접근하기
  12. 쿼리문 실행 결과 값 가져오기
  13. ResultSet 객체
'공부/JSP' 카테고리의 다른 글
  • [JSP]쿠키
  • [JSP]파일 업로드
  • [JSP]자바빈즈 액션태그
  • [JSP]서블릿과 웹 MVC
Future0_
Future0_
rm -rf /
Future0_
Luna Developer Blog
Future0_
전체
오늘
어제
  • 분류 전체보기 (112)
    • 프로그래밍 (4)
      • 알고리즘 (4)
    • 보안 (14)
      • Dreamhack (4)
      • Hackthebox (1)
      • Webhacking (9)
    • 프로젝트 (4)
    • 공부 (80)
      • Database (2)
      • Python (11)
      • System (4)
      • Java (13)
      • JSP (13)
      • Spring (11)
      • Kotlin (16)
      • 자료구조 (10)
      • 기계학습 (0)
    • Docker (4)
    • Github (2)
    • Tip (1)
    • 잡담 (2)

블로그 메뉴

  • 홈
  • 태그

공지사항

인기 글

태그

  • 자바빈즈
  • ViewModel
  • Java
  • shared preference
  • 알고리즘
  • jsp
  • 프로그래밍
  • dreamhack
  • 자료구조
  • Android Studio
  • android studio 삭제
  • SpringBoot
  • Python
  • native app
  • api 통신
  • Database
  • 1.9.22
  • webhacking
  • 디버깅키해시
  • Computer science
  • Kotlin
  • 키 해시
  • 컴퓨터
  • cs
  • 상속
  • React
  • 보안
  • spring
  • docker
  • 코틀린기본문법

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.0
Future0_
[JSP]JDBC로 데이터베이스와 JSP연동
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.