D+23::데이터베이스(2) COMMIT ROLLBACK UPDATE DELET/학생성적등록페이지만들기/DB와 JAVA 연결

Am.Vinch·2022년 7월 27일
0

20220727_wed
어제만든 MYDB 파일에서 시작

  • SQL(Structured Query Language)

데이터 삽입,삭제 연습용 테이블 생성해보기

CREATE TABLE TEST_STUDENT(
    STU_NUM NUMBER PRIMARY KEY--무결성 제약조건
    , STU_NAME VARCHAR2(100)  
    , STU_AGE NUMBER
    , STU_ADDR VARCHAR2(100)
);

//결과
Table TEST_STUDENT이(가) 생성되었습니다.

NUMBER: 자료형.자바와 다르게 자료형이 뒤에 있다.
VARCHAR2 : 문자(문자열X)
기본키(PRIMARY KEY): 유일하게 하나만 있는 값(중복X), NULL값도 X
EX) 학생의 학번, 연락처..


->테이블 새로고침시 방금 만든 TEST_STUDENT 파일 생성됨.

*테이블 전체 조회하기.

SELECT * FROM TEST_STUDENT;

*데이터 삽입(INSERT)
-문법 : INSERT INTO 테이블명(컬럼명...) VALUES (값...);

INSERT INTO TEST_STUDENT (STU_NUM, STU_NAME, STU_AGE, STU_ADDR) 
VALUES (1, '김자바', 20, '울산시');

INSERT INTO TEST_STUDENT (STU_NUM, STU_NAME, STU_AGE, STU_ADDR) 
VALUES (2, '이자바', 30, '서울시');

//1 행 이(가) 삽입되었습니다.
//결과
1 김자바 20 울산시
2 이자바 30 서울시

*기본키가 중복이 된다면?

INSERT INTO TEST_STUDENT (STU_NUM, STU_NAME, STU_AGE, STU_ADDR)
VALUES (1, '김자바', 20, '울산시');

INSERT INTO TEST_STUDENT (STU_NUM, STU_NAME, STU_AGE, STU_ADDR)
VALUES (1, '이자바', 30, '서울시');

//결과
오류 보고 -
ORA-00001: 무결성 제약 조건(MYDB.SYS_C007305)에 위배됩니다

INSERT INTO TEST_STUDENT (STU_NUM,STU_AGE) 
VALUES (3,40);

1	김자바	20	울산시
2	이자바	30	서울시
3	(NULL)	40	(NULL)

ROLLBACK; //취소하기 F12
COMMIT; //저장하기 F11

*데이터 삭제(DELETE)
문법 : DELETE 테이블명 WHERE 조건;

DELETE TEST_STUDENT;
//3개 행 이(가) 삭제되었습니다.

->테이블 틀은 남고 데이터 내용만 삭제된다.

그렇다면, 테이블 틀 자체를 없애는 방법은?
DROP TABLE TEST_STUDENT; //그냥 끝

--학번이 1인 학생을 삭제하는 퀴리문 작성
DELETE TEST_STUDENT
WHERE STU_NUM = 1;

INSERT INTO TEST_STUDENT  VALUES(4,'김인천',77,'인천광역시');
INSERT INTO TEST_STUDENT  VALUES(5,'김자바',50,'울산시');
INSERT INTO TEST_STUDENT  VALUES(6,'김김자바',10,'동울산시');
INSERT INTO TEST_STUDENT  VALUES(7,'김중자바',50,'서울산시');
INSERT INTO TEST_STUDENT  VALUES(8,'김대자바',80,'남울산시');
INSERT INTO TEST_STUDENT  VALUES(9,'김아자바',55,'북울산시');
//결과

*데이터 수정(UPDATE)
예시_ 학번이 5번인 학생의 이름은 '임꺽정' 나이는 10 변경하라

UPDATE TEST_STUDENT 
SET
STU_NAME = '임꺽정'
,STU_AGE = 10;

->조건 안주면 모든 데이터의 이름이 '임꺽정',나이는 '10'으로만 변경된다.!!!

*조건을 주고 데이터 수정하기

UPDATE TEST_STUDENT 
SET
STU_NAME = '임꺽정'
, STU_AGE = 10
WHERE STU_NUM = 5;

//결과
2 이자바 30 서울시
5 임꺽정 10 울산시
6 김김자바 10 동울산시
7 김중자바 50 서울산시
8 김대자바 80 남울산시
9 김아자바 55 북울산시
4 김인천 77 인천광역시


학생성적등록페이지 만들기

cf)
var :사용할 변수
items :Collection객체(List, ArrayList)

프로젝트명: StudentManage1

먼저 파일 만들기
-index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>

Insert title here

-student_list.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

<%-- 학생 데이터가 없다면 --%> <%-- 학생 데이터가 없다면 --%> <%-- ${studentList }는 studentDTO 학생 한명이 여러명 있는 리스트이고 자료형은 StudentDTO이다. 이 리스트에서 하나씨 꺼내서 반복하겠다. 반복해서 사용할 변수명이 student 이다. --%>
no 학생명 국어점수 영어점수 수학점수 평균 점수입력 삭제
데이터가 없습니다.
1 ${student.name } 미입력 ${student.name} 미입력 ${student.engScore } 미입력 ${student.mathScore } 미입력 ${student.avg }

-StudentController.java (servlet)
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;

import dto.StudentDTO;

@WebServlet("*.st")
public class StudentController extends HttpServlet {
private static final long serialVersionUID = 1L;
//학생목록페이지를 저장할 수 있는 리스트 객체 생성
//StudentDTO(학생 한명)을 여러 명 저장할 수 있는 리스트(studentList) 공간을 만든다.
private List studentList = new ArrayList<>();//자동완성해야 오류x

public StudentController() {
    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("/studentList.st")) {
		request.setAttribute("studentList", studentList);
		page = "student_list.jsp";
	}
	//목록페이지의 학생등록버튼 누르면 학생정보 등록 페이지로 이동
	else if(command.equals("/regStudentForm.st")) {
		page = "reg_student_form.jsp";
	}
	//실제 학생등록 페이지
	else if(command.equals("/regStudent.st")) {
		String name = request.getParameter("name");
		int age = Integer.parseInt(request.getParameter("age"));
		String[] tells = request.getParameterValues("tell");
		String addr = request.getParameter("addr");
		String tell = tells[0] +"-"+ tells[1] +"-"+ tells[2];
		
		StudentDTO student = new StudentDTO(name, addr, age, tell);
		// 필요한 매개변수만을 이용해서 생성자 만들어 볼때, 
		//그러면 클래스 DTO로 가서 만들면 된다.
		studentList.add(student);//방금 만든 학생을 리스트에 넣겠다.
		
		page= "studentList.st";//다시 서블릿으로 온다.첫 목록페이지로 온다.
		isRediect= true;//controller에서 다시 또 controller 올때는 이렇게 만든다.
	}
	//점수등록페이지로 이동
	else if(command.equals("/regScoreForm.st")) {
		//리스트페이지에서 값 던져줘야함.
		//데이터 받기
		request.setAttribute("name", request.getParameter("name"));//한줄로 한번에 
		page = "reg_score_form.jsp";
	}
	
	//점수등록 실제
	else if(command.equals("/regScore.st")) {
		String name =request.getParameter("name");
		int korScore = Integer.parseInt(request.getParameter("korScore"));
		int engScore = Integer.parseInt(request.getParameter("engScore"));
		int mathScore = Integer.parseInt(request.getParameter("mathScore"));
		
		for( StudentDTO student: studentList) {//학생리스트에서 하나씩 꺼내본다
			if(student.getName().equals(name)) {//내가 찾은 학생으 이름이 내가 들고온 이름과 같다면
				student.setKorScore(korScore);
				student.setEngScore(engScore);
				student.setMathScore(mathScore);
				break;
			}
		}
		page= "studentList.st";//다시 서블릿으로 온다.첫 목록페이지로 온다.controller로 다시 데이터를 가져오기때문에 
		isRediect= true;
	}
	
	//학생 삭제
	else if(command.equals("/deleteStudent.st")) {
		//리스트페이지에서 값 던져줘야함.
		//데이터 받기
		request.setAttribute("name", request.getParameter("name"));//한줄로 한번에 
		for(int i=0;i<studentList.size(); i++) {
			if(studentList.get(i).getName().equals("name")) {
				studentList.remove(i);
				break;
			}
				
		}
		page="studentList.st";
		isRediect= true;
	}
	
	
	
	if(isRediect) {
		response.sendRedirect(page);
	}
	else {
		RequestDispatcher dispatcher = request.getRequestDispatcher(page);
		dispatcher.forward(request, response);
	}
}

}

-StudentDTO (Class)
package dto;

public class StudentDTO {
private String name;
private String addr;
private int age;
private String tell;//배열도 가능하지만 더 편하기 때문
private int korScore;
private int engScore;
private int mathScore;
private double avg;//실수

//생성자는 필요할 때마다 만든다. 필요에 맞게 맞춰서 
public StudentDTO(String name, String addr, int age, String tell) {
	super();
	this.name = name;
	this.addr = addr;
	this.age = age;
	this.tell = tell;
}

//getter setter
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 getTell() {
	return tell;
}
public void setTell(String tell) {
	this.tell = tell;
}
public int getKorScore() {
	return korScore;
}
public void setKorScore(int korScore) {
	this.korScore = korScore;
}
public int getEngScore() {
	return engScore;
}
public void setEngScore(int engScore) {
	this.engScore = engScore;
}
public int getMathScore() {
	return mathScore;
}
public void setMathScore(int mathScore) {
	this.mathScore = mathScore;
}
public double getAvg() {
	avg= (korScore+engScore+mathScore)/3.0;
	return avg;
}
public String getAddr() {
	return addr;
}
public void setAddr(String addr) {
	this.addr = addr;
}

// public void setAvg() {// 평균은 set가 사실 필요가 없음. 그리고 받을 필요 x
// this.avg = (korScore+engScore+mathScore)/3.0;//국영수 입력한 값으로 평균구하기
// }

}

                                                                             
                                                                         
                                                                         -reg_student_form.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="regStudent.st" method="post">
	이름: <input type="text" name="name" required><br><!--필수입력  -->
	나이: <input type="text" name="age"><br>
	연락처: 
	<select name="tell">
		<option value ="010">010</option>
		<option value ="011">011</option>
		<option value ="012">012</option>
	</select>
	<input type="text" name="tell"><br>
	<input type="text" name="tell"><br>
	<br>
	주소: 
	<input type="text" name="addr"><br>
	<input type="submit" value="기본정보 입력"><br>
	
</form>
</body>
</html>                                                                             
                                                                         -reg_score_form.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>
${name }학생의 성적을 입력합니다.<br>
<form action="regScore.st" method="post">
	<input type="hidden" name="name" value="${name }"> 
		국어<input type="text" name="korScore"><br>
		영어<input type="text" name="engScore"><br>
		수학<input type="text" name="mathScore"><br>
		<input type="submit" value="점수등록">
</form>
</body>
</html>                                                                            
                                                                             
                                                                             
lib 파일에 파일 4개 넣어두기.
![](https://velog.velcdn.com/images/ub997/post/8d0e12ba-afa4-438a-b5f8-777998d6a091/image.png)


-----
##DB와 JAVA 연결

1.서블릿 insert01에서 기본코드 입력하기

@WebServlet("/Insert01")
public class Insert01 extends HttpServlet {
private static final long serialVersionUID = 1L;

public Insert01() {
    super();
}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//자바와 디비를 연결시켜주는 객체
Connection conn = null;
//실행할 쿼리문을 저장하는 문자열
String sql = "INSERT INTO TEST_STUDENT (STU_NUM, STU_NAME, STU_AGE, STU_ADDR) VALUES (101, '이순신', 20, '울산시')";
//쿼리문을 실행하는 객체
Statement stmt = null;

  try {
     //예외가 발생할 소지가 있는 코드
     Context init = new InitialContext();
     DataSource ds = (DataSource)init.lookup("java:comp/env/jdbc/OracleDB");
     conn = ds.getConnection();
     stmt = conn.createStatement();
     stmt.executeUpdate(sql);
     System.out.println("DB 작업 성공");
  }catch(Exception e) {
     //예외 발생 시 실행할 코드
     System.out.println("DB 작업 실패");
     //오류가 난 이유와 위치를 간략하게 출력
     e.printStackTrace();
  }
  
  

}

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

}

F11 누른 후,

//콘솔결과
DB 연결 성공 

*DB 열고 미리 만든 SQL페이지에서 MYDB로 선택 후, 테이블전체 조회하면,
데이터 추가되어있음.


2.DB 페이지 들어가기 

--테이블 전체 조회하기(ctrl+enter)
SELECT * FROM TEST_STUDENT; // ctrl +enter 누른 후

//결과(빈값은 (NULL)값)
3 40
2 이자바 30 서울시
5 임꺽정 10 울산시
6 김김자바 10 동울산시
7 김중자바 50 서울산시
8 김대자바 80 남울산시
9 김아자바 55 북울산시
4 김인천 77 인천광역시
101 이순신 20 울산시 << 변화된 값

예제_학번이 101인 학생의 이름(이순신)을 '유관순'으로 변경하라.
-insert03 servlet 파일만들고 코드 입력 후 DB코드로 작성하기.

String sql = "UPDATE TEST_STUDENT SET STU_NAME ='유관순' WHERE STU_NUM =101";
//띄어쓰기 유의! 마지막 ';'은 하나만!

//결과(빈값은 (NULL)값)
3 40
2 이자바 30 서울시
5 임꺽정 10 울산시
6 김김자바 10 동울산시
7 김중자바 50 서울산시
8 김대자바 80 남울산시
9 김아자바 55 북울산시
4 김인천 77 인천광역시
101 유관순 20 울산시 <<변화된 값.

profile
Dev.Vinch

0개의 댓글