--------------------------------
DI 테스트4
- SimpleDriverDataSource 클래스 이용
- 콘솔 프로젝트
- 오라클에 대해서 로컬 서버와 원격 서버를 동시 사용할 수 있도록 설정.
- jdbc 모듈 추가
1. 기능 구현
- 이름, 전화번호를 입력 받아서 데이터베이스에 저장
- 번호, 이름, 전화번호를 콘솔에 출력
2. 화면 구성
이름 전화번호(x exit)?kim 010-123-1234
1명의 회원이 추가되었습니다.
이름 전화번호(x exit)?x
------------------
전체 회원수 : 1명
------------------
번호 이름 전화번호
1 kim 010-123-1234
------------------
3. 데이터베이스 준비 (local, remote 오라클 서버에 동시에 설정)
CREATE TABLE memberList (
mid NUMBER --PK
,name VARCHAR2(30)
,telephone VARCHAR2(30)
);
CREATE SEQUENCE memberListSeq;
ALTER TABLE 테이블이름
ADD CONSTRAINT 제약이름 제약종류(제약대상);
ALTER TABLE 테이블이름
DROP CONSTRAINT 제약이름;
ALTER TABLE memberList
ADD CONSTRAINT memberList_mid_pk PRIMARY KEY(mid);
INSERT INTO memberList (mid, name, telephone) VALUES (memberListSeq.nextval, 'kim', '010-123-1234');
ROLLBACK;
SELECT mid, name, telephone FROM memberList;
SELECT COUNT(mid) AS count FROM memberList;
4.프로젝트 환경 설정
- Java Project 생성
- 프로젝트 선택>Build Path>Configure Build Path...>Libraries탭 선택>Add External JARS... 선택
- 아래 .jar 파일 선택
경로명1 : C:\spring-docs\spring-framework-3.0.2.RELEASE\dist
파일명 :
org.springframework.asm-3.0.2.RELEASE.jar
org.springframework.beans-3.0.2.RELEASE.jar
org.springframework.context-3.0.2.RELEASE.jar
org.springframework.core-3.0.2.RELEASE.jar
org.springframework.expression-3.0.2.RELEASE.jar
org.springframework.jdbc-3.0.2.RELEASE.jar
org.springframework.transaction-3.0.2.RELEASE.jar
경로명2 : C:\spring-dependencies\org.apache.commons\com.springsource.org.apache.commons.logging\1.1.1
파일명 :
com.springsource.org.apache.commons.logging-1.1.1.jar
ojdbc6.jar 추가할 것.
4. 프로그램 구성
//Member.java -> 자료형 클래스
//MemberDAO.java -> Conn 객체에 대해서 의존 관계 설정.
//Main.java -> main() 메소드
//applicationContext.xml -> 스프링 환경 설정 파일. DataSource 객체 등록.
5. 프로그램 소스 코드
//Member.java -> 자료형 클래스
package com.test;
public class Member {
private String mid, name, telephone ;
public String getMid() {
return mid;
}
public void setMid(String mid) {
this.mid = mid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTelephone() {
return telephone;
}
public void setTelephone(String telephone) {
this.telephone = telephone;
}
}
//MemberDAO.java -> Conn 객체에 대해서 의존 관계 설정.
package com.test;
import java.sql.*;
import java.util.*;
import javax.sql.DataSource;
public class MemberDAO {
//의존객체 주입(DI) 준비
private DataSource dataSource;
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
public ArrayList<Member> list() {
ArrayList<Member> result = new ArrayList<Member>();
Connection conn = null;
PreparedStatement pstmt = null;
try {
//Connection 객체 얻는 방법
conn = dataSource.getConnection();
String sql = "SELECT mid, name, telephone FROM memberList ORDER BY mid";
pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
while(rs.next()) {
Member member = new Member();
member.setMid(rs.getString("mid"));
member.setName(rs.getString("name"));
member.setTelephone(rs.getString("telephone"));
result.add(member);
}
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}finally {
try{
if (pstmt != null) {
pstmt.close();
}
conn.close();
}catch(SQLException se){
se.printStackTrace();
}
}
return result;
}
//전체 회원수 출력 액션 처리
public int count() {
int result = 0;
Connection conn = null;
PreparedStatement pstmt = null;
try {
//Connection 객체 얻는 방법
conn = dataSource.getConnection();
String sql = "SELECT COUNT(mid) AS count FROM memberList";
pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
while(rs.next()) {
result = rs.getInt("count");
}
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}finally {
try{
if (pstmt != null) {
pstmt.close();
}
conn.close();
}catch(SQLException se){
se.printStackTrace();
}
}
return result;
}
//회원 추가 액션 처리
public int add(Member member) {
int result = 0;
Connection conn = null;
PreparedStatement pstmt = null;
try {
//Connection 객체 얻는 방법
conn = dataSource.getConnection();
String sql = "INSERT INTO memberList (mid, name, telephone) VALUES (memberListSeq.nextval, ?, ?)";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, member.getName());
pstmt.setString(2, member.getTelephone());
pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally {
try{
if (pstmt != null) {
pstmt.close();
}
conn.close();
}catch(SQLException se){
se.printStackTrace();
}
}
return result;
}
}
//Main.java -> main() 메소드
package com.test;
import java.util.Scanner;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
ApplicationContext context
= new ClassPathXmlApplicationContext("applicationContext.xml");
MemberDAO dao
= context.getBean("memberDAO", MemberDAO.class);
Scanner sc = new Scanner(System.in);
do {
System.out.print("이름 전화번호(x exit)?");
String name = sc.next();
if (name.equalsIgnoreCase("x")) {
break;
}
String telephone = sc.next();
try {
Member member = new Member();
member.setName(name);
member.setTelephone(telephone);
dao.add(member);
System.out.println("회원이 추가 되었습니다.");
}catch(Exception e){
System.out.println(e.toString());
}
}while(true);
sc.close();
System.out.println("-----------------------");
System.out.printf("전체 인원수 : %d 명 %n"
, dao.count());
System.out.println("-----------------------");
for( Member member : dao.list()){
System.out.printf("%s %s %s %n"
, member.getMid()
, member.getName()
, member.getTelephone());
}
}
}
//applicationContext.xml -> 스프링 환경 설정 파일. DataSource 객체 등록.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="localDataSource"
class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
<property name="driverClass"
value="oracle.jdbc.driver.OracleDriver" />
<property name="url"
value="jdbc:oracle:thin:@localhost:1521:xe" />
<property name="username" value="username" />
<property name="password" value="password" />
</bean>
<bean id="remoteDataSource"
class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
<property name="driverClass"
value="oracle.jdbc.driver.OracleDriver" />
<property name="url"
value="jdbc:oracle:thin:@211.63.89.85:1521:xe" />
<property name="username" value="username" />
<property name="password" value="password" />
</bean>
<bean id="memberDAO" class="com.test.MemberDAO">
<property name="dataSource">
<ref bean="remoteDataSource" />
</property>
</bean>
</beans>
----------------------------------------------
성적관리 Spring DI 버전
- 콘솔 프로젝트
- SimpleDriverDataSource 클래스 이용
1. 기능 구현
- 학생 테이블에는 학생의 개인 정보(번호, 학생 이름, 전화번호)가 저장된다.
- 성적 테이블에는 학생의 성적 정보(번호, 과목1, 과목2, 과목3)가 저장된다.
- 번호 항목은 학생 테이블의 PK, 성적 테이블의 PK&FK로 지정한다.
- 학생 출력시 번호, 학생 이름, 전화번호, 성적 입력 여부가 출력된다.
- 학생 입력은 학생 이름, 전화번호를 입력한다.
- 성적 출력시 번호, 학생이름, 과목1, 과목2, 과목3, 총점, 평균, 판정 점수가 출력한다.
- 판정 기준은 합격, 과락, 불합격으로 구분한다.
- 성적 입력이 안된 학생인 경우는 번호, 학생 이름만 출력하고 점수는 null 문자 또는 X 문자로 출력한다.
- 성적 입력은 학생 개개인별로 과목1, 과목2, 과목3 점수를 입력한다.
2. 화면 구성
--- 성적 관리 ---
1. 학생 입력
2. 성적 입력 (학생 검색)
3. 학생 출력
4. 성적 출력
메뉴 선택(1~4, x 종료)?1
--- 학생 입력 ---
이름 전화번호(x 종료)?kim 010-111-1111
1명의 학생을 입력했습니다.
이름 전화번호(x 종료)?x
--- 성적 관리 ---
1. 학생 입력
2. 성적 입력 (학생 검색)
3. 학생 출력
4. 성적 출력
메뉴 선택(1~4, x 종료)?2
-- 성적 입력 ---
학생 번호 검색(x 종료)?1
1, kim, 010-111-1111, O
이미 성적이 입력된 상태입니다.
학생 번호 검색(x 종료)?2
2, park, 010-222-2222, X
과목1의 점수?100
과목2의 점수?100
과목3의 점수?100
1명의 성적을 입력했습니다.
학생 번호 검색(x 종료)?3
검색 결과 없습니다.
학생 번호 검색(x 종료)?x
--- 성적 관리 ---
1. 학생 입력
2. 성적 입력 (학생 검색)
3. 학생 출력
4. 성적 출력
메뉴 선택(1~4, x 종료)?3
--- 학생 출력 ---
전체 학생 수 : 2명
-----------------------------------------
번호, 학생 이름, 전화번호, 성적 입력 여부
-----------------------------------------
1, kim, 010-111-1111, O
2, park, 010-222-2222, X
--- 성적 관리 ---
1. 학생 입력
2. 성적 입력 (학생 검색)
3. 학생 출력
4. 성적 출력
메뉴 선택(1~4, x 종료)?4
--- 성적 출력 ---
전체 학생 수 : 2명
-----------------------------------------
번호, 학생이름, 과목1, 과목2, 과목3, 총점, 평균, 판정
-----------------------------------------
1, kim, 100, 100, 100, 300, 100.0, 합격
2, park, 50, 50, 50, 150, 50.0, 불합격
--- 성적 관리 ---
1. 학생 입력
2. 성적 입력 (학생 검색)
3. 학생 출력
4. 성적 출력
메뉴 선택(1~4, x 종료)?x
3. 데이터베이스 준비
-- 학생 테이블 생성
CREATE TABLE student (
sid NUMBER --PK
,name VARCHAR2(30)
,tel VARCHAR2(30)
);
--PK 제약 추가
ALTER TABLE student
ADD CONSTRAINT student_sid_pk PRIMARY KEY(sid);
--일련번호 생성을 위한 시퀀스 객체 생성
CREATE SEQUENCE studentSeq;
--INSERT 쿼리 샘플
INSERT INTO student (sid, name, tel)
VALUES (studentSeq.nextval, 'kim', '010-111-1111');
INSERT INTO student (sid, name, tel)
VALUES (studentSeq.nextval, 'park', '010-222-2222');
SELECT * FROM student;
ROLLBACK;
--성적 테이블 생성
CREATE TABLE grade (
sid NUMBER --PK & FK
,sub1 NUMBER(3) --CHECK 제약 추가
,sub2 NUMBER(3) --CHECK 제약 추가
,sub3 NUMBER(3) --CHECK 제약 추가
);
--제약 추가
ALTER TABLE grade
ADD CONSTRAINT grade_sid_pk PRIMARY KEY(sid);
ALTER TABLE grade
ADD CONSTRAINT grade_sid_fk FOREIGN KEY(sid)
REFERENCES student(sid);
ALTER TABLE grade
ADD CONSTRAINT grade_sub1_ck
CHECK (sub1 BETWEEN 0 AND 100);
ALTER TABLE grade
ADD CONSTRAINT grade_sub2_ck
CHECK (sub2 BETWEEN 0 AND 100);
ALTER TABLE grade
ADD CONSTRAINT grade_sub3_ck
CHECK (sub3 BETWEEN 0 AND 100);
--INSERT 쿼리 샘플
INSERT INTO grade (sid, sub1, sub2, sub3)
VALUES (1, 100, 100, 100); --O
INSERT INTO grade (sid, sub1, sub2, sub3)
VALUES (1, 100, 100, 100); --X
INSERT INTO grade (sid, sub1, sub2, sub3)
VALUES (2, 200, 200, 200); --X
INSERT INTO grade (sid, sub1, sub2, sub3)
VALUES (3, 0, 0, 0); --X
--학생 테이블의 자료 2명으로 만들 것.
SELECT * FROM student;
--성적 테이블의 자료 1명으로 만들 것.
SELECT * FROM grade;
--학생 출력 쿼리
--번호, 학생 이름, 전화번호, 성적 입력 여부(0 또는 1)
--학생 테이블 + 성적 테이블 -> JOIN, SUB QUERY
--OUTER JOIN의 경우
SELECT s.sid AS sid, s.name AS name, s.tel AS tel
, DECODE(g.sid, null, 0, 1) AS sub
FROM student s, grade g
WHERE s.sid=g.sid(+);
--SUB QUERY의 경우
SELECT sid, name, tel
, DECODE((SELECT sid FROM grade WHERE sid=s.sid)
, null, 0, 1) AS sub
FROM student s;
-->뷰(View)로 등록하는 것을 권장
CREATE OR REPLACE VIEW studentView
AS
SELECT sid, name, tel
, DECODE((SELECT sid FROM grade WHERE sid=s.sid)
, null, 0, 1) AS sub
FROM student s;
-->뷰를 이용한 학생 출력 쿼리
SELECT sid, name, tel, sub
FROM studentView
ORDER BY sid;
--학생 수 출력 쿼리
SELECT COUNT(*) AS count FROM student;
--학생 검색 쿼리
SELECT sid, name, tel, sub
FROM studentView
WHERE sid=1;
--성적 출력 쿼리
--번호, 학생이름, 과목1, 과목2, 과목3, 총점, 평균, 판정(0 합격, 1 과락, 2 불합격)
--학생 테이블->번호, 학생이름
--성적 테이블->과목1, 과목2, 과목3
--총점, 평균, 판정 -> 계산 결과
--학생 테이블 + 성적 테이블 -> JOIN, SUB QUERY
--OUTER JOIN의 경우
SELECT s.sid AS sid, s.name AS name
, g.sub1 AS sub1, g.sub2 AS sub2, g.sub3 AS sub3
, NVL( (g.sub1 + g.sub2 + g.sub3), 0 ) AS tot
, NVL( ( (g.sub1 + g.sub2 + g.sub3)/3 ), 0 ) AS ave
, (CASE
WHEN (( (g.sub1 + g.sub2 + g.sub3)/3 )>=60 AND
(g.sub1>=40 AND g.sub2>=40 AND g.sub3>=40)) THEN 0
WHEN (( (g.sub1 + g.sub2 + g.sub3)/3 )>=60)
THEN 1
ELSE 2
END) AS ch
FROM student s, grade g
WHERE s.sid = g.sid(+);
--> 뷰(View) 등록
CREATE OR REPLACE VIEW gradeView
AS
SELECT s.sid AS sid, s.name AS name
, g.sub1 AS sub1, g.sub2 AS sub2, g.sub3 AS sub3
, NVL( (g.sub1 + g.sub2 + g.sub3), 0 ) AS tot
, NVL( ( (g.sub1 + g.sub2 + g.sub3)/3 ), 0 ) AS ave
, (CASE
WHEN (( (g.sub1 + g.sub2 + g.sub3)/3 )>=60 AND
(g.sub1>=40 AND g.sub2>=40 AND g.sub3>=40)) THEN 0
WHEN (( (g.sub1 + g.sub2 + g.sub3)/3 )>=60)
THEN 1
ELSE 2
END) AS ch
FROM student s, grade g
WHERE s.sid = g.sid(+);
--> 뷰를 이용한 성적 출력
SELECT sid, name, sub1, sub2, sub3, tot, ave, ch
FROM gradeView
ORDER BY sid;
--(과제)SUB QUERY의 경우
SELECT sid, name, sub1, sub2, sub3 , tot, ave
,CASE
WHEN (( ave )>=60 AND
(sub1>=40 AND sub2>=40 AND sub3>=40)) THEN 0
WHEN (( ave )>=60) THEN 1
ELSE 2
END AS ch
FROM (SELECT sid, name
,(SELECT sub1 FROM grade WHERE sid=s.sid) AS sub1
,(SELECT sub2 FROM grade WHERE sid=s.sid) AS sub2
,(SELECT sub3 FROM grade WHERE sid=s.sid) AS sub3
,NVL((SELECT (sub1+sub2+sub3)
FROM grade WHERE sid=s.sid), 0) AS tot
,NVL((SELECT (sub1+sub2+sub3)/3
FROM grade WHERE sid=s.sid), 0) AS ave
FROM student s);
4.프로젝트 환경 설정
- Java Project 생성
- 프로젝트 선택>Build Path>Configure Build Path...>Libraries탭 선택>Add External JARS... 선택
- 아래 .jar 파일 선택
경로명1 : C:\spring-docs\spring-framework-3.0.2.RELEASE\dist
파일명 :
org.springframework.asm-3.0.2.RELEASE.jar
org.springframework.beans-3.0.2.RELEASE.jar
org.springframework.context-3.0.2.RELEASE.jar
org.springframework.core-3.0.2.RELEASE.jar
org.springframework.expression-3.0.2.RELEASE.jar
org.springframework.jdbc-3.0.2.RELEASE.jar
org.springframework.transaction-3.0.2.RELEASE.jar
경로명2 : C:\spring-dependencies\org.apache.commons\com.springsource.org.apache.commons.logging\1.1.1
파일명 :
com.springsource.org.apache.commons.logging-1.1.1.jar
ojdbc6.jar 추가할 것.
5. 프로그램 구성
//Student.java -> 자료형 클래스. 학생 정보 저장용.
//Grade.java -> 자료형 클래스. 성적 정보 저장용.
//StudentDAO.java -> 데이터베이스 액션 처리 클래스
//GradeDAO.java -> 데이터베이스 액션 처리 클래스
//MenuAction.java -> 서브 메뉴 액션 클래스
//Main.java -> main() 메소드. 메인 메뉴 클래스
//applicationContext.xml -> src 폴더 하위에 생성.
6. 프로그램 소스 코드
//Student.java -> 자료형 클래스. 학생 정보 저장용.
package com.test;
//사용자 정의 자료형 클래스
public class Student {
//멤버변수, getter, setter
//데이터베이스의 테이블 내에 존재하는 모든 컬럼명 기준
//동일 자료, 동일 변수(식별자)에 저장
//->sid(NUMBER), name(VARCHAR2), tel(VARCHAR2), sub(NUMBER)
private int sid;
private String name, tel;
private int sub;
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public int getSub() {
return sub;
}
public void setSub(int sub) {
this.sub = sub;
}
}
//Grade.java -> 자료형 클래스. 성적 정보 저장용.
package com.test;
//사용자 정의 자료형 클래스
public class Grade {
//멤버변수, getter, setter
//데이터베이스의 테이블 내에 존재하는 모든 컬럼명 기준
//동일 자료, 동일 변수(식별자)에 저장
//->sid(NUMBER)
//, name(VARCHAR2)
//, sub1(NUMBER+NULL), sub2(NUMBER+NULL), sub3(NUMBER+NULL)
//, tot(NUMBER+NULL), ave(NUMBER+NULL)
//, ch(NUMBER)
private int sid;
private String name, sub1, sub2, sub3, tot, ave;
private int ch;
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSub1() {
return sub1;
}
public void setSub1(String sub1) {
this.sub1 = sub1;
}
public String getSub2() {
return sub2;
}
public void setSub2(String sub2) {
this.sub2 = sub2;
}
public String getSub3() {
return sub3;
}
public void setSub3(String sub3) {
this.sub3 = sub3;
}
public String getTot() {
return tot;
}
public void setTot(String tot) {
this.tot = tot;
}
public String getAve() {
return ave;
}
public void setAve(String ave) {
this.ave = ave;
}
public int getCh() {
return ch;
}
public void setCh(int ch) {
this.ch = ch;
}
}
//StudentDAO.java -> 데이터베이스 액션 처리 클래스
package com.test;
import java.sql.*;
import java.util.*;
import javax.sql.DataSource;
//데이터베이스 액션 처리 클래스(학생 정보)
public class StudentDAO {
//의존객체 주입(DI) 준비
private DataSource dataSource;
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
//학생 전체 명단 출력 메소드
public ArrayList<Student> list() {
ArrayList<Student> result = new ArrayList<Student>();
//1. 데이터베이스 연결 과정
//2. 처리 단계 -> 데이터베이스 액션(출력) -> 결과 처리
//3. 데이터베이스 연결 종료 과정
Connection conn = null;
PreparedStatement pstmt = null;
try {
//Connection 객체 얻는 방법
conn = dataSource.getConnection();
String sql = "SELECT sid, name, tel, sub FROM studentView ORDER BY sid";
pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
//문제)
//next() 메소드는 row 단위 접근 (반복 처리)
//getInt() 메소드는 column 단위 접근
//데이터베이스 자료 -> Student 객체에 저장
//Student 객체 -> 컬렉션에 저장
while(rs.next()) {
Student student = new Student();
student.setSid(rs.getInt("sid"));
student.setName(rs.getString("name"));
student.setTel(rs.getString("tel"));
student.setSub(rs.getInt("sub"));
result.add(student);
}
rs.close();
}catch(Exception e){
e.printStackTrace();
}finally{
try {
if (pstmt != null) {
pstmt.close();
}
conn.close();
}catch(Exception e){
e.printStackTrace();
}
}
return result;
}
//학생 인원수 출력 메소드
public int count() {
int result = 0;
//1. 데이터베이스 연결 과정
//2. 처리 단계 -> 데이터베이스 액션(출력) -> 결과 처리
//3. 데이터베이스 연결 종료 과정
Connection conn = null;
PreparedStatement pstmt = null;
try {
//Connection 객체 얻는 방법
conn = dataSource.getConnection();
String sql = "SELECT COUNT(*) AS count FROM student";
pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
while(rs.next()) {
result = rs.getInt("count");
}
rs.close();
}catch(Exception e){
e.printStackTrace();
}finally{
try {
if (pstmt != null) {
pstmt.close();
}
conn.close();
}catch(Exception e){
e.printStackTrace();
}
}
return result;
}
//문제) 학생 입력 메소드
public int add(Student student) {
int result = 0;
return result;
}
}
//GradeDAO.java -> 데이터베이스 액션 처리 클래스
package com.test;
import java.sql.*;
import java.util.ArrayList;
import javax.sql.DataSource;
//데이터베이스 액션 처리 클래스(성적 정보)
public class GradeDAO {
//의존객체 주입(DI) 준비
private DataSource dataSource;
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
//성적 전체 출력 메소드
public ArrayList<Grade> list() {
ArrayList<Grade> result = new ArrayList<Grade>();
//1. 데이터베이스 연결 과정
//2. 처리 단계 -> 데이터베이스 액션(출력) -> 결과 처리
//3. 데이터베이스 연결 종료 과정
Connection conn = null;
PreparedStatement pstmt = null;
try {
//Connection 객체 얻는 방법
conn = dataSource.getConnection();
String sql = "SELECT sid, name, sub1, sub2, sub3, tot, ave, ch FROM gradeView ORDER BY sid";
pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
//문제)
//next() 메소드는 row 단위 접근 (반복 처리)
//getInt() 메소드는 column 단위 접근
//데이터베이스 자료 -> Grade 객체에 저장
//Grade 객체 -> 컬렉션에 저장
while(rs.next()) {
Grade grade = new Grade();
grade.setSid(rs.getInt("sid"));
grade.setName(rs.getString("name"));
grade.setSub1(rs.getString("sub1"));
grade.setSub2(rs.getString("sub2"));
grade.setSub3(rs.getString("sub3"));
grade.setTot(rs.getString("tot"));
grade.setAve(rs.getString("ave"));
grade.setCh(rs.getInt("ch"));
result.add(grade);
}
rs.close();
}catch(Exception e){
e.printStackTrace();
}finally{
try {
if (pstmt != null) {
pstmt.close();
}
conn.close();
}catch(Exception e){
e.printStackTrace();
}
}
return result;
}
//학생 인원수 출력 메소드
public int count() {
int result = 0;
//1. 데이터베이스 연결 과정
//2. 처리 단계 -> 데이터베이스 액션(출력) -> 결과 처리
//3. 데이터베이스 연결 종료 과정
Connection conn = null;
PreparedStatement pstmt = null;
try {
//Connection 객체 얻는 방법
conn = dataSource.getConnection();
String sql = "SELECT COUNT(*) AS count FROM student";
pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
while(rs.next()) {
result = rs.getInt("count");
}
rs.close();
}catch(Exception e){
e.printStackTrace();
}finally{
try {
if (pstmt != null) {
pstmt.close();
}
conn.close();
}catch(Exception e){
e.printStackTrace();
}
}
return result;
}
//학생 검색 메소드 (성적 입력 전에 학생 정보 검색시 사용)
//검색 결과 있으면 Student 객체 반환
//검색 결과 없으면 null 반환
public Student searchSid(int sid) {
Student result = null;
//1. 데이터베이스 연결 과정
//2. 처리 단계 -> 데이터베이스 액션(출력) -> 결과 처리
//3. 데이터베이스 연결 종료 과정
Connection conn = null;
PreparedStatement pstmt = null;
try {
//Connection 객체 얻는 방법
conn = dataSource.getConnection();
String sql = "SELECT sid, name, tel, sub FROM studentView WHERE sid=?";
pstmt = conn.prepareStatement(sql);
//검색 진행을 위한 sid 값을 쿼리 문자열에 바인딩한다.
pstmt.setInt(1, sid);
ResultSet rs = pstmt.executeQuery();
//검색 결과가 없다면
//while() { } 블럭을 실행하지 않는다.
//결과적으로 result 변수에는 null 값이 유지된다.
while(rs.next()) {
//검색 결과가 있다면
//Student 객체를 생성하고,
//result 변수에 Student 객체를 저장한다.
//데이터베이스 자료를 Student 객체에 저장한다.
result = new Student();
result.setSid(rs.getInt("sid"));
result.setName(rs.getString("name"));
result.setTel(rs.getString("tel"));
result.setSub(rs.getInt("sub"));
}
rs.close();
}catch(Exception e){
e.printStackTrace();
}finally{
try {
if (pstmt != null) {
pstmt.close();
}
conn.close();
}catch(Exception e){
e.printStackTrace();
}
}
return result;
}
//문제) 성적 입력 메소드
public int add(Grade grade) {
int result = 0;
return result;
}
}
//MenuAction.java -> 서브 메뉴 액션 클래스
package com.test;
import java.util.*;
public class MenuAction {
//의존객체 주입(DI) 준비
private StudentDAO sdao;
private GradeDAO gdao;
public void setStudentDAO(StudentDAO sdao) {
this.sdao = sdao;
}
public void setGradeDAO(GradeDAO gdao) {
this.gdao = gdao;
}
//1. 학생 입력
public void menu1(Scanner sc) {
System.out.println();
System.out.println("--- 학생 입력 ---");
do {
System.out.println("이름 전화번호(x 종료)?");
String name = sc.next();
if (name.equalsIgnoreCase("x")) {
break;
}
String tel = sc.next();
//학생 정보 입력 액션 처리
//-> StudentDAO 객체의 add() 메소드 호출
Student student = new Student();
student.setName(name);
student.setTel(tel);
int result = sdao.add(student);
System.out.printf("%d명의 학생을 추가했습니다 %n", result);
}while(true);
}
//2. 성적 입력 (학생 검색)
public void menu2(Scanner sc) {
}
//3. 학생 출력
public void menu3() {
System.out.println();
System.out.println("--- 학생 출력 ---");
System.out.printf("전체 학생 수 : %d명%n", sdao.count());
System.out.println("---------------------------------------");
System.out.println("번호, 학생 이름, 전화번호, 성적 입력 여부");
System.out.println("---------------------------------------");
for (Student student : sdao.list()) {
System.out.printf("%d %s %s %s %n"
, student.getSid()
, student.getName()
, student.getTel()
, (student.getSub()==0)?"X":"O");
}
System.out.println("---------------------------------------");
}
//4. 성적 출력
public void menu4() {
}
private static String studentGrade(int grade) {
String result = "";
switch (grade) {
case 0: result = "합격"; break;
case 1: result = "과락"; break;
case 2: result = "불합격"; break;
}
return result;
}
}
//Main.java -> main() 메소드. 메인 메뉴 클래스
package com.test;
import java.util.*;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
ApplicationContext context
= new ClassPathXmlApplicationContext("applicationContext.xml");
MenuAction menu
= context.getBean("menuAction", MenuAction.class);
do {
System.out.println();
System.out.println("--- 성적 관리(데이터베이스 사용) ---");
System.out.println("1. 학생 입력");
System.out.println("2. 성적 입력 (학생 검색)");
System.out.println("3. 학생 출력");
System.out.println("4. 성적 출력");
System.out.print("선택(1~4, x 종료)?");
String m = sc.next();
if (m.equalsIgnoreCase("x")) {
break;
}
try {
switch (m) {
case "1": menu.menu1(sc); break;
case "2": menu.menu2(sc); break;
case "3": menu.menu3(); break;
case "4": menu.menu4(); break;
}
}catch(Exception e) {
System.out.println(e.getMessage());
}
}while(true);
sc.close();
}
}
//applicationContext.xml -> src 폴더 하위에 생성.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="localDataSource"
class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
<property name="driverClass"
value="oracle.jdbc.driver.OracleDriver" />
<property name="url"
value="jdbc:oracle:thin:@211.63.89.83:1521:xe" />
<property name="username" value="username" />
<property name="password" value="password" />
</bean>
<bean id="remoteDataSource"
class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
<property name="driverClass"
value="oracle.jdbc.driver.OracleDriver" />
<property name="url"
value="jdbc:oracle:thin:@211.63.89.72:1521:xe" />
<property name="username" value="username" />
<property name="password" value="password" />
</bean>
<bean id="gradeDAO" class="com.test.GradeDAO">
<property name="dataSource">
<ref bean="remoteDataSource" />
</property>
</bean>
<bean id="studentDAO" class="com.test.StudentDAO">
<property name="dataSource">
<ref bean="remoteDataSource" />
</property>
</bean>
<bean id="menuAction" class="com.test.MenuAction">
<property name="studentDAO">
<ref bean="studentDAO" />
</property>
<property name="gradeDAO">
<ref bean="gradeDAO" />
</property>
</bean>
</beans>
----------------------------------------------------