1. DB(MySQL)-connector 설치 및 등록
1. mysql-connector 설치
- mysql에서 각 언어마다 연결해주는 connector를 제공하고 있으니, 가져다 쓰자!
https://mvnrepository.com/artifact/mysql/mysql-connector-java
원하는 버전 선택 후, jar파일 클릭해서 다운받기
2. 웹프로젝트의 lib에 등록
WEB-CONTENT > WEB-INF > lib에 다운 받은 jar파일을 복사 & 붙여넣기하면 연결이 끝난다.
2. DB와 통신하는 JAVA코드 작성
*웹 프로젝트 뿐만 아니라, 일반 Java파일과 연결할 때도 같은 코드를 사용한다.
*객체 지향을 위해, 코드를 분리해서 적었지만 DB관련 코드를 한 곳에 다 작성해서 사용해도 된다.
프로젝트의 파일 구조
프로젝트의 결과 화면
- main.jsp에서 실행하기
1. MySQL Workbench를 열고, 아래 코드를 작성&실행하기
- "testdb"의 이름을 가진 데이터베이스 생성
- name과 age를 가진 "data"라는 테이블을 생성
create database testdb;
use testdb;
drop table if exists data;
create table data(
name varchar(40) NOT NULL PRIMARY KEY,
age int NOT NULL
);
--test용 = 데이터가 잘 들어갔는지 확인
select * from data;
2. DB와 연결하기 위한 클래스 생성 : DBUtil.java
- 이 부분은 굳이 생성할 필요 없이, DB를 사용할 때마다 작성해도 된다.
- 코드 중복을 줄이기 위해, 클래스를 생성했다.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DBUtil {
private final String driverName = "com.mysql.cj.jdbc.Driver";
private final String url = "jdbc:mysql://localhost/testdb?serverTimezone=UTC";//database이름 = testdb
private final String user = "rootid";//자신의 workbench 아이디
private final String pass = "rootpass";//자신의 workbench 비번
private static DBUtil instance = new DBUtil();
private DBUtil(){
//1. DB Driver를 로딩
try {
Class.forName(driverName);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static DBUtil getInstance() {
return instance;
}
public Connection getConnection() throws SQLException {
//2. DB(MySQL)에 접속하기
return DriverManager.getConnection(url, user, pass);
}
//DB작업 후, 여러 클래스 close할 때 사용
public void close(AutoCloseable... closeables) {
for(AutoCloseable c : closeables) {
if(c!=null) {
try {
c.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
3. 주고 받을 데이터 형태 클래스로 만들기 : Data.java
- 굳이 클래스를 안 만들고, 데이터만 주고 받아도 됨.
package com.test.dto;
public class Data {
private String name;
private int age;
public Data() {//기본 생성자
}
public Data(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
4. Database 작업을 하는 클래스 생성 : testDao.java
- DAO(Data Access Object)라고 부름
PreparedStatement 메서드
1) execute() : 그 외 구문들 => boolean 반환
2) executeQuery() : select 구문 => ResultSet 반환
3) executeUpdate() : insert, update, delete 구문 => int 반환(영향 받은 튜플 개수)
package com.test.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import com.test.dto.Data;
import com.test.util.DBUtil;
public class testDao {
static DBUtil dbUtil = DBUtil.getInstance();
public static void insertData(Data data) throws SQLException {
Connection conn = null;
PreparedStatement pstmt = null;
try {
//3. sql문 실행
conn = dbUtil.getConnection();
StringBuilder d = new StringBuilder();
d.append("insert into data \n");
d.append("values(?, ?)");
pstmt = conn.prepareStatement(d.toString());
pstmt.setString(1, data.getName());
pstmt.setInt(2, data.getAge());
pstmt.executeUpdate();//insert실행
} finally {
dbUtil.close(pstmt, conn);
}
}
public static ArrayList<Data> selectAllData() throws SQLException {
ArrayList<Data> list = new ArrayList<>();
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = dbUtil.getConnection();
pstmt = conn.prepareStatement("select * from data");
rs = pstmt.executeQuery();//select실행
while(rs.next()) {
Data data = new Data();
data.setName(rs.getString("name"));
data.setAge(rs.getInt("age"));
list.add(data);
}
}finally {
dbUtil.close(rs, pstmt, conn);
}
return list;
}
}
5. DAO를 실행시키는 Controller 클래스 생성 : testservlet.java
package com.test.servlet;
import java.io.IOException;
import java.sql.SQLException;
import javax.servlet.RequestDispatcher;
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 com.test.dao.testDao;
import com.test.dto.Data;
@WebServlet("/testservlet")
public class testservlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static testDao dao = new testDao();
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String order = request.getParameter("action");
String url;
switch(order) {
case "insert":
url = doInsert(request, response);
response.sendRedirect(url);
break;
case "list":
url = doList(request, response);
RequestDispatcher dispatcher = request.getRequestDispatcher(url);
dispatcher.forward(request, response);
break;
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");//한글깨짐 방지
doGet(request, response);
}
private String doInsert(HttpServletRequest request, HttpServletResponse response) {
Data data = new Data();
data.setName(request.getParameter("name"));
data.setAge(Integer.parseInt(request.getParameter("age")));
try {
dao.insertData(data);
} catch (SQLException e) {
e.printStackTrace();
System.out.println("db insert중 에러!");
}
return "testservlet?action=list";
}
private String doList(HttpServletRequest request, HttpServletResponse response) {
try {
request.setAttribute("list", dao.selectAllData());
} catch (SQLException e) {
e.printStackTrace();
}
return "list.jsp";
}
}
6. 화면 작성
1) 데이터 넣기 : main.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
여기는 main.jsp입니다.
<form method="POST" action="testservlet">
<input type="hidden" name="action" value="insert">
이름 :<input type="text" name="name"/><br>
나이 :<input type="number" name="age"/>
<input type="submit" value="등록"/>
</form>
</body>
</html>
2) 데이터 전체 보기 : list.jsp
<%@page import="com.test.dto.Data"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
ArrayList<Data> list = (ArrayList<Data>)request.getAttribute("list");
for(Data data : list){
%>
이름 : <%= data.getName() %><br>
나이 : <%= data.getAge() %><br>
<%
}
%>
</body>
</html>
'Programming > Servlet & JSP' 카테고리의 다른 글
Servlet & JSP (3) - MVC 패턴 (0) | 2022.03.27 |
---|---|
Servlet & JSP (2) - Page 이동 (0) | 2022.03.27 |
Servlet & JSP (1) - 기본객체(내장객체) (0) | 2022.03.25 |
[환경설정] Context root 변경 (0) | 2022.03.24 |
[환경설정] Servlet & JSP 프로젝트 생성 (0) | 2022.03.24 |