Notice
Recent Posts
Recent Comments
Link
Everything has an expiration date
★★★ JDBC 20231120 [프로그래밍 소스] - Test007, MemberDTO, MemberMain, MemberDAO 본문
[JDBC]/Program source (JDBC)
★★★ JDBC 20231120 [프로그래밍 소스] - Test007, MemberDTO, MemberMain, MemberDAO
Jelly-fish 2023. 11. 21. 17:02JDBC01 - com.test
Test007.java
/*================================
Test007.java
- DBConn 에 대한 단위 테스트
==================================*/
package com.test;
import java.sql.Connection;
import com.util.DBConn;
public class Test007
{
public static void main(String[] args)
{
try
{
Connection conn = DBConn.getConnection();
if (conn == null)
{
System.out.println("데이터베이스 연결 실패 ㅠ ㅠ");
}
else
{
System.out.println("데이터베이스 연결 성공~!!!");
}
} catch (Exception e)
{
System.out.println(e.toString());
}
finally
{
try
{
DBConn.close();
} catch (Exception e)
{
System.out.println(e.toString());
}
}
}
}
JDBC02 - com.test
MemberDTO.java
/*===========================
MemberDTO.java
============================*/
/*
○ TBL_MEMBER 테이블을 활용하여
이름과 전화번호를 여러 건 입력받고, 전체 출력하는 프로그램을 구현한다.
단, 데이터베이스 연동이 이루어져야 하고
MemberDAO, MemberDTO 클래스를 활용해야 한다.
실행 예)
이름 전화번호 입력(2) : 임하성 010-2222-2222
>> 회원 정보 입력 완료~!!!
이름 전화번호 입력(3) : 김민지 010-3333-3333
>> 회원 정보 입력 완료~!!!
이름 전화번호 입력(4) : .
----------------------------------
전체 회원 수 : 3명
----------------------------------
번호 이름 전화번호
1 이윤수 010-1111-1111
2 임하성 010-2222-2222
3 김민지 010-3333-3333
----------------------------------
*/
package com.test;
public class MemberDTO
{
// 주요 속성 구성
private String sid, name, tel;
// getter / setter 구성
public String getSid()
{
return sid;
}
public void setSid(String 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;
}
@Override
public String toString()
{
return sid + " " + name + " " + tel;
}
}
MemberDAO.java
/*=========================
MemberDAO.java
===========================*/
// 데이터베이스에 엑세스 하는 기능
// → DBConn 활용 (전담 계층)
// 데이터를 입력하는 기능 → insert
// 인원 수 확인하는 기능
// 즉, 대상 테이블(TBL_MEMBER)의 레코드 카운팅 기능 → select
// 전체 리스트를 조회하는 기능
// 즉, 대상 테이블(TBL_MEMBER)의 데이터를 조회하는 기능 → select
/*
○ TBL_MEMBER 테이블을 활용하여
이름과 전화번호를 여러 건 입력받고, 전체 출력하는 프로그램을 구현한다.
단, 데이터베이스 연동이 이루어져야 하고
MemberDAO, MemberDTO 클래스를 활용해야 한다.
실행 예)
이름 전화번호 입력(2) : 임하성 010-2222-2222
>> 회원 정보 입력 완료~!!!
이름 전화번호 입력(3) : 김민지 010-3333-3333
>> 회원 정보 입력 완료~!!!
이름 전화번호 입력(4) : .
----------------------------------
전체 회원 수 : 3명
----------------------------------
번호 이름 전화번호
1 이윤수 010-1111-1111
2 임하성 010-2222-2222
3 김민지 010-3333-3333
----------------------------------
*/
package com.test;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.ListIterator;
import java.util.Scanner;
import com.util.DBConn;
public class MemberDAO
{
// ★[선생님의 엄청난 해설]====================================================================================
// 주요 속성 구성 → DB 연결 객체
private Connection conn;
/*
public Connection getConn()
{
return conn;
}
public void setConn(Connection conn)
{
this.conn = conn;
}
*/
// 생성자 정의(사용자 정의 생성자)
public MemberDAO()
{
conn = DBConn.getConnection();
}
// 메소드 정의 → 데이터를 입력하는 기능
public int add2(MemberDTO dto) throws SQLException
{
// 반환할 결과값을 담아낼 변수(적용된 행의 개수)
int result = 0;
// 작업 객체 생성
Statement stmt = conn.createStatement();
// 쿼리문 준비(insert)
String sql = String.format("INSERT INTO TBL_MEMBER(SID, NAME, TEL)"
+ "VALUES(MEMBERSEQ.NEXTVAL, '%s', '%s')"
, dto.getName(), dto.getTel());
// 작업 객체를 활용하여 쿼리문 실행(전달)
result = stmt.executeUpdate(sql);
// 사용한 리소스 반납
stmt.close();
// 최종 결과값 반환
return result;
}
// 메소드 정의 → 전체 인원 수 확인하는 기능
public int count2() throws SQLException
{
// 결과값으로 반환하게 될 변수 선언 및 초기화(인원 수)
int result = 0;
// 작업 객체 생성
Statement stmt = conn.createStatement();
// 쿼리문 준비(select)
String sql = "SELECT COUNT(*) AS COUNT FROM TBL_MEMBER";
// 생성된 작업 객체를 활용하여 쿼리문 실행
// → select → executeQuary() → ResultSet 반환
// → 일반적으로 반복문 구성을 통한 ResultSet 처리
ResultSet rs = stmt.executeQuery(sql);
// ResultSet 처리 → 반복문 구성 → 결과값 수신
while (rs.next()) // if (rs.next())
{
result = rs.getInt("COUNT"); // rs.getInt(1)
// ※ 컬럼 인덱스는 1 부터...
}
// 최종 결과값 반환
return result;
}
// 메소드 정의 → 전체 리스트 조회하는 기능
// 순서가 의미있는 ArrayList.
public ArrayList<MemberDTO> lists2() throws SQLException
{
// 결과값으로 반환할 변수 선언 및 초기화
ArrayList<MemberDTO> result = new ArrayList<MemberDTO>();
// 작업 객체 생성
Statement stmt = conn.createStatement();
// 쿼리문 준비(select)
String sql = "SELECT SID, NAME, TEL FROM TBL_MEMBER ORDER BY SID";
// 생성된 작업 객체를 활용하여 쿼리문 실행
// → select → executeQuery() → ResultSet 반환
ResultSet rs = stmt.executeQuery(sql);
// check~!!!
// ResultSet 처리
// ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
while(rs.next())
{
MemberDTO dto = new MemberDTO();
dto.setSid(rs.getString("SID"));
dto.setName(rs.getString("NAME"));
dto.setTel(rs.getString("TEL"));
result.add(dto);
}
// ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
// 리소스 반납
rs.close();
stmt.close();
// 최종 결과값 반환
return result;
}
//※ [나의 글러먹은 풀이]=================================================================================
// 메소드 정의 → 데이터를 입력하는 기능
public int add(MemberDTO dto) throws SQLException
{
// 반환할 결과값을 담아낼 변수 (적용된 행의 개수)
int result = 0;
if (conn != null)
{
try
{
// 작업 객체 생성(Statement)
Statement stmt = conn.createStatement();
// 쿼리문 구성(Insert 쿼리문)
String sql = String.format("INSERT INTO TBL_MEMBER(SID, NAME, TEL) VALUES(MEMBERSEQ.NEXTVAL, '%s', '%s')", dto.getName(), dto.getTel());
result = stmt.executeUpdate(sql);
// MemberDTO 값들을 다 넣어준다.
// int result = stmt.executeUpdate(쿼리문)
// (변경된 행의 개수 반환)
} catch (Exception e)
{
System.out.println(e.toString());
}
}
// 최종 결과값 반환
return result;
}
// * 특정한 부서, 성별 등 다른 구성을 해야한다면 매개변수를 받겠지만
// 현재는 테이블 전체의 인원수를 확인하는 것이므로 매개변수 없다!
// ResultSet rs = stmt.executeQuery(조회 쿼리문)
// 반복문 사용 안 해도 된다! 하나의 레코드만 넘어오므로...
// 얻어낸 인원수 값을 단일값으로 반환하기만 하면 된다!
// 결과값으로 반환하게 될 변수 선언 및 초기화 (인원 수)
// 메소드 정의 → 전체 인원 수 확인하는 기능
public int count() throws SQLException
{
int result = 0;
if (conn != null)
{
try
{
// 작업 객체 생성
Statement stmt = conn.createStatement();
// 쿼리문 생성 (조회 select 문)
String sql = "SELECT COUNT(*)"
+ " FROM TBL_MEMBER";
// 쿼리문 입력
ResultSet rs = stmt.executeQuery(sql);
// while 문을 통한 출력
while(rs.next())
{
result = rs.getInt("COUNT(*)");
}
} catch (Exception e)
{
System.out.println(e.toString());
}
}
// 최종 결과값 반환
return result;
}
// 메소드 정의 → 전체 리스트 조회하는 기능
// 순서가 의미있는 ArrayList.
public ArrayList<MemberDTO> lists() throws SQLException
{
ArrayList<MemberDTO> mdtoList = new ArrayList<MemberDTO>();
// ResultSet rs = stmt.executeQuery(쿼리문 - 전체조회)
if (conn != null)
{
// ArrayList<MemberDTO> 생성
try
{
// 작업 객체 생성
Statement stmt = conn.createStatement();
// 전체 결과를 반환해야 한다.
// MemberDTO '들' 이 되어야 한다. 단일값 X
// ArrayList<MemberDTO>
String sql = "SELECT SID, NAME, TEL"
+ " FROM TBL_MEMBER";
ResultSet rs = stmt.executeQuery(sql);
while(rs.next())
{
MemberDTO mdto = new MemberDTO();
String sid = rs.getString("SID");
String name = rs.getString("NAME");
String tel = rs.getString("TEL");
mdto.setSid(sid);
mdto.setName(name);
mdto.setTel(tel);
mdtoList.add(mdto);
//System.out.println(mdto.getSid() + mdto.getName() + mdto.getTel());
}
} catch (Exception e)
{
System.out.println(e.toString());
}
}
// 최종 결과값 반환
return mdtoList;
}
// 메소드 정의 → 데이터베이스 연결 종료
public void close()
{
// ※ 주의!
// conn.close();
// Connection 객체가 갖고 있는 close() 메소드를 부르는 것!
// DBConn.close() 를 하게 되면, 사용자 정의로
// 생성했던 메소드가 호출됩니다!! 이거 주의해야 합니다!!
DBConn.close();
}
}
MemberMain.java
/*==========================
MemberMain.java
============================*/
// 인텔리센스 : 자동 텍스트 완성
// * 『단위 테스트』 : 하나씩 클래스를 제작해 본 후 실험해 본 다음에 메인클래스에 합치는 것.
// 【DTO】 - Data Transfer Object
// → 계층 간 데이터 전송을 위해 도메인 모델 대신 사용되는 객체
// 【DAO】 - Data Access Object
// ★ [선생님의 추가 설명 : 이젠 더 이상 설명 안 할 거예요...] *******************
// ◎『DTO』 : 달걀 10개를 수환이에게 전달하려고 해요...
// 왔다갔다 10번... 오고가고 하면 20번이니까 그렇게 하지 말고...
// 계란 10개를 적재해 둘 수 있는 통에다가 담으면 한꺼번에 전달할 수 있겠다!
// 안에 값이 들어있다 보니까, VTO랑 혼용하기도 함. (크게 구분 X)
//
// ▶ [한꺼번에 담아서 전달할 수 있도록 하는 통]
//
// ◎『DAO』 : 실제 데이터에 엑세스하는 전용 계층.
// 길 건너 스타벅스가 거래처예요.
// 우리 지금 사무실에 22명의 인원이 각자 할 일을 처리하고 있는데
// 길 건너 스타벅스에서 문서를 가져오거나 보내주는건 은하의 업무로 하자고 약속하자는 거예요.
// 업무과정에서 스타벅스에서 뭔가를 가져오거나 보내야되는 상황일 때
// 은하의 업무로 두지 않을 경우, 민지, 동민 사원이 필요할 때마다 왔다갔다 해야 하기 때문에
// 상당히 번거롭겠죠...
// 스타벅스에서 뭔가를 가져오거나 전해줘야 할 경우 은하한테만 말하면 된다!
// 한 명의 업무가 되니까 일괄적으로 업무를 처리할 수 있게된다! (휴무여도 은하만 알면 됨)
// 은하가 곧 DAO 예요~!!!
//
// ▶ [업무를 처리하는 전담 계층(은하)]
// *******************************************************************************
/*
○ TBL_MEMBER 테이블을 활용하여
이름과 전화번호를 여러 건 입력받고, 전체 출력하는 프로그램을 구현한다.
단, 데이터베이스 연동이 이루어져야 하고
MemberDAO, MemberDTO 클래스를 활용해야 한다.
실행 예)
이름 전화번호 입력(2) : 임하성 010-2222-2222
>> 회원 정보 입력 완료~!!!
이름 전화번호 입력(3) : 김민지 010-3333-3333
>> 회원 정보 입력 완료~!!!
이름 전화번호 입력(4) : .
----------------------------------
전체 회원 수 : 3명
----------------------------------
번호 이름 전화번호
1 이윤수 010-1111-1111
2 임하성 010-2222-2222
3 김민지 010-3333-3333
----------------------------------
*/
package com.test;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Scanner;
import com.util.DBConn;
public class MemberMain
{
// public static void main(String[] args) throws SQLException
// {
// MemberDAO md = new MemberDAO();
// MemberDTO mt = new MemberDTO();
// Scanner sc = new Scanner(System.in);
//
// // 인원 수 변수
// int memberCnt = md.count();
//
// // 입력단 숫자 변경 변수
// int cnt = 1;
//
// // 이름, 전화번호 변수
// String name, tel;
//
//
// do {
//
// System.out.printf("이름 전화번호 입력(%d) : ", memberCnt + cnt); name = sc.next();
//
// if (name.equals(".")) { break; }
//
// tel = sc.next();
//
// // 입력한 값 MemberDTO 객체에 저장 mt.setSid(String.valueOf(memberCnt + cnt));
// mt.setName(name); mt.setTel(tel);
//
// // 입력한 값으로 데이터베이스에 저장.
//
// md.add(mt);
//
//
//
// cnt++; } while (true);
//
//
// ArrayList<MemberDTO> mdtoList = md.lists();
//
// System.out.println(mdtoList);
//
//
// }
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
MemberDAO dao;
// DBConn : 왜 필요가 없나? -> 은하(DAO)가 혼자 하면 되니까...
// 멤버 메인에서 필요가 없다.
try
{
dao = new MemberDAO();
int count = dao.count();
do
{
System.out.printf("이름 전화번호 입력(%d) : ", ++count); // 임하성 010-2222-2222
String name = sc.next();
// 반복의 조건을 무너뜨리는 코드 구성
if (name.equals("."))
break;
String tel = sc.next();
// ※ 여기까지의 과정을통해 이름과 전화번호를 사용자로부터 입력받은 이유는
// 입력받은 데이터를 데이터베이스에 입력하기 위함.
// 데이터 입력을 위해서는 dao 의 add() 메소드 호출 필요.
// add() 메소드를 호출하기 위해서는 MemberDTO 를 넘겨주는 과정이 필요.
// MemberDTO 를 넘겨주기 위해서는 객체의 속성값을 구성한느 과정이 필요.
// MemberDTO 객체 생성
MemberDTO dto = new MemberDTO();
// 속성값 구성
dto.setName(name);
dto.setTel(tel);
// 데이터베이스에 데이터 입력하는 메소드 호출 → add()
//dao.add2(dto);
// DAO 의 add 메소드 내부에서 쓰는 DTO 객체의 속성은 Name, Tel만 사용하므로
// SID 는 Set 해 주지 않아도 된다.
int result = dao.add(dto);
if (result > 0)
System.out.println(">> 회원 정보 입력 완료~!!!");
}while(true);
System.out.println("");
System.out.println("---------------------------------------------");
//System.out.println("전체 회원 수 : " + dao.count() + "명");
System.out.printf("전체 회원 수 : %d명\n", dao.count2());
System.out.println("---------------------------------------------");
System.out.println("번호 이름 전화번호");
// 전체 회원 목록 가져와 출력
// dao.lists();
for (MemberDTO obj : dao.lists())
{
System.out.printf("%3s %7s %12s\n", obj.getSid(), obj.getName(), obj.getTel());
}
dao.lists();
System.out.println("---------------------------------------------");
} catch (Exception e)
{
System.out.println(e.toString());
}
finally
{
try
{
DBConn.close();
//dao.close();
System.out.println(">> 데이터베이스 연결 닫힘~!!!");
System.out.println(">> 프로그램 종료됨~!!!");
} catch (Exception e)
{
System.out.println(e.toString());
}
}
}
}
JDBC02 - com.util
DBConn.java (실수로 try~catch로 구성함... 그냥 던졌어야 됐는데...( ̄_ ̄|||))
/*=====================
dbConn.java
- 예외 처리 throws
=======================*/
package com.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DBConn
{
private static Connection dbConn;
public static Connection getConnection()
{
if (dbConn == null)
{
try
{
String url = "jdbc:oracle:thin:@localhost:1521:xe";
String user = "scott";
String pwd = "tiger";
Class.forName("oracle.jdbc.driver.OracleDriver");
dbConn = DriverManager.getConnection(url, user, pwd);
} catch (Exception e)
{
System.out.println(e.toString());
}
}
return dbConn;
}
public static Connection getConnection(String url, String user, String pwd)
{
if (dbConn == null)
{
try
{
Class.forName("oracle.jdbc.driver.OracleDriver");
dbConn = DriverManager.getConnection(url, user, pwd);
} catch (Exception e)
{
System.out.println(e.toString());
}
}
return dbConn;
}
public static void close()
{
if (dbConn != null)
{
try
{
if (!dbConn.isClosed())
{
dbConn.close();
}
} catch (Exception e)
{
System.out.println(e.toString());
}
}
dbConn = null;
}
}