D+24::java-DB 연결 계속...

Am.Vinch·2022년 8월 1일
0

20220728_Thu

프로젝트명: DBTest

servlet 4개
클래스 1개
jsp 2개

*데이터베이스 함께 열어서 진행하기
MYEB 접속 표시는 콘센트 모양 확인하기!

어제 만들어놓은 데이터가 입력된 테이블 조회하기

DB에서
SELECT * FROM TEST_STUDENT;

//
2022	김자바	20	울산시
2	이자바	30	서울시
5	임꺽정	10	울산시
6	김김자바	10	동울산시
7	김중자바	50	서울산시
8	김대자바	80	남울산시
9	김아자바	55	북울산시
4	김인천	77	인천광역시
105	이순신	20	울산시
11	11	11	11
101	유관순	20	울산시

[실습] 이름,나이,학번을 가지고있는 update.jsp에서 가져온 학번으로 학생의 이름과 나이의 값을 변경하라.
DBTest 프로젝트 > update.jsp 과 UpdateServlet 만들기

1.update.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <% 
	request. setCharacterEncoding("UTF-8");
	response.setContentType("text.html;charset=UTF-8");
%>	
    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="update" method="post">
 학번 : <input type="text" name="stuNum"><br><!-- 컬럼이름대로 맞춰준다(카멜표기법이용) -->
 이름 : <input type="text" name="stuName"><br>
 나이 : <input type="text" name="stuAge"><br>
  <input type="submit" value="등록"><br>

</form>

</body>
</html>

출력창
<주의!!>
_jsp에서 f11눌러서 출력 후
이미 디비 테이블에 있었던 학번값으로 입력해야 변경가능하다!


Insert title here 학번 :
이름 :
나이 :




**2.UpdateServlet.java** ```

import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import javax.naming.Context;
import javax.naming.InitialContext;
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 javax.sql.DataSource;
@WebServlet("/update")
public class UpdateServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public UpdateServlet() {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int stuNum = Integer.parseInt(request.getParameter("stuNum"));
int stuAge = Integer.parseInt(request.getParameter("stuAge"));
String stuName = request.getParameter("stuName");

//--------------------데이터 받은 후 디비 작업 시작-------------------------------//
//주의!! 모두 자동완성으로 만들어야함
		//자바와 디비 연결할 객체
		Connection conn = null;
		//쿼리를 실행할 객체 
		PreparedStatement stmt = null;
		//조회 결과 데이터를 저장할 객체(SELECT에서만 사용)
		ResultSet rs = null;
		//쿼리문(내가 직접 작성할)
		//실제 디비에서 작성하는 것과 같이 작성한다.
		//바로 넣지말고 디비에서 실행되는지 확인 후 복사 붙어넣기!! 
		//[문제] 받아온 학번의 학생의 이름과 나이 값을 변경하라.
		String sql ="UPDATE TEST_STUDENT SET STU_NAME = ?,STU_AGE = ? WHERE STU_NUM = ?";
		 
				
		
		try {//오류발생여지가 있는 코드입력하면
			//디비 연결 정보를 받아옴.(자동완성해야함)
	         Context init = new InitialContext();
	         DataSource ds = (DataSource)init.lookup("java:comp/env/jdbc/OracleDB");
		
	         //실제로 디비와 자바를 연결
	         conn = ds.getConnection();
	         //쿼리(내가 위에서 만든) 실행 준비
	         stmt = conn.prepareStatement(sql);
	         
         //?값 세팅하기(쿼리실행전!)
	         //물음표의 순서가 앞 매개변수의 숫자 의미.
	         //뒷 매개변수는 들어갈 값
	         //각 물음표의 자료형맞추기.
			stmt.setString(1, stuName);//두번째 물음표의 넣을 값
			stmt.setInt(2, stuAge);//세번째 물음표읜 넣을 값
			stmt.setInt(3, stuNum);//첫번째 물음표의 넣을 값
	         
	         //쿼리실행(실제)
			//두 개중에 무엇을 실행할지 선택한다.
	         //stmt.executeQuery();//조회할때
	         stmt.executeUpdate();//삽입,삭제,수정할 때(int 리턴값)
	         
	         
		} catch (Exception e) {//오류발생하면 실행, 안나면 x
			 e.printStackTrace();//오류위치이유 간략히 설명
			 System.out.println("오류났어요");//오류나면 콘솔창 출력 
		}finally {//오류발생 상관없이 반드시 실행된다.
			//디비와 연결해제(순서중요!!)
			try {
				if (rs != null) {//rs가 null이 아닐때는 (실행이 됐을 때)만 닫겠다.
					rs.close();
					
				}
				if (stmt != null) {
					stmt.close();
					
				}
				if (conn != null) {
					conn.close();
				}
				
			}catch (Exception e) {
			}
			
			
		}
		//----------------디비 작업 끝 ---------------------------------------//
}

}


[실습2]
-selectServlet02.java
학번이 20번 이하인 학생들의 학번,일음,나이,주소를 조회하라
-select02.jsp
조회한 데이터 전체를 화면에 출력하라

selectServlet02.java

import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import javax.naming.Context;
import javax.naming.InitialContext;
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 javax.sql.DataSource;
@WebServlet("/selectServlet02")
public class selectServlet02 extends HttpServlet {
private static final long serialVersionUID = 1L;
private String stuAddr;

public selectServlet02() {
}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	//--------------------데이터 받은 후 디비 작업 시작-------------------------------//
			//주의!! 모두 자동완성으로 만들어야함
					//자바와 디비 연결할 객체
					Connection conn = null;
					//쿼리를 실행할 객체 
					PreparedStatement stmt = null;
					//조회 결과 데이터를 저장할 객체(SELECT에서만 사용)
					ResultSet rs = null;
					//쿼리문(내가 직접 작성할)
					//실제 디비에서 작성하는 것과 같이 작성한다.
					//바로 넣지말고 디비에서 실행되는지 확인 후 복사 붙어넣기!! 
					//[문제] 받아온 학번의 학생의 이름과 나이 값을 변경하라.
					String sql ="SELECT "
							+ "STU_NUM"
							+ ",STU_NAME"
							+ ",STU_AGE"
							+ ",STU_ADDR "
							+ "FROM TEST_STUDENT "
							+ "WHERE STU_NUM <= 20;";
					 
							
					
					try {//오류발생여지가 있는 코드입력하면
						//디비 연결 정보를 받아옴.(자동완성해야함)
				         Context init = new InitialContext();
				         DataSource ds = (DataSource)init.lookup("java:comp/env/jdbc/OracleDB");
					
				         //실제로 디비와 자바를 연결
				         conn = ds.getConnection();
				         //쿼리(내가 위에서 만든) 실행 준비
				         stmt = conn.prepareStatement(sql);
				         
			         //?값 세팅하기(쿼리실행전!)
				         //물음표의 순서가 앞 매개변수의 숫자 의미.
				         //뒷 매개변수는 들어갈 값
				         //각 물음표의 자료형맞추기.
				         
				         //쿼리실행(실제)
						//두 개중에 무엇을 실행할지 선택한다.
				         rs = stmt.executeQuery();//조회할때
				         //stmt.executeUpdate();//삽입,삭제,수정할 때(int 리턴값)
				         
				         List<StudentDTO> list = new ArrayList<>();
				        		 
				         
				         
				         
				         //다음데이터있니?
				         //while문 한번 돌때 한줄(행) 씩 돈다. 
				         while(rs.next()) {//전체 데이터가 들어간 테이블의 첫줄부터 시작하여 가리킨다. 만약 데이터가 있다면 다음데이터로 넘어간다. 

// //rs는 현재 모든 데이터를 가지고있음.
// rs.getInt("STU_NUM");//정수값 데이터를 가져오겠다.
// rs.getString("STU_NAME");
//
//데이터 어떻게 가져오는지 눈으로 확인(콘솔)
// System.out.print(rs.getInt("STU_AGE"));
// System.out.print(rs.getString("STU_NAME"));
// System.out.print(rs.getInt("STU_NUM"));
// System.out.println();//콘솔에 출력
//이렇게 while문 안에 있는게 한번 모두 돌면 한 행이 완성된다.

				        	 //페이지 이동하려면 데이터가져갈수있는>>클래스가 필요함. 사용자지정 자료형이 필요하기 때문에
				        	 //미리 만들어놓은 studentDTO 클래스 이용한다.
				        	 int stuAGe = rs.getInt("STU_AGE");
				        	 String stuName = rs.getString("STU_NAME");
				        	 int stuNum = rs.getInt("STU_NUM");
				        	 String sutAddr = rs.getString("STU_ADDR");
				        	 
				        	 
				        	 StudentDTO student = new StudentDTO();
				        	 student.setStuAge(stuAGe);
				        	 student.setStuName(stuName);
				        	 student.setStuNum(stuNum);
				        	 student.setStuAddr(stuAddr);
				        	 
				        	 //학생한명의데이터가 여러개담긴 리스트를 만들어야함 위에 미리 만들어놓음.while문 밖에 
				        	 list.add(student);//반복문 돌면서 하나하나 데이터를 넣어준다.
				         }
				         
				         //jsp에 위 값들을 던져준다.
				         request.setAttribute("list", list);
				         ///페이지이동 jsp 화면 보여주기위해서 콘솔x
				         RequestDispatcher dispatcher = request.getRequestDispatcher("select02.jsp");
				         dispatcher.forward(request, response);
				         
				         
				         
				         
				         
					} catch (Exception e) {//오류발생하면 실행, 안나면 x
						 e.printStackTrace();//오류위치이유 간략히 설명
						 System.out.println("오류났어요");//오류나면 콘솔창 출력 
					}finally {//오류발생 상관없이 반드시 실행된다.
						//디비와 연결해제(순서중요!!)
						try {
							if (rs != null) {//rs가 null이 아닐때는 (실행이 됐을 때)만 닫겠다.
								rs.close();
								
							}
							if (stmt != null) {
								stmt.close();
								
							}
							if (conn != null) {
								conn.close();
							}
							
						}catch (Exception e) {
						}
						
						
					}
					//----------------디비 작업 끝 ---------------------------------------//


}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}

}

-select02.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri= "http://java.sun.com/jsp/jstl/core" %>
<%
request. setCharacterEncoding("UTF-8");
response.setContentType("text.html;charset=UTF-8");
%>

Insert title here ${student.stuAge } ${student.stuName} ${student.stuNum } ${student.stuAddr }

[실습3]
select_num.jsp
-학번을입력받을 수있다. input 태그만들기
SelectSdervlet03.java
-입력받은 학번을 가진 학생의 학번 , 이름을 조회
select03.jsp
-조회한 학생의 정보를 출력

-select_num.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>
<form action="selectNum" method="post">
	학번 : <input type="text" name="stuNum"><br>
	<input type="submit" value="조회">

</form>
</body>
</html>

SelectSdervlet03.java

import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import javax.naming.Context;
import javax.naming.InitialContext;
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 javax.sql.DataSource;
@WebServlet("/selectNum")
public class selectServlet03 extends HttpServlet {
	private static final long serialVersionUID = 1L;
    public selectServlet03() {
        super();
    }
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	}
	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	
		//변수받아오기.
		int stuNum = Integer.parseInt(request.getParameter("stuNum"));
		
						//자바와 디비 연결할 객체
						Connection conn = null;
						//쿼리를 실행할 객체 
						PreparedStatement stmt = null;
						//조회 결과 데이터를 저장할 객체(SELECT에서만 사용)
						ResultSet rs = null;
						//쿼리문(내가 직접 작성할)
						//실제 디비에서 작성하는 것과 같이 작성한다.
						//바로 넣지말고 디비에서 실행되는지 확인 후 복사 붙어넣기!! 
						//[문제] 받아온 학번의 학생의 이름과 나이 값을 변경하라.
						String sql ="SELECT STU_NUM,STU_NAME FROM TEST_STUDENT WHERE STU_NUM = ? ";
						 
								
						
						try {//오류발생여지가 있는 코드입력하면
							//디비 연결 정보를 받아옴.(자동완성해야함)
					         Context init = new InitialContext();
					         DataSource ds = (DataSource)init.lookup("java:comp/env/jdbc/OracleDB");
						
					         //실제로 디비와 자바를 연결
					         conn = ds.getConnection();
					         //쿼리(내가 위에서 만든) 실행 준비
					         stmt = conn.prepareStatement(sql);
					         
				         //?값 세팅하기(쿼리실행전!)
					         stmt.setInt(1, stuNum);
					       
					         
					         //쿼리실행(실제)
					         rs = stmt.executeQuery();//조회할때
					         
					         
					         //한 줄만 필요하기때문에 리스트 필요 없음.!!!
					         //하나 담을 통만들기
					         StudentDTO student = new StudentDTO();

					         while(rs.next()) {
					        	 student.setStuNum(rs.getInt("STU_NUM"));
					        	 student.setStuName(rs.getString("STU_NAME"));
					        	 
					         }
					         //페이지 넘기기 전에 자료를 먼저 넘기기
					         request.setAttribute("student", student);
					         ///페이지이동 jsp 화면 보여주기위해서 콘솔x
					         RequestDispatcher dispatcher = request.getRequestDispatcher("select03.jsp");
					         dispatcher.forward(request, response);
					         
					         
					         
					         
					         
						} 
						catch (Exception e) {//오류발생하면 실행, 안나면 x
							 e.printStackTrace();//오류위치이유 간략히 설명
							 System.out.println("오류났어요");//오류나면 콘솔창 출력 
						}finally {//오류발생 상관없이 반드시 실행된다.
							//디비와 연결해제(순서중요!!)
							try {
								if (rs != null) {//rs가 null이 아닐때는 (실행이 됐을 때)만 닫겠다.
									rs.close();
									
								}
								if (stmt != null) {
									stmt.close();
									
								}
								if (conn != null) {
									conn.close();
								}
								
							}catch (Exception e) {
							}
							
						}
	}

}

select03.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>
이름 : 	${student.stuName}<br>
학번 : 	${student.stuNum }<br>
 	<br>
</body>
</html>

결과
이미있는 학번을 입력한 뒤 조회하면
해당 학번을 가진 학생의 학번과 이름이 조회된다.

Insert title here 학번 :


20 김자바 2022
45 룰루 598
31 박박자바 2
10 임꺽정 5
10 김김자바 6
50 김중자바 7
80 김대자바 8
55 김아자바 9
77 김인천 4
20 이순신 105
11 11 11
20 유관순 101


자바와 디비연결해서 학생 관리프로그램 페이지 만들기

데이터베이스
--회원 정보 테이블
--회원 아이디,회원 비밀번호,이름,나이,이메일,연락처,성별

CREATE TABLE MEMBER(
    ID VARCHAR2(50) PRIMARY KEY 
    --기본키(PK)로 설정하면 문자열크기(바이트기준) 50으로 제한하면 NULL값도 안된다.
    , PW VARCHAR2(50) NOT NULL --NULL 들어오면 오류(필수입력)
    , NAME VARCHAR2(50) NOT NULL
    , AGE NUMBER
    , EMAIL VARCHAR2(100) UNIQUE --중복은 안되지만 NULL은 가능하다.(선택사항)
     --UNIQUE NOT NULL --중복은 X NULL은 불가능하다. 기본키와 같다.
    , TELL VARCHAR2(100) -- 010-1111-1111 
    , GENDER VARCHAR2(10) --남,여 (한글 한글자: 3바이트)
);
SELECT * FROM MEMBER;

디비와 자바 연동하러가기

0.셋팅하기
-자바 프로젝트 만들기 (체크하기!!)

-파일복사 붙여넣기

1.인덱스 파일 만들기

<%@ 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>
<jsp:forward page="memberList.me"></jsp:forward>
</body>
</html>

2.멤버컨트롤러 서블릿 만들기

package controller;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
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;

@WebServlet("*.me")
public class MemberController extends HttpServlet {
private static final long serialVersionUID = 1L;
//학생목록페이지를 저장할 수 있는 리스트 객체 생성
//StudentDTO(학생 한명)을 여러 명 저장할 수 있는 리스트(studentList) 공간을 만든다.

public MemberController() {
    super();
}

protected void doGet(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException {
	doProcess(request, response);
}

protected void doPost(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException {
	doProcess(request, response);
}

protected void doProcess(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException {
	//한글 인코딩 처리
	request.setCharacterEncoding("UTF-8");
	response.setContentType("text/html;charset=UTF-8");

	String requestURI = request.getRequestURI();
	String contextPath = request.getContextPath();
	String command = requestURI.substring(contextPath.length());
	System.out.println("command = " + command);
	
	String page = "";
	boolean isRediect = false;
	
	
	//회원목록페이지
	if(command.equals("/memberList.me")) {
		page = "member_list.jsp";
	}
	
	
	
	//페이지이동에 사용되는 if문
	if(isRediect) {
		response.sendRedirect(page);
	}
	else {
		RequestDispatcher dispatcher = request.getRequestDispatcher(page);
		dispatcher.forward(request, response);
	}
}

}

3.멤버DTO 클래스만들기

package dto;

public class MemberDTO {
private String id;
private String pw;
private String name;
private int age;
private String email;
private String tell;
private String gender;

//생성자
public String getId() {
	return id;
}
public MemberDTO
(String id, String pw, String name, int age, String email, String tell, String gender) {
	super();
	this.id = id;
	this.pw = pw;
	this.name = name;
	this.age = age;
	this.email = email;
	this.tell = tell;
	this.gender = gender;
}



public void setId(String id) {
	this.id = id;
}
public String getPw() {
	return pw;
}
public void setPw(String pw) {
	this.pw = pw;
}
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;
}
public String getEmail() {
	return email;
}
public void setEmail(String email) {
	this.email = email;
}
public String getTell() {
	return tell;
}
public void setTell(String tell) {
	this.tell = tell;
}
public String getGender() {
	return gender;
}
public void setGender(String gender) {
	this.gender = gender;
}

}

4.멤버 리스트 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>
회원목록페이지
</body>
</html>

5.멤버DAO 클래스만들기

DAO: Data Access Object

 5.1) 패키지 dao 로 JDBCUtil 클래스 만들기 
 
 
 -MVC패턴 : 유지보수를 용이하게 하기위해서 역할분담하여 작업하는 방식
 컨트롤러 Controller? 요청에 따라 응답 페이지를 보여준다.
 뷰 View? 화면(jsp)을 보여준다.
 모델 Model? 비지니스 로직(실제기능)이 들어가있는 내용 -> DAO
 
 
 
 
 
 
 
 
 
 
 
 ->DB에 데이터를 미리 복사하여 받는다.
 -> 실행시켜 모든 삽입 후 커밋(저장)
![](https://velog.velcdn.com/images/ub997/post/e0355015-fbdb-4f5f-a1a9-9128cc58c1d4/image.png)

 ->이클립스들어가서 프로젝트로 run 하기.
 **결과**
 ![](https://velog.velcdn.com/images/ub997/post/0b8656b2-5199-446a-adbe-6142c765d4ab/image.png)
profile
Dev.Vinch

0개의 댓글