티스토리 뷰

1.아래를 프로그래밍 하시오.
-DTO  = dept Dto 클래스 
-DAO  = dept Dao 클래스
dept_select.jsp ->dept 테이블에 있는 내용을 전부 유저에게 출력하여 
보여주는 페이지

 

우선 C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib 에 가서 

ojdbc6_g.jar을 복사해 프로젝트 파일의 lib에 붙여넣어야 한다! (sql을 불러오기 위해서)

DTO  = dept Dto 클래스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package edu.kosmo.ex.dto;
 
public class DeptDto { //sql 테이블 한 줄이 객체 하나...?
    private int deptno;
    private String dname;
    private String loc;
    // 컬럼 순서대로 변수 작성
    
    public DeptDto() {
        
    }
 
    public DeptDto(int deptno, String dname, String loc) {
        this.deptno = deptno;
        this.dname = dname;
        this.loc = loc;
    }
 
    public int getDeptno() {
        return deptno;
    }
 
    public void setDeptno(int deptno) {
        this.deptno = deptno;
    }
 
    public String getDname() {
        return dname;
    }
 
    public void setDname(String dname) {
        this.dname = dname;
    }
 
    public String getLoc() {
        return loc;
    }
 
    public void setLoc(String loc) {
        this.loc = loc;
    }
    
    
}
cs

 

DAO  = dept Dao 클래스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package edu.kosmo.ex.dao;
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
 
import edu.kosmo.ex.dto.DeptDto;
 
public class DeptDao {
    // 이거 오타나면 오류....찾기도 힘들..ㅋㅋㅠㅠ 꼭 복붙하기...
    private String driver = "oracle.jdbc.driver.OracleDriver";
    private String url = "jdbc:oracle:thin:@localhost:1521:xe";
    private String uid = "scott";
    private String upw = "tiger";
    
    public DeptDao() {
        try {
            Class.forName(driver); // class 객체!
            // 객체 생성 방법 - 1. new , 2. clone
            // 이 외의 새로운 객체 생성 방법? 해당 오라클 드라이버 클래스를 바로 불러와서 메모리에 올린다.
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    public ArrayList<DeptDto> deptSelect(){ // sql 데이터를 arraylist에 넣어준다!
        ArrayList<DeptDto> dtos = new ArrayList<DeptDto>();
        
        // import할 때 다른 걸 끌고 오지 않도록 주의! 꼭 sql로
        Connection con = null;
        Statement stmt = null;
        ResultSet rs = null;
        
        try {
            String query = "SELECT * FROM dept"// sql에 입력해서 복붙하기
            con = DriverManager.getConnection(url, uid, upw);
            stmt = con.createStatement();
            rs = stmt.executeQuery(query); 
            // sql 쿼리문 실행한 결과물을 받아오기 위한 함수 (select)
            
            while(rs.next()) {
                int deptno = rs.getInt("deptno");
                String dname = rs.getString("dname");
                String loc = rs.getString("loc");
                
                DeptDto deptDto = new DeptDto(deptno, dname, loc);
                
                dtos.add(deptDto);
                
            }
            
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                if(rs != null)
                    rs.close();
                if(stmt != null)
                    stmt.close();
                if(con != null)
                    con.close();
            // 닫을 때는 무조건 생성된 순서랑 반대로! 늦게 생성된걸 먼저 순차적으로 닫는다.    
            } catch (Exception e2) {
                
            }
        }
    
        return dtos;
    }
    
        
}
cs

 

dept_select.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<%@page import="edu.kosmo.ex.dto.DeptDto"%>
<%@page import="java.util.ArrayList"%>
<%@page import="edu.kosmo.ex.dao.DeptDao"%>
<%@ 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 안에 객체 생성이 보이면 안됨..나중에 뒤에서 다른 방식을 배움
    DeptDao deptDao = new DeptDao();
    
    ArrayList<DeptDto> dtos = deptDao.deptSelect();
    
    for(int i = 0; i < dtos.size(); i++){
        DeptDto dto = dtos.get(i);
        
        out.print("부서 번호: " + dto.getDeptno() + " 부서명: " + dto.getDname() 
                    + " 위치: " + dto.getLoc() + "<br>");
    }
 
%>
</body>
</html>
cs

 

 

 


2. 아래의 개념을 설명하시오.
-DAO (
Data Access Object)

데이터베이스(DB)의 데이터에 접근하기 위해 생성하는 객체이다.

데이터베이스에 접근하기 위한 로직과 비즈니스 로직을 분리하기 위해 사용한다.

즉, DB에 접속하여 데이터의 CRUD(생성, 읽기, 갱신, 삭제) 작업을 시행하는 클래스이다.

JSP 및 Servlet 페이지 내에 로직을 기술하여 사용할 수 있지만, 코드의 간결화 및 모듈화, 유지보수 등의 목적을 위해 별도의 DAO 클래스를 생성하여 사용하는 것이 좋다.

 


-DTO (Data Transfer Object)

로직을 가지고 있지 않은 순수한 데이터의 객체이며 객체의 속성과 그 속성의 접근을 위한 getter 및 setter 메소드만을 가지고 있다. (디폴트 생성자와 생성자 포함)

즉, 프로세스 사이에서 데이터를 운반하는 객체라고 생각하면 된다.

 

 

-커넥션 풀

DB연결을 위해 미리 일정수의 connection 객체를 만들어 Pool에 담아 뒀다가 사용자(프로그램)의 요청이 발생하면 Pool에서 생성되어 있는 Connection 객체를 넘겨주고 사용자가 사용이 끝나면 Connection 객체를 다시 Pool에 반환하여 보관하는 기법이다.

커넥션 풀을 사용하는 이유

1. 서버의 부하를 줄여준다.

Java에서는 DB Connection을 맺는 과정이 부하가 많이 걸리는 작업이라 동시에 많은 사람들(클라이언트들)이 DB 커넥션을 요청한다면 최악의 경우 서버가 죽어버리는 문제가 발생할 수도 있다. 이러한 문제를 해결하기 위해 미리 Connection을 생성하고 재활용하여 서버에 부하를 줄여주는 용으로 사용한다.

 

2. 서버의 한정적인 자원을 효율적으로 사용할수 있다.
서버는 한정정인 자원을 가지고 있는데 요청이 올때마다 계속해서 끝없이 Connection을 생성하게 된다면 전체 시스템에 성능에 문제가 생길 수 있다. 이러한 문제를 해결하기 위해 커넥션풀에 미리 정해진 숫자의 Connection을 생성해서 관리한다.

 

 


3. 아래의 3종 세트를 설명하시오.
-Connetion

DB 연결 객체

DriverManager.getConnection(url, uid, pwd) 으로 얻는다.

 

-Statement

SQL 문 실행 객체

connection.createStatement() 로 얻는다.

 

-Resultset

SQL의 쿼리문 (select 문) 결과를 가지는 객체

statement.executeQuery() 로 얻는다.

 

용어 정리!
프레임워크 = API = lib(라이브러리) = .jar = 모듈 = 패키지 = 컴포넌트
lib(라이브러리) = 클래스들의 모임
프레임워크 = 특정한 목적을 위한 클래스들의 모임
 API = (c 언어 시절 class가 없을 때...) 함수들의 모임
.jar = .zip(압축파일)

위 3종 세트는 JDBC를 실행시키기 위해 필요하다!

Java DataBase Connectivity의 약자로 JDBC는 자바 언어로 데이터베이스 프로그래밍을 하기 위한 라이브러리이다.

JDBC는 DBMS에 종속되지 않는 관련 API를 제공한다. JDBC API는 JDK에서 제공하며 JDBC 프로그래밍을 위해서는 JDBC드라이버가 필요하다! JDBC 드라이버는 각 DBMS 회사에서 제공하는 라이브러리 압축파일이다.  (MySQL 에는 MySQL용 JDBC 드라이버가, 오라클을 사용한다면 오라클용 JDBC 드라이버가 필요하다.)

더보기

 

 

 


4. Statement객체에 두함수의 용도는.
-executeQuery()

SQL문 실행 후 여러 개의 결과값 생기는 경우 사용한다. 

하나의 ResultSet을 만드는 SQL문에서 사용(executeQyery 메소드는 ResultSet 객체를 리턴한다.)

주로 SELECT문을 이용하는 조회에서 사용한다.

 

 


-executeUpdate()

SQL문 실행 후 테이블의 내용만 변경되는 경우 사용한다. 

INSERT, UPDATE, DELETE 등 (DML), CREATE, DROP 등(DDL)문들을 실행하는데 사용

DML을 사용할 경우 리턴값 : 작용한 열의 개수(갱신 카운트로 간주되는)를 나타내는 정수

DDL을 사용할 경우 리턴값 : 0을 리턴(DML을 실행 후 아무런 영향을 주지 않은 경우에도 '0'을 리턴한다.)

 

 

 



5. SQL  정리
-사원들의 입사일에서 입사 년도와 입사 달을 출력하는 쿼리문
-9월에 입사한 사원을 출력하는 쿼리문
-현재 날짜와 시간을 출력하는 쿼리문
-34.5678을 반올림하는 쿼리문

ㅎ....뭐지......sql문 헷갈린다.......ㅠㅠㅠ

1
2
3
4
5
6
7
8
9
10
11
-- 사원들의 입사일에서 입사 년도와 입사 달을 출력하는 쿼리문
SELECT ename, 19 || SUBSTR(hiredate,1,2)년도, SUBSTR(hiredate,4,2)달 FROM emp; 
 
-- 9월에 입사한 사원을 출력하는 쿼리문
SELECT ename, hiredate FROM emp WHERE SUBSTR(hiredate,4,2= '09';
 
-- 현재 날짜와 시간을 출력하는 쿼리문
SELECT to_char(sysdate, 'YYYY/MM/DD, HH24:MI:SS'FROM dual;
 
-- 34.5678을 반올림하는 쿼리문
SELECT 34.5678, ROUND(34.5678FROM dual;
cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
-- 중복 제거
SELECT DISTINCT job FROM emp;
 
-- 별칭 연산자
SELECT ename, sal * 12 + NVL(comm,0FROM emp; -- NVL은 comm에서 null값은 0으로 해라 라는 뜻.
SELECT ename, sal * 12 + NVL(comm,0) AS ANNSAL FROM emp; -- 컬럼명을 지정해 줄 수 있다.
 
-- 별칭에 띄어쓰기, 특수 문자를 넣기 (별칭에는 " " 사용!)
SELECT ename, sal * 12 + NVL(comm,0) AS "ANN SAL" FROM emp;
SELECT ename, sal * 12 + NVL(comm,0) AS "연봉" FROM emp; -- 한글 사용 가능
 
-- 기존의 컬럼명에 문자열 추가하기
SELECT ename || ' is a ' || job AS "연결정의 예" FROM emp;
 
 
-- 함수
 
-- DUAL 테이블 : 한 행으로 결과를 출력하기 위한 테이블
-- 산술 연산이나 날짜 등 가상 컬럼 등의 값을 한번만 출력하고 싶을 때 많이 사용한다.
-- 24 * 30 
SELECT 24 * 30 FROM dual;
 
-- 숫자 함수
SELECT -10, ABS(-10FROM dual; -- 절대값 출력
SELECT 34.5432, FLOOR(34.5432FROM dual; -- 버림
-- 특정 자릿수에서 반올림하는 함수 ROUND
SELECT 34.5678, ROUND(34.56782FROM dual;
SELECT 34.5678, ROUND(34.5678-1FROM dual; -- -는 해당 정수 자리에서 반올림
 
--TRUNC : 특정 자릿수에서 잘라내는 함수
SELECT TRUNC(34.56782), TRUNC(34.5678-1), TRUNC(34.5678), TRUNC(34.56780FROM dual;
 
-- 나누고 남은 나머지 값
SELECT MOD(272), MOD(275), MOD(277FROM dual;
 
 
-- 문자 함수.String
SELECT 'Welcome to Oracle' AS "적용 전", UPPER('Welcome to Oracle') AS "UPPER 적용 후" FROM dual;
SELECT 'Welcome to Oracle' AS "적용 전", LOWER('Welcome to Oracle') AS "LOWER 적용 후" FROM dual;
 
SELECT 'Welcome to Oracle' "적용 전", INITCAP('Welcome to Oracle'"INITCAP 적용 후" FROM dual;
 
-- 문자 길이를 구하는 함수 
SELECT LENGTH('Oracle'), LENGTH('오라클'FROM dual;
 
-- (오라클 기준 영문은 1byte, 한글은 3byte)
SELECT LENGTHB('Oracle'), LENGTHB('오라클'FROM dual;
 
-- 특정 문자의 위치를 구하는 함수
SELECT INSTR('Welcome to Oracle''O'FROM dual;
 
-- 대상 문자열이나 컬럼의 자료에서 시작 위치부터 선택 개수만큼의 문자를 추출한다.
SELECT SUBSTR('Welcome to Oracle',4,3FROM dual;
-- 보통 자주 사용하는 예시
-- 사원들의 입사일에서 입사 년도와 입사 달을 출력하는 쿼리문
SELECT ename, 19 || SUBSTR(hiredate, 12)년도, SUBSTR(hiredate, 42)달 FROM emp;
-- sql은 java와 다르게 인덱스 번호가 아니라 첫번째는 1부터 시작. /도 포함해서 센다...
-- sql은 날짜를 나타내는 데이터 타입이 따로 있다....
 
-- 9월에 입사한 사원을 출력하는 쿼리문
SELECT ename, hiredate FROM emp WHERE SUBSTR(hiredate, 42= '09';
 
-- 오른쪽 정렬하고 앞쪽으로 길이 20채울 때까지 # 추가
SELECT RPAD('ORACLE'20'#'FROM dual; 
SELECT LPAD('ORACLE'20'#'FROM dual; -- 왼쪽 정렬하고
 
-- TRIM (양 사이드 공백을 없앤다)
SELECT TRIM('               ORA CLE      'FROM dual;
SELECT TRIM('a' FROM 'aaaaaaaORA CLEaaaa'FROM dual;
SELECT LTRIM('        ORACLE    'FROM dual; -- 왼쪽 공백 없앰
SELECT RTRIM('        ORACLE    'FROM dual; -- 오른쪽 공백 없앰
 
-- 날짜 함수
-- DATE(날짜)형에 사용하는 함수
SELECT SYSDATE FROM dual; -- 시스템 현재 날짜 출력(SYSDATE)
 
-- 날짜 연산
SELECT SYSDATE-1 어제, SYSDATE 오늘, SYSDATE+1 내일 FROM dual;
 
-- 각 직원들이 근무한 개월 수를 구하는 쿼리문
SELECT ename, sysdate, hiredate, TRUNC(MONTHS_BETWEEN(SYSDATE, hiredate)) 근무개월수 FROM emp;
 
-- 특정 개월 수를 더한 날짜를 구하는 함수이다.
SELECT ename, hiredate, ADD_MONTHS(hiredate, 4FROM emp;
 
-- 오늘(화)을 기준으로 가장 가까운 다음 수요일은 언제인지 알아보는 쿼리문
SELECT SYSDATE, NEXT_DAY(sysdate, '화요일'FROM dual;
 
-- 해당 달의 마지막 날짜를 반환하는 함수이다.
-- 입사한 달의 마지막 날을 구하는 쿼리문
SELECT hiredate, LAST_DAY(hiredate) FROM emp;
 
 
-- 현재 날짜를 문자형으로 변환하여 출력하는 쿼리문
SELECT sysdate, to_char(sysdate, 'YYYY-MM-DD'FROM dual;
 
-- 사원들의 입사일을 출력하되, 요일까지 함께 출력하는 쿼리문
SELECT hiredate, to_char(hiredate, 'YYYY/MM/DD DAY'FROM emp;
 
-- 현재 날짜, 시간 출력
SELECT to_char(sysdate, 'YYYY/MM/DD, HH24:MI:SS'FROM dual;
 
-- 각 지역별 통화 기호를 앞에 붙이고 천 단위마다 콤마를 붙여서 출력하는 쿼리문(문자형)
-- ₩1,230,000
SELECT ename, sal, to_char(sal, 'L999,999'FROM emp;
 
-- TO_DATE (char을 날짜 형으로)
SELECT ename, hiredate FROM emp WHERE hiredate = TO_DATE(19810220'YYYYMMDD');
-- 19810220을 날짜형으로 바꿔서 바로 비교......
 
SELECT * FROM dept;
DESC dept;
cs

 

 


12번
 구구단 6단을 출력 하는 프로그램을 짜시오.

13번
1과 10000 사이의 숫자중 5의 배수이자 7의 배수인 
수의 갯수는(프로그램밍 하시오)

개별 전척도.
68번
-DTO  = emp Dto 클래스 
-DAO  =  emp Dao 클래스
emp_select.jsp ->emp 테이블에 있는 내용을 전부 유저에게 출력하여 
보여주는 페이지

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함