Java Database Connectivity의 약자로, Java와 DB가 통신할 수 있게 해주는 API이다.
아래의 사이트로 접속 후, 'Looking for previous GA versions?' 를 클릭한다.
https://dev.mysql.com/downloads/connector/j/
그 후, TAR Archive를 다운 받는다.
로그인이나 회원가입을 하라는 페이지가 뜨면 그 하단에 'No thanks, just start my download.'를 눌러 다운받는다.
intelliJ에 접속 후, file - project Structure를 클릭한다.
Libraries 탭을 클릭 후, 상단의 + 버튼을 눌러 Java를 선택한다.
위에서 다운 받았던 mysql connector를 압축해제한 곳에 가서 '~~-bin.jar'파일을 open한다.
Ok를 누르고, 적용시키면 된다.
form 에서 책의 이름과 위치를 받아와, DB에 저장해보겠다.
먼저 form을 만들어주고, submit 시 newBook servlet으로 mapping 시켜준다.
form에서 넘어온 데이터를 받아온다.
jdbc 설정을 위한 기본 정보들과 객체들을 선언해준다.
*db를 다룰 때는 try - catch 구문을 사용해주어야한다.(네트워크를 왔다 갔다 하는 것이기 때문)
1.Driver loading
2.Connection
3.Statement
4.Query
5.Run
쿼리문이 수정/삭제/삽입 -> executeUpdate 메서드
쿼리문이 select -> executeQuery 메서드(이 경우 result값은 int로 받는게 아니라, ResultSet 이라는 객체를 사용해 받는다 ResultSet res = stmt.executeQuery(sql);
출력 할 때는 iterator를 이용해 출력한다.while(res.next()){~~~}
)
전체
서버를 실행시켜보면, DB에 값이 들어감을 볼 수 있다.
* 서버 실행 시, 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();
}
}
}
}
위의 방식 대로 할 경우, sql문이 복잡해지면 보기가 힘들어서 나온 것이 PreparedStatement이다. flow 중에 query와 statement의 순서가 바뀐 것이다.
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();
}
}
}
}