(DB & JDBC) 연동 순서 정리

  • by

controller service dao db
에서 역방향으로 돌아가 JDBC에 전달하는 개념

만든 패키지 : controller,service,dao,vo, +common(템플릿)

작성한 XML: driver.xml/student-sql.xml

DAO 관리: student-sql.xml
JDBCTemplate 관리: driver.xml

마지막 단계: view 안에 student 폴더를 만든 후 selectall.jsp


1. index.html (전반적으로 a href로 표현되는 html)

<!
-- 03/22 4. 학생 정보조회--> <li> <!
-- 현재 페이지 주소 : /JSPProject2/index.html --> <!
-- 목표 페이지 주소 : /JSPProject2/student/selectAll--> <a href="http://twelve727./m/student/selectAll">4. 학생 전체 조회</a> </li>

2. edu.kh.jsp. 경로로 생성되는 파일

만든 패키지 : controller,service,dao,vo, +common(템플릿)
작성한 XML: driver.xml/student-sql.xml
DAO 관리: student-sql.xml
JDBCTemplate 관리: driver.xml


패키지/index 등 폴더 정리

3. 컨트롤러 – 서비스 – DAO – VO – COMMON 순서로 코드 작성


index.html 작성: 첫 페이지에서 링크를 넘어서는 화면 출력

driver.xml 작성:oracle 연결 + 호스트 및 포트 연결 + workbook, 1234 만들기

<?xml version="1.0" encoding="UTF-8"?>
<!
DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> <properties> <comment>driver.xml file</comment> <!
-- entry : K:V로 한 쌍 --> <entry key="driver">oracle.jdbc.driver.OracleDriver</entry> <entry key="url">jdbc:oracle:thin:@localhost:1521:xe</entry> <entry key="user">workbook</entry> <entry key="password">1234</entry> </properties>

student-sql.xml 작성: 수신할 DB 구문 작성

<?xml version="1.0" encoding="UTF-8"?>
<!
DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> <properties> <entry key="selectAll"> SELECT STUDENT_NO, STUDENT_NAME, STUDENT_ADDRESS, DEPARTMENT_NAME FROM TB_STUDENT JOIN TB_DEPARTMENT USING(DEPARTMENT_NO) </entry> </properties>

JDBCTemplate

DB 연결Connection

자동 커밋 X, 객체 자원 반환(close)

JDBC에서 반복적으로 사용되는 코드를 모은 클래스

모든 필드, 메소드는 static 로서 다루어집니다

어디에서나 클래스명, 필드명/클래스명, 메소드명으로 출력하기 위해서

	private static Connection conn = null;
	public static Connection getConnection() {
   
// try 문 시작!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
try { } if(conn == null || conn.isClosed()) { Properties prop = new Properties() tring filePath = JDBCTemplate.class.getResource("/edu/kh/jsp/sql/driver.xml").getPath(); prop.loadFromXML( new FileInputStream(filePath)); String driver = prop.getProperty("driver"); String url = prop.getProperty("url"); String user = prop.getProperty("user"); String password = prop.getProperty("password"); Class.forName(driver); conn = DriverManager.getConnection(url, user, password); conn.setAutoCommit(false); // catch 문 시작!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
} catch(Exception e) { System.out.println("(Connection 생성 중 예외 발생)"); e.printStackTrace(); } return conn; } // Connection 객체 반환 메소드 !
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
public static void close(Connection conn) { try { if(conn !
=null && !
conn.isClosed()) conn.close(); } catch(Exception e) { e.printStackTrace(); } } // Statement(부모), PrepareStatement(자식) 객체 자원 반환 메서드 !
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
public static void close(Statement stmt) { try { if(stmt !
=null & !
stmt.isClosed()) stmt.close(); } catch(Exception e) { e.printStackTrace(); } } public static void close(ResultSet rs) { try { if(rs !
=null & !
rs.isClosed()) rs.close(); } catch(Exception e) { e.printStackTrace(); } } public static void commit(Connection conn) { try { if(conn !
=null && !
conn.isClosed()) conn.commit(); } catch(Exception e) { e.printStackTrace(); } } public static void rollback(Connection conn) { try { if(conn !
=null && !
conn.isClosed()) conn.rollback(); } catch(Exception e) { e.printStackTrace(); } } }


컨트롤러

controller 에서 extends HttpServlet + @WebServlet(“/jstl”) 작성 후 doget 로서 받는다

(do get) throws exception 해준 후

RequuestDispatcher dispatcher = req.getRequestDispatcher (요청의 위임을 받는 주소를 작성)

dispatcher.forward(req, resp); 포워드

package edu.kh.jsp.student.controller;

import java.io.IOException;
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 edu.kh.jsp.student.model.service.StudentService;
import edu.kh.jsp.student.model.vo.Student;

@WebServlet("/student/selectAll")
public class SelectAllServlet extends HttpServlet {
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
//		서비스 객체 생성	
		StudentService service = new StudentService();
		
		
		try {
			
		List<Student> stdList = service.selectAll();
		
//		조회 결과를 request에 세팅
		req.setAttribute("stdList", stdList);
		
//		요청 위임
		RequestDispatcher dispather
		= req.getRequestDispatcher("/WEB-INF/views/student/selectall.jsp");
		
		dispather.forward(req, resp);
		
	} catch(Exception e) {
		e.printStackTrace();
		}
	}
}


VO

Student 객체의 기본 생성자/파라미터 생성자/get, set/override 등


DAO

statement 객체 작성, 버스 스터드, 리턴,

finally return 까지

package edu.kh.jsp.student.model.dao;

import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

import static edu.kh.jsp.common.JDBCTemplate.*;

import edu.kh.jsp.student.model.vo.Student;

public class StudentDAO {
	
	private Statement stmt;
	private PreparedStatement pstmt;
	private ResultSet rs;
	
	private Properties prop;
	
	public StudentDAO() {
		try {
			String filePath 
			= StudentDAO.class.getResource("/edu/kh/jsp/sql/student-sql.xml").getPath();
			
			prop = new Properties();
			
			prop.loadFromXML(new FileInputStream(filePath));
			
			
		}catch(Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * @param conn
	 * @return
	 */
	public List<Student> selectAll(Connection conn) throws Exception {
		
//		결과 저장용 변수 선언
		List<Student> stdList = new ArrayList<>();
		
//		try 에서 SQL 작성하기
//	    studen-sql의 <entry> 태그 안에 있는걸 가져오는 개념
		try {
		
			String sql = prop.getProperty("selectAll");
		
//		Statement 객체 생성
			stmt = conn.createStatement();
//	    Statement 버스태워 보냄, Query인 이유? 조회여서
			
//		SQL 수행 했으니 결과(resultset) 반환 받기
			rs = stmt.executeQuery(sql);
			
			while(rs.next()) {
				
				String studentNo = rs.getString("STUDENT_NO");
				String studentName = rs.getString("STUDENT_NAME");
				String studentAddress = rs.getString("STUDENT_ADDRESS");
				String departmentName = rs.getString("DEPARTMENT_NAME");
				
				stdList.add(
						new Student(studentNo, studentName, studentAddress, departmentName)
						);
			}
			
			
		} finally {
//		finally 이유 ? 사용한 JDBC 객체 자원 반환
			
			close(rs);
			close(stmt);
		}
		
//		return 이유 ? 결과값 반환
		return stdList;
	
	}
}

서비스

Connection 생성 및 토잭 처리, 반환까지

package edu.kh.jsp.student.model.service;

import java.sql.Connection;
import java.util.List;

import static edu.kh.jsp.common.JDBCTemplate.*;

import edu.kh.jsp.student.model.dao.StudentDAO;
import edu.kh.jsp.student.model.vo.Student;

public class StudentService {

	private StudentDAO dao = new StudentDAO();
	
	public List<Student> selectAll() throws Exception {
	
//		Connection 생성
//		static .* 붙여주면 더 이상 JDBC 필요  XX
		Connection conn = getConnection();
		
		List<Student> stdList = dao.selectAll(conn);
		
//		트잭 처리
//		connection 반환
		close(conn);
		
		return stdList;
	}
}


selectAllServlet

객체 만들기/ 검색결과를 요청으로 설정/ 요청 위임

package edu.kh.jsp.student.controller;

import java.io.IOException;
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 edu.kh.jsp.student.model.service.StudentService;
import edu.kh.jsp.student.model.vo.Student;

@WebServlet("/student/selectAll")
public class SelectAllServlet extends HttpServlet {
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
//		서비스 객체 생성	
		StudentService service = new StudentService();
		
		try {
			
		List<Student> stdList = service.selectAll();
		
//		조회 결과를 request에 세팅
		req.setAttribute("stdList", stdList);
		
//		요청 위임
		RequestDispatcher dispather
		= req.getRequestDispatcher("/WEB-INF/views/student/selectall.jsp");
		
		dispather.forward(req, resp);
		
	} catch(Exception e) {
		e.printStackTrace();
		}
	}
}

selectAll.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 lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>학생 전체 조회</title> </head> <body> <table border="1"> <tr> <th>학번</th> <th>이름</th> <th>학과</th> <th>주소</th> </tr> <c:forEach var="student" items="${stdList}"> <tr> <td>${student.studentNo}</td> <td>${student.studentName}</td> <td>${student.departmentName}</td> <td>${student.studentAddress}</td> </tr> </c:forEach> </table> </body> </html>