5.JDBC/2)JDBC_개념

JDBC_개념_Day_12

구이제이 2024. 3. 7. 21:11

●studentApp프로젝트 생성

●DAO,DTO,controller 폴더생성 (자바)

●studentView 폴더 생성(webapp)

 








컨트롤러에서 db로

view로



●dbconnection(패키지) 안에 DBCon.java

 

package dbconnection;

public abstract class DBCon { //abstract 이거로 객체를 못만들게 한다.

//final static 상수라 변경하게 하지 못하게 합니다.

public final static String URL="jdbc:mysql://localhost:3306/studentdb?serverTimezone=UTC"//shopdbdb이름만 변경

public final static String USER="root" ; // DB의 아이디

public final static String PASSWORD="my1234" ; //DB의 비밀번호 

}



ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

●dbconnection(패키지) 안에MyDBConnection



package dbconnection;



//접속할떄 이렇게 사용해준다.

import static dbconnection.DBCon.PASSWORD;

import static dbconnection.DBCon.URL;

import static dbconnection.DBCon.USER;

 

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

 

public class MyDBConnection {//throws Exception : 넓게 던지는 것

// throws ClassCastException, SQLException : 구체적으로 던지는 것

 

 

public static Connection getConnection() throws SQLException { //여기서는 안던져도 되서 설정안합니다.

 

 

/* 1)여기서 처리 :  public static Connection getConnection() 

 

Connection con = null;

 

try {

Class.forName("com.mysql.cj.jdbc.Driver");//준비 //드라이브 파일을 메모리에 올린다.(가장먼저)

//con = DriverManager.getConnection(DBCon.URL,DBCon.URL,DBCon.PASSWORD);

con = DriverManager.getConnection(URL,USER,PASSWORD);//접속 //URL,USER,PASSWORD정해진틀을 DBCon에 있는 것을 static으로 가져왔습니다.

System.out.println("접속 성공");

 

 

} catch (ClassNotFoundException e) {

//e.printStackTrace(); //이게 나오면 쓰지않고 예외를 발생시켜서 처리하는 것이 좋다. //나중에 제거 또는 주석

System.out.println("예외 발생");

} catch(SQLException e) {

System.out.println("예외 발생");

 

//e.printStackTrace();  //이게 나오면 쓰지않고 예외를 발생시켜서 처리하는 것이 좋다. 

}

 

 

return con;

*/

 

//2) 호출한 곳에서 try catch 사용 (public static Connection getConnection() throws SQLException)

Connection con = null;

 

try {

Class.forName("com.mysql.cj.jdbc.Driver");//준비 //드라이브 파일을 메모리에 올린다.(가장먼저)

//con = DriverManager.getConnection(DBCon.URL,DBCon.URL,DBCon.PASSWORD);

 

 

} catch (ClassNotFoundException e) {

//e.printStackTrace(); //이게 나오면 쓰지않고 예외를 발생시켜서 처리하는 것이 좋다. //나중에 제거 또는 주석

System.out.println("예외 발생");

 

con = DriverManager.getConnection(URL,USER,PASSWORD);//접속 //URL,USER,PASSWORD정해진틀을 DBCon에 있는 것을 static으로 가져왔습니다.

System.out.println("접속 성공");

 

 

return con;

 

}

 

 

//열었다면 닫아줘야합니다.

public static void close(ResultSet rs, PreparedStatement pstmt, Connection con) {

 

if(rs != null) {

try {

rs.close();

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

 

if(pstmt != null) {

try {

pstmt.close();

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

 

if(con != null) {

try {

con.close();

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

 

 

 

}

 

 

}








ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ




#view(studentView폴더)

ㅡㅡㅡㅡ

●studentView폴더안에 studentInfo.jsp



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

   pageEncoding="UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>   

  

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Insert title here</title>

<style>

th,td{

width: 200px;

height: 50px;

line-height: 50px;

text-align: center;

}

tr:last-child {

background-color: pink;

}

hr{

margin-bottom: 20px;

}

 

</style>

</head>

<body>

<h1>학생 리스트</h1>

<hr>

<table border="1">

<tr>

<th>학번</th>

<th>이름</th>

<th>이메일</th>

<th></th>

</tr>

<%-- 자료 넣기 --%>

<c:forEach items="${studentAll}" var="s" varStatus="i"> <%-- varStatus="i" --%>

<tr>

 

<td>${i.count}</td> <%-- ${i.count} : 횟수,  ${i.index} : 인덱스  --%>

<td>${s.id}</td>

<td>${s.name}</td>

<td>${s.email}</td>

</tr>

</c:forEach>

 

<tr>

<%-- 링크 부분 수정 --%>

<td colspan="4">

<a href="/studentApp/scontrol?action=send">학생등록화면</a>

</td>

</tr>

 

 

</table>

 

</body>

</html>







ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ





●studentView폴더안에 studentInsert.jsp



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

   pageEncoding="UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>   

  

  

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>학생 정보 추가</title>

<style>

input{

height: 25px;

text-align: center;

}

hr{

margin-bottom: 20px;

}

</style>

</head>

<body>

<h1>학생 정보 추가 화면</h1>

<hr>

 

 

<%-- 컨트롤러 이동 --%>

<form method="post" action="/studentApp/scontrol?action=insert">

<%--

 

scontrol : 컨트롤러

?뒤에 : action=insert  action을 넘겨받아서  insert를 처리하게합니다.

 

--%>

 

<h3>학 번 : <input type="text" name="id" required></h3>

<h3>이 름 : <input type="text" name="name" required></h3>

<h3>이메일 : <input type="email" name="email" required></h3>

<h3><input type="submit" value="학생 등록">&nbsp;&nbsp;&nbsp;

 

<%-- 학생 정보 이동할 곳 설정 --%>

<a href="/studentApp/scontrol?action=list">학생정보리스트</a>

 

</h3>

 

<%--

type="email" > 골뱅이...

required

read

 

--%>

</form>

</body>

</html>







ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

●controller폴더안에 StudentController  (서블릿 생성)









package controller;

 

import java.io.IOException;

 

import javax.servlet.ServletConfig;

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 DAO.StudentDAO;

import DTO.Student;

 

@WebServlet("/scontrol")

public class StudentController extends HttpServlet {

private static final long serialVersionUID = 1L;

 

StudentDAO dao;

 

       

    public StudentController() {

        super();

    }

 

public void init(ServletConfig config) throws ServletException {

super.init(config);

dao = new StudentDAO();

 

}

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

//한글 처리

request.setCharacterEncoding("utf-8");

response.setContentType("text/html; charset=utf-8");

 

String view = ""; //이동할 뷰페이지 담기

String action = request.getParameter("action");

 

if(action==null) {

getServletContext().getRequestDispatcher("/scontrol?action=list")

.forward(request, response);

 

}else {

//send, insert, list

switch(action) {

case "list" : view = list(request, response); break; //studentInfo.jsp

case "insert" : view = insert(request, response); break; //studentInsert.jsp

case "send" : view = "studentInsert.jsp"; break;

 

}

 

getServletContext().getRequestDispatcher("/studentView/" + view) //studentView폴더밑에 view주소

.forward(request, response);

 

 

 

}

 

 

 

 

 

}

 

// list

public String list(HttpServletRequest request, HttpServletResponse response) {

// dao.getAll()을 호출 -> 처리 -> 처리한 결과를 request scope object의 속성에 저장하고 보내기

// 속성 : students 라는 이름으로 설정, 이곳에 dao.getAll()호출해서 가져온 결과 담기

request.setAttribute("studentAll", dao.getAll());

return "studentInfo.jsp"; // view페이지 리턴

}

 

 

// insert

public String insert(HttpServletRequest request, HttpServletResponse response) {

//새로운 학생을 추가하는 -> 컨트롤러 -> insert( )메소드

//request.getParameter()를 이용해서 모든 입력값을 읽어와서

//Student 객체로 매핑한 다음

//dao.insert() 메소드 호출하고, 뷰페이지 이동 

 

Student std = new Student();

//문자열로 들어옴

int id = Integer.parseInt(request.getParameter("id"));

std.setId(id);

std.setName(request.getParameter("name"));

std.setEmail(request.getParameter("email"));

 

dao.insert(std); //최종적으로 db에 저장

 

request.setAttribute("studentAll", dao.getAll()); //최종적으로 리스트다시 보여주기

 

return "studentInfo.jsp";  // view페이지 리턴

}

 

 

 

}







ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

●DTO폴더 안에 Student



package DTO;

//DTO : 수레

public class Student {

private int id;

private String name;

private String email;

 

 

 

//getter,setter

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getEmail() {

return email;

}

public void setEmail(String email) {

this.email = email;

}

 

 

 

//toString

@Override

public String toString() {

return "Student [id=" + id + ", name=" + name + ", email=" + email + "]";

}

 

 

 

 

 

 

 

 

 

}





●DAO폴더안에 StudentDAO






package DAO;

 

//DAO : DB의 자료를 전달하거나 또는 DB의 자료를 가져오는 역할

//도와주는게 스튜던트 객체들.



import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.ArrayList;

import java.util.List;

 

import DTO.Student;

import dbconnection.MyDBConnection;

 

public class StudentDAO {

//private Connection con = null; : 원래는 커넥션은 private로 잡습니다. 배우는 과정이라 private로 합니다.,

//private PreparedStatement pstmt = null;

//private ResultSet rs = null;

 

Connection con = null; // db연결

PreparedStatement pstmt = null; //sql 전달

ResultSet rs = null; // sql실행, 결과받기

 

//학생 등록 - insert를 위한 것, 

//sql삽입하기위한 목적

//폼으로부터 입력 컨트롤러가 가져다가 DTO라는 수레 담아서 DAO에 보내줘서 이것을 db에 삽입

public void insert(Student student) { //DTO 수레를 매개값으로 받는 것

 

//String sql = "insert into student(id, name, email) values(?, ?, ?)";

String sql = "insert into student(id, name, email) values(?, ?, ?)";

 

try {

con = MyDBConnection.getConnection();

pstmt = con.prepareStatement(sql);

 

pstmt.setInt(1, student.getId());

pstmt.setString(2, student.getName());

pstmt.setString(3, student.getEmail());

 

pstmt.executeUpdate(); // executeUpdate() = insert, delete , update

 

 

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace(); // 프로그램 완료후에는 주석 또는 제거 

}finally {

MyDBConnection.close(rs, pstmt, con);

}

 

 

 

}//end of insert()

 

 

 

//학생 리스트 - 전체 자료를 출력하기 위한 목적

  //sql자료 가져다가 화면 전체에 뿌려주기위한 목적

// db에서 전체리스트 읽어와서 dto수레에 담아서 컨트롤러에게 전달 

public List<Student> getAll() { //findAll()

List<Student> students = new ArrayList<>();

//list 인터페이스라서, (ArrayList)자식을 통해서 객체를 생성해야 합니다.

 

//String sql = "select id, name, email from student";

String sql = "select * from student";

 

try {

con = MyDBConnection.getConnection();

pstmt = con.prepareStatement(sql);

rs = pstmt.executeQuery(); // executeQuery() = select

 

//ResultSet에 있는 내용을 가져오기

while(rs.next()) {

//Student라는 객체를 생성해서 자료를 담기

Student std = new Student(); //각 자료에 대한 객체

 

std.setId(rs.getInt(1)); //id

std.setName(rs.getString(2)); //name

std.setEmail(rs.getString(3)); //email

 

//객체를 ArrayList 배열에 추가

students.add(std);

 

 

 

}

 

 

} catch (SQLException e) {

e.printStackTrace(); // 나중에 지워줄 것..

 

}finally { //리소스 닫기

MyDBConnection.close(rs, pstmt, con);

}

 

 

return students; //객체를 넘겨주었습니다. 

//구체적으로 list<Student> 

//list를 넘겨주었고 타입은 Student(DAO)를 넘겼습니다.

}

 

 

 

 

 

 

 

 

 

 

 

 

 

}









 

컨트롤러를 스튜던트수레로로 넘겨받아 아이디패스워드  담아서 일로와서 

모델(DAO)는 db 테이블에 맵핑시킵니다.

DB엔티티(테이블) 이거를 DO라 한다 (databse object)

 

컨트롤러가 가져다가 DTO라는 수레를 실어서 DAO에게 보내줘서 DB에 삽입







#StudentDAO 설명




#DAO ,controller, studentInfo

 

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

폴더생성

●bankexam01.txt 파일생성

 

2023-01-30,-5000,배달비

2023-01-30,-3500,음식비

2023-02-01,3500000,급여

2023-02-02,27000,작업수당

2023-02-02,-250000,렌트비

2023-02-03,385000,작업수당

2023-02-05,-30000,영화비





com.bankexamfirst.BankExamFirst 폴더생성

 

 

 

com.bankexamfirst.BankExamFirst 폴더안에 BankTransactionAnalyzerSimple 

 

package com.bankexamfirst.BankExamFirst;

 

import java.io.IOException;

import java.nio.file.Files;

import java.nio.file.Path;

import java.nio.file.Paths;

import java.time.LocalDate;

import java.time.Month;

import java.time.format.DateTimeFormatter;

import java.util.List;

 

public class BankTransactionAnalyzerSimple {

private static final String RESOURCES = "src/main/java/"; //상수 경로

 

public static void main(String[] args) throws IOException {

//경로 설정

final Path path = Paths.get(RESOURCES + "bankexam01.txt"); //경로

//파일의 모든 줄을 읽어 저장

final List<String> lines = Files.readAllLines(path);

//readAllLines파일의 라인(행)을 읽어서 저장

 

double total = 0;

//날짜 패턴

final DateTimeFormatter DATE_PATTERN = DateTimeFormatter.ofPattern("yyyy-MM-dd"); // yyyy년과 dd일은 소문자, MM월은 대문자

 

//lines 내용을 ,를 기준으로 나누기

for(final String line : lines) {

//콤마로 구분해서 저장, 열을 분리

final String[] columns = line.split(",");

 

 

//날짜 형식, 파싱

final LocalDate date = LocalDate.parse(columns[0], DATE_PATTERN);

 

 

 

if(date.getMonth() == Month.FEBRUARY) {

final double amount = Double.parseDouble(columns[1]);

total += amount;

}

}

System.out.println("모든 거래의 합계 : " + total);

 

 

}

}




ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ








ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

●mysql

 

drop database if exists studentdb;

create database studentdb;

use studentdb;

 

drop table if exists student;

create table student(

id int primary key,

    name varchar(50),

    email varchar(50)

    );

    

    select * from student;

    

insert into student(id, name, email) values(202401, "홍길동","aa@aa.com");

insert into student(id, name, email) values(202402, "김디비","ba@aa.com");

insert into student(id, name, email) values(202403, "이강산","ca@aa.com");

insert into student(id, name, email) values(202404, "박하늘","da@aa.com");

 

    select * from student;

    

 

'5.JDBC > 2)JDBC_개념' 카테고리의 다른 글

JDBC_개념_Day_14  (0) 2024.03.08
JDBC_개념_Day_13  (0) 2024.03.07
JDBC_개념_Day_11  (1) 2024.03.05
JDBC_개념_Day_10  (0) 2024.03.04
JDBC_개념_Day_09  (0) 2024.03.02