TIL
[JDBC] 이름, 전화번호 입력 받고 출력하는 프로그램 : DAO, DTO 클래스 / Statement 인터페이스 활용
온풀
2022. 4. 3. 22:41
문제
○ 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
DBConn
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() throws ClassNotFoundException, SQLException
{
if (dbConn == null)
{
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);
}
return dbConn;
}
public static Connection getConnection(String url, String user, String pwd) throws ClassNotFoundException, SQLException
{
if (dbConn == null)
{
Class.forName("oracle.jdbc.driver.OracleDriver");
dbConn = DriverManager.getConnection(url, user, pwd);
}
return dbConn;
}
public static void close() throws SQLException
{
if (dbConn != null)
{
if (!dbConn.isClosed())
{
dbConn.close();
}
}
dbConn = null;
}
}
MemberDTO
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;
}
}
MemberDAO
/*==================
MemberDAO.java
==================*/
// 데이터베이스에 액세스 하는 기능
// → DBConn 활용(전담 계층)
// 데이터를 입력하는 기능 → INSERT
// 인원 수 확인하는 기능
// 즉, 대상 테이블(TBL_MEMBER)의 레코드 카운팅 기능 → SELECT
// 전체 리스트를 조회하는 기능
// 즉, 대상 테이블(TBL_MEMBER)의 데이터를 조회하는 기능 → SELECT
package com.test;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import com.util.DBConn;
public class MemberDAO
{
// 주요 속성 구성 → DB 연결 객체
private Connection conn;
// 생성자 정의(사용자 정의 생성자)
public MemberDAO() throws ClassNotFoundException, SQLException
{
conn = DBConn.getConnection();
}
// 메소드 정의 → 데이터를 입력하는 기능 → INSERT
public int add(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());
// Q. MemberDTO 객체 생성한 것도 아닌데 『dto.』 으로 어떻게 갖다 쓰는 거지?
// MemberDTO 타입의 dto 를 매개변수로 받는 메소드.
// 그 dto 객체의 getName() 메소드, getTel() 메소드 --> 모두 String 반환
// 인스턴스 생성 구문이 필요 없나???
// A. (충희오빠 답변-오빠가 확인한 것)
// 같은 프로젝트 내에 있어서 import 없이 처리되는 것
// 작업 객체를 활용하여 쿼리문 실행(전달)
result = stmt.executeUpdate(sql);
// 사용한 리소스 반납
stmt.close();
// 최종 결과값 반환
return result;
}// end add()
// 메소드 정의 → 전체 인원 수 확인하는 기능 → SELECT
public int count() throws SQLException
{
// 결과값으로 반환하게 될 변수 선언 및 초기화
int result = 0;
// 작업 객체 생성
Statement stmt = conn.createStatement();
// 쿼리문 준비
String sql = "SELECT COUNT(*) AS COUNT FROM TBL_MEMBER";
// 생성된 작업 객체를 활용하여 쿼리문 실행
ResultSet rs = stmt.executeQuery(sql);
// ResultSet 처리 → 반복문 구성 → 결과값 수신
if (rs.next())
{
result = rs.getInt(1);
}
// 리소스 반납
rs.close();
stmt.close();
// 최종 결과값 반환
return result;
}// end count()
// 메소드 정의 → 전체 리스트를 조회하는 기능 → select
public ArrayList<MemberDTO> lists() throws SQLException
{
// 결과값으로 변환할 변수 선언 및 초기화
ArrayList<MemberDTO> result = new ArrayList<MemberDTO>();
// 작업 객체 생성
Statement stmt = conn.createStatement();
// 쿼리문 준비
String sql = "SELECT SID, NAME, TEL FROM TBL_MEMBER ORDER BY SID";
// 생성된 작업 객체를 활용하여 쿼리문 실행
// → select → executeQuery() → ResultSet 반환 → 일반적으로 반복 처리
ResultSet rs = stmt.executeQuery(sql);
// 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;
}// end lists()
}// end class MemberDAO
MemberMain
package com.test;
import java.util.Scanner;
import com.util.DBConn;
public class MemeberMain
{
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
try
{
MemberDAO dao = new MemberDAO();
int count = dao.count();
do
{
System.out.printf("이름 전화번호 입력(%d) : ", ++count);
String name = sc.next();
// 반복의 조건을 무너뜨리는 코드 구성
if (name.equals("."))
{
break;
}
String tel = sc.next();
// MemberDTO 객체 생성
MemberDTO dto = new MemberDTO();
// 속성값 구성
dto.setName(name);
dto.setTel(tel);
// 데이터베이스에 데이터 입력하는 메소드 호출 → add()
int result = dao.add(dto);
if (result > 0)
{
System.out.println(">> 회원 정보 입력 완료~!!! ");
}
} while (true);
System.out.println();
System.out.println("-------------------------------");
System.out.printf("전체 회원 수 : %d명\n", dao.count());
System.out.println("-------------------------------");
System.out.println("번호 이름 전화번호");
// 리스트 가져와 출력
for (MemberDTO obj : dao.lists())
{
System.out.printf("%3s %7s %12s\n", obj.getSid(), obj.getName(), obj.getTel());
}
System.out.println("-------------------------------");
} catch (Exception e)
{
System.out.println(e.toString());
}
finally
{
try
{
DBConn.close();
System.out.println("데이터베이스 연결 닫힘~!!!");
System.out.println("프로그램 종료됨~!!!");
} catch (Exception e)
{
System.out.println(e.toString());
}
}
}
}