[JSP] JDBC

Junseo Kim·2020년 1월 14일
1

[JSP]JSP기초

목록 보기
14/19

JDBC란?

Java Database Connectivity의 약자로, Java와 DB가 통신할 수 있게 해주는 API이다.

스크린샷 2020-01-14 오후 2.59.51.png

MySQL connector 설치

아래의 사이트로 접속 후, 'Looking for previous GA versions?' 를 클릭한다.
https://dev.mysql.com/downloads/connector/j/

그 후, TAR Archive를 다운 받는다.
스크린샷 2020-01-14 오후 2.42.14.png

로그인이나 회원가입을 하라는 페이지가 뜨면 그 하단에 'No thanks, just start my download.'를 눌러 다운받는다.

스크린샷 2020-01-14 오후 2.44.20.png

IntelliJ JDBC 설정

intelliJ에 접속 후, file - project Structure를 클릭한다.

스크린샷 2020-01-14 오후 2.46.28.png

Libraries 탭을 클릭 후, 상단의 + 버튼을 눌러 Java를 선택한다.

스크린샷 2020-01-14 오후 2.46.58.png

위에서 다운 받았던 mysql connector를 압축해제한 곳에 가서 '~~-bin.jar'파일을 open한다.
스크린샷 2020-01-14 오후 2.48.14.png

Ok를 누르고, 적용시키면 된다.

스크린샷 2020-01-14 오후 2.51.43.png

JDBC flow

스크린샷 2020-01-14 오후 3.49.21.png

실습해보기

form 에서 책의 이름과 위치를 받아와, DB에 저장해보겠다.

먼저 form을 만들어주고, submit 시 newBook servlet으로 mapping 시켜준다.

스크린샷 2020-01-14 오후 3.50.25.png

form에서 넘어온 데이터를 받아온다.

스크린샷 2020-01-14 오후 3.51.30.png

jdbc 설정을 위한 기본 정보들과 객체들을 선언해준다.

스크린샷 2020-01-14 오후 3.51.43.png

*db를 다룰 때는 try - catch 구문을 사용해주어야한다.(네트워크를 왔다 갔다 하는 것이기 때문)

1.Driver loading

스크린샷 2020-01-14 오후 3.54.29.png

2.Connection

스크린샷 2020-01-14 오후 3.54.35.png

3.Statement

스크린샷 2020-01-14 오후 3.54.41.png

4.Query

스크린샷 2020-01-14 오후 3.54.47.png

5.Run
쿼리문이 수정/삭제/삽입 -> executeUpdate 메서드
쿼리문이 select -> executeQuery 메서드(이 경우 result값은 int로 받는게 아니라, ResultSet 이라는 객체를 사용해 받는다 ResultSet res = stmt.executeQuery(sql); 출력 할 때는 iterator를 이용해 출력한다.while(res.next()){~~~})

스크린샷 2020-01-14 오후 3.54.54.png

전체
스크린샷 2020-01-14 오후 3.51.58.png

서버를 실행시켜보면, DB에 값이 들어감을 볼 수 있다.

스크린샷 2020-01-14 오후 3.57.16.png

* 서버 실행 시, ClassNotFoundException: com.mysql.jdbc.Driver 에러가 발생할 수 있다. 이 경우는 file - project structure에 들어가 가장 밑에 있는 Problems 탭을 선택한 후, 모든 problem를 [fix] 눌러주면 된다.

전체코드

// newBook.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <form action="newBook" method="post">
        book name: <input type="text" name="book_name"><br>
        book location: <input type="text" name="book_loc"><br>
        <input type="submit" value="register">
    </form>
</body>
</html>
// newBook.java

package com.servlet;

import com.mysql.jdbc.Connection;
import com.mysql.jdbc.Statement;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.DriverManager;

@WebServlet("/newBook")
public class newBook extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        PrintWriter out = response.getWriter();

        // db에 저장하기 위한 데이터
        String bookName = request.getParameter("book_name");
        String bookLoc = request.getParameter("book_loc");

        // driver loading을 위한 기본 정보
        String database = "jspDB"; // db이름

        String driver = "com.mysql.jdbc.Driver";
        String url = "jdbc:mysql://localhost/" + database;
        String id = "js";
        String pw = "1234";

        // 연결을 위한 Connection 객체
        Connection con = null;

        // 통신하기 위한 Statement 객체
        Statement stmt = null;

        try{
            Class.forName(driver); // driver loading

            con = (Connection) DriverManager.getConnection(url, id, pw); // connection

            stmt = (Statement) con.createStatement(); // statement

            String sql = "INSERT INTO book(book_name, book_loc) VALUES ('"+bookName+"','"+bookLoc+"' )"; // 실행할 sql

            int result = stmt.executeUpdate(sql); // sql문을 가지고 통신. return 값은 행의 수와 같은 int 값

            if(result == 1){
                out.print("Insert success");
            } else{
                out.print("Insert fail");
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {  // 자원을 썼으면 해제해주어야함. 그걸 위한 finally
            try{
                if(stmt != null) stmt.close();
                if(con != null) con.close();
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }


    }
}

PreparedStatement

위의 방식 대로 할 경우, sql문이 복잡해지면 보기가 힘들어서 나온 것이 PreparedStatement이다. flow 중에 query와 statement의 순서가 바뀐 것이다.

스크린샷 2020-01-14 오후 4.07.51.png

전체코드

newBook.jsp 코드는 같고, newBook.java만 바꿔주었다.

package com.servlet;

import com.mysql.jdbc.Connection;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

@WebServlet("/newBook")
public class newBook extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        PrintWriter out = response.getWriter();

        // db에 저장하기 위한 데이터
        String bookName = request.getParameter("book_name");
        String bookLoc = request.getParameter("book_loc");

        // driver loading을 위한 기본 정보
        String database = "jspDB"; // db이름

        String driver = "com.mysql.jdbc.Driver";
        String url = "jdbc:mysql://localhost/" + database;
        String id = "js";
        String pw = "1234";

        // 연결을 위한 Connection 객체
        Connection con = null;

        // 통신하기 위한 PreparedStatement 객체
        PreparedStatement pstmt = null;

        try{
            Class.forName(driver); // driver loading

            con = (Connection) DriverManager.getConnection(url, id, pw); // connection

            String sql = "INSERT INTO book(book_name, book_loc) VALUES (?,?)"; // 실행할 sql

            pstmt = (PreparedStatement) con.prepareStatement(sql); // PreparedStatement
            pstmt.setString(1, bookName); // 첫 번째 물음표에 해당하는 값
            pstmt.setString(2,bookLoc); // 두 번째 물음표에 해당하는 값

            int result = pstmt.executeUpdate(); // sql문을 가지고 통신. return 값은 행의 수와 같은 int 값

            if(result == 1){
                out.print("Insert success");
            } else{
                out.print("Insert fail");
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {  // 자원을 썼으면 해제해주어야함. 그걸 위한 finally
            try{
                if(pstmt != null) pstmt.close();
                if(con != null) con.close();
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
    }
}

0개의 댓글