
1. JDBC 개요
○ JDBC : Java DataBase Connectivity
- JAVA와 SQL(DB)을 연동하는 프레임워크
○ 외부 라이브러리(External API) : 정적 로딩
① 모든 프로젝트에서 동작
- Oracle SQL(DB)에서 제공한 API를 복사 : ojdbc6.jar
- C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib
- JAVA 설치 폴더 > JRE > lib > ext : 붙여넣기
- Eclipse 재시작
② 현재 프로젝트에서 동작(권장 사항)
- 프로젝트명 > 마우스 오른쪽 > BuildPath > Configure Build Path
- Libraries Tab > Add External JARs...
○ JDBC 주요한 클래스(인터페이스)
- Connection : JAVA와 DB를 연결해주는 연결 객체
- Statement / PreparedStatement : SQL 문장(Query)을 전송해주는 겍체
- ResultSet : 결과 객체(select 쿼리)
sqlplus > system / 0000 > create user 계정이름 identified by 0000 > grant dba to 계정이름
● MemberDTO.java
package com.hanul.member;
public class MemberDTO {
private int num;
private String name;
private int age;
private String addr;
private String tel;
public MemberDTO() {}
public MemberDTO(int num, String name, int age, String addr, String tel) {
super();
this.num = num;
this.name = name;
this.age = age;
this.addr = addr;
this.tel = tel;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
}
● MemberMain.java
import java.util.Scanner;
import com.hanul.member.MenuInput;
public class MemberMain {
public static void menuPrint() {
System.out.println("====회원관리====");
System.out.println("회원관리 입력 : I");
System.out.println("전체회원 검색 : S");
System.out.println("회원정보 삭제 : D");
System.out.println("회원주소 검색 : A");
System.out.println("회원관리 종료 : E");
System.out.println("=================\n");
}//menuPrint()
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
MenuInput input = new MenuInput(scanner);
while (true) {
menuPrint();
System.out.print("메뉴를 입력하세요 : ");
String menu = scanner.nextLine();
if (menu.equalsIgnoreCase("i")) {
//System.out.println("신규 회원 등록화면");
input.insertInput(); //회원정보를 등록하는 서브화면 호출
continue;
} else if(menu.equalsIgnoreCase("s")) {
input.getAllList(); //전체 회원을 검색하는 서브화면 호출
continue;
} else if(menu.equalsIgnoreCase("d")) {
input.deleteInput(); //회원정보를 삭제하는 서브화면 호출
} else if(menu.equalsIgnoreCase("a")) {
input.addrInput(); //주소를 검색하는 서브화면 호출
} else if (menu.equalsIgnoreCase("e")) {
System.out.print("정말 종료하시겠습니까(y/n)?");
String exit = scanner.nextLine();
if (exit.equalsIgnoreCase("y")) {
System.out.println("회원관리 프로그램을 종료합니다.\n");
System.exit(0);
break;
} else if (exit.equalsIgnoreCase("n")) {
continue;
} else {
System.out.println("메뉴를 잘못 입력하셨습니다.\n");
continue;
}
} else {
System.out.println("메뉴를 잘못 입력하셨습니다.\n");
continue;
}
}//while
scanner.close();
}//main()
}//class


2. 회원정보 등록
● MenuInput.java
package com.hanul.member;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Scanner;
public class MenuInput {
private Scanner scanner;
public MenuInput(Scanner scanner) {
this.scanner = scanner;
}
//insertInput() : 회원정보 등록 서브화면
public void insertInput() {
System.out.println("회원정보 등록 화면 입니다.");
//DAO와 연동하여 DB에 접속한 후 번호의 중복 검사를 수행해야 한다.
System.out.print("번호를 입력하세요 : ");
int num = Integer.parseInt(scanner.nextLine());
MemberDAO dao = new MemberDAO();
ResultSet rs = dao.checkNum(num); //중복 검사를 하기 위해 번호검색
//데이터(하나의 레코드)의 유무를 판별하여 true/false를 반환하는 메소드 : next()
try {
if (rs.next()) { //검색 결과가 있다 → 중복된 번호
System.out.println("입력하신" + num + "번 자료는 이미 존재합니다.");
System.out.println("다른 번호를 입력하시기 바랍니다.");
} else { //검색 결과가 없다 → 사용가능한 번호
System.out.print("이름을 입력하세요 : ");
String name = scanner.nextLine(); //db의 변수 이름과 같아야 함
System.out.print("나이를 입력하세요 : ");
int age = Integer.parseInt(scanner.nextLine());
System.out.print("주소를 입력하세요 : ");
String addr = scanner.nextLine();
System.out.print("전화번호를 입력하세요 : ");
String tel = scanner.nextLine();
// System.out.println("num : " + num);
// System.out.println("name : " + name);
// System.out.println("age : " + age);
// System.out.println("addr : " + addr);
// System.out.println("tel : " + tel);
MemberDTO dto = new MemberDTO(num, name, age, addr, tel);
int succ = dao.insertMember(dto);
if (succ > 0) { //성공
System.out.println(num + "번 회원님의 정보가 등록되었습니다.");
} else {
System.out.println(num + "번 회원님의 정보가 등록되지 않았습니다.");
}
}
} catch (Exception e) {
e.printStackTrace();
}
}//insertInput()
}//class
● MemberDAO.java
package com.hanul.member;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
public class MemberDAO {
private Connection conn; //연결객체
private PreparedStatement ps; //전송객체
private ResultSet rs; //결과 객체
//DB 접속 메소드
public Connection getConn() {
String url = "jdbc:oracle:thin:@127.0.0.1:1521:XE";
// jdbc:oracle:thin: → 프로토콜
// @ → 구분 기호
// 127.0.0.1 → 자기 자신을 의미하는 ip
// 1521 → 포트 번호
// XE → 서비스 이름
String user = "hanul";
String password = "0000";
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
//동적로딩 : JAVA와 DB를 연결해주는 driver 호출
//oracle.jdbc.driver라는 패키지에 OracleDriver라는 클래스 제공
conn = DriverManager.getConnection(url, user, password);
} catch (Exception e) {
e.printStackTrace();
System.out.println("getConn() Exception!");
}
return conn;
}//getConn()
//DB 종료 메소드 : conn, ps, rs → 역순으로 종료해야 함
public void dbClose() {
try {
if (rs != null) rs.close();
if (ps != null) ps.close();
if (conn != null) conn.close();
} catch (Exception e) {
e.printStackTrace();
System.out.println("dbClose() Exception!");
}
}//dbClose()
//번호 중복 검사(번호 검색 메소드)
public ResultSet checkNum(int num) {
conn = getConn(); //DB 접속
//String sql = "select * from tblMember where num = " + num; //쿼리 작성(Statement)
String sql = "select * from tblMember where num = ?"; //쿼리 작성(PreparedStatement)
try {
ps = conn.prepareStatement(sql); //전송객체
ps.setInt(1, num);
//매개변수값을 전달(db는 인덱스가 1부터 시작)
//여기서 1은 첫번째 ?를 의미
rs = ps.executeQuery(); //쿼리가 실행 후 결과가 저장된 객체
} catch (Exception e) {
e.printStackTrace();
System.out.println("checkNum() Exception!");
} finally {
//dbClose();
}
return rs;
}//checkNum()
//회원 등록 메소드
public int insertMember(MemberDTO dto) {
conn = getConn(); //DB 접속
String sql = "insert into tblMember values(?, ?, ?, ?, ?)"; //sql 쿼리 작성
int succ = 0; //성공, 실패 여부를 저장할 변수
try {
ps = conn.prepareStatement(sql); //전송객체
ps.setInt(1, dto.getNum());
ps.setString(2, dto.getName());
ps.setInt(3, dto.getAge());
ps.setString(4, dto.getAddr());
ps.setString(5, dto.getTel());
succ = ps.executeUpdate(); //쿼리 실행(성공 시 1 저장)
} catch (Exception e) {
e.printStackTrace();
System.out.println("insertMember() Exception!");
} finally {
dbClose();
}
return succ;
}//insertMember()
}//class



3. 전체 회원 검색
● MenuInput.java
package com.hanul.member;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Scanner;
public class MenuInput {
private Scanner scanner;
public MenuInput(Scanner scanner) {
this.scanner = scanner;
}
//전체 회원 목록 검색 서브화면
public void getAllList() {
System.out.println("전체 회원 목록 검색 화면입니다.");
MemberDAO dao = new MemberDAO();
ArrayList<MemberDTO> list = dao.searchAllMember();
dao.display(list);
}//getAllList()y
}//class
● MemberDAO.java
package com.hanul.member;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
public class MemberDAO {
private Connection conn; //연결객체
private PreparedStatement ps; //전송객체
private ResultSet rs; //결과 객체
//DB 접속 메소드
public Connection getConn() {
String url = "jdbc:oracle:thin:@127.0.0.1:1521:XE";
// jdbc:oracle:thin: → 프로토콜
// @ → 구분 기호
// 127.0.0.1 → 자기 자신을 의미하는 ip
// 1521 → 포트 번호
// XE → 서비스 이름
String user = "hanul";
String password = "0000";
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
//동적로딩 : JAVA와 DB를 연결해주는 driver 호출
//oracle.jdbc.driver라는 패키지에 OracleDriver라는 클래스 제공
conn = DriverManager.getConnection(url, user, password);
} catch (Exception e) {
e.printStackTrace();
System.out.println("getConn() Exception!");
}
return conn;
}//getConn()
//DB 종료 메소드 : conn, ps, rs → 역순으로 종료해야 함
public void dbClose() {
try {
if (rs != null) rs.close();
if (ps != null) ps.close();
if (conn != null) conn.close();
} catch (Exception e) {
e.printStackTrace();
System.out.println("dbClose() Exception!");
}
}//dbClose()
//전체 회원 검색 메소드
public ArrayList<MemberDTO> searchAllMember() {
conn = getConn();
String sql = "select * from tblMember";
ArrayList<MemberDTO> list = new ArrayList<>();
try {
ps = conn.prepareStatement(sql); //전송객체
rs = ps.executeQuery();
while (rs.next()) { //rs.next()가 false가 될 때까지 반복
//columnLabel vs columnIndex
// → 테이블 구조가 바뀌면 index 구조도 바뀌므로 columnLabel을 사용해야한다.
int num = rs.getInt("num");
String name = rs.getString("name");
int age = rs.getInt("age");
String addr = rs.getString("addr");
String tel = rs.getString("tel");
MemberDTO dto = new MemberDTO(num, name, age, addr, tel);
list.add(dto);
}//while()
} catch (Exception e) {
e.printStackTrace();
System.out.println("searchAllMember() Exception!");
} finally {
dbClose();
}
return list;
}//searchAllMember()
//출력 메소드
public void display(ArrayList<MemberDTO> list) {
if (list.size() == 0) { //검색 결과가 없을 때
System.out.println("검색 결과가 없습니다.");
} else {
for (MemberDTO dto : list) {
System.out.print(dto.getNum() + "\t");
System.out.print(dto.getName() + "\t");
System.out.print(dto.getAge() + "\t");
System.out.print(dto.getAddr() + "\t");
System.out.print(dto.getTel() + "\n");
}//for-each
}//if
}//display()
}//class

4. 회원 정보 삭제
● MenuInput.java
package com.hanul.member;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Scanner;
public class MenuInput {
private Scanner scanner;
public MenuInput(Scanner scanner) {
this.scanner = scanner;
}
//회원 정보 삭제 서브화면
public void deleteInput() {
System.out.println("회원 정보 삭제 화면입니다.");
System.out.print("삭제할 회원번호를 입력하세요 : ");
int num = Integer.parseInt(scanner.nextLine());
MemberDAO dao = new MemberDAO();
ResultSet rs = dao.checkNum(num);
try {
if (!(rs.next())) { //rs.next() == false(검색 결과가 없음 즉, 삭제할 번호가 없음)
System.out.println("입력하신 " + num + "번 자료는 없습니다.");
} else {
System.out.print("정말 삭제하시겠습니까(y/n)? : ");
String isDelete = scanner.nextLine();
if (isDelete.equalsIgnoreCase("y")) {
int succ = dao.deleteMember(num);
if (succ > 0) {
System.out.println(num + "번 회원님의 정보가 삭제되었습니다.");
} else {
System.out.println(num + "번 회원님의 정보가 삭제 실패되었습니다.");
}
} else if(isDelete.equalsIgnoreCase("n")) {
System.out.println("취소되었습니다.");
} else {
System.out.println("잘못 입력하셨습니다.");
}
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("deleteInput() Exception!");
}
}//deleteInput()
}//class
● MemberDAO.java
package com.hanul.member;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
public class MemberDAO {
private Connection conn; //연결객체
private PreparedStatement ps; //전송객체
private ResultSet rs; //결과 객체
//DB 접속 메소드
public Connection getConn() {
String url = "jdbc:oracle:thin:@127.0.0.1:1521:XE";
// jdbc:oracle:thin: → 프로토콜
// @ → 구분 기호
// 127.0.0.1 → 자기 자신을 의미하는 ip
// 1521 → 포트 번호
// XE → 서비스 이름
String user = "hanul";
String password = "0000";
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
//동적로딩 : JAVA와 DB를 연결해주는 driver 호출
//oracle.jdbc.driver라는 패키지에 OracleDriver라는 클래스 제공
conn = DriverManager.getConnection(url, user, password);
} catch (Exception e) {
e.printStackTrace();
System.out.println("getConn() Exception!");
}
return conn;
}//getConn()
//DB 종료 메소드 : conn, ps, rs → 역순으로 종료해야 함
public void dbClose() {
try {
if (rs != null) rs.close();
if (ps != null) ps.close();
if (conn != null) conn.close();
} catch (Exception e) {
e.printStackTrace();
System.out.println("dbClose() Exception!");
}
}//dbClose()
//회원 정보 삭제 메소드
public int deleteMember(int num) {
conn = getConn();
String sql = "delete from tblMember where num = ?";
int succ = 0;
try {
ps = conn.prepareStatement(sql); //전송객체
ps.setInt(1, num);
succ = ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
System.out.println("deleteMember() Exception!");
} finally {
dbClose();
}
return succ;
}//deleteMember()
}//class


5. 회원 주소 검색
● MenuInput.java
package com.hanul.member;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Scanner;
public class MenuInput {
private Scanner scanner;
public MenuInput(Scanner scanner) {
this.scanner = scanner;
}
//주소 검색 서브화면
public void addrInput() {
System.out.println("주소 검색 서브화면입니다.");
System.out.print("검색할 주소를 입력하세요 : ");
String searchAddr = scanner.nextLine();
MemberDAO dao = new MemberDAO();
ArrayList<MemberDTO> list = dao.searchAddr(searchAddr);
dao.display(list);
}//addrInput()
}//class
● MemberDAO.java
package com.hanul.member;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
public class MemberDAO {
private Connection conn; //연결객체
private PreparedStatement ps; //전송객체
private ResultSet rs; //결과 객체
//DB 접속 메소드
public Connection getConn() {
String url = "jdbc:oracle:thin:@127.0.0.1:1521:XE";
// jdbc:oracle:thin: → 프로토콜
// @ → 구분 기호
// 127.0.0.1 → 자기 자신을 의미하는 ip
// 1521 → 포트 번호
// XE → 서비스 이름
String user = "hanul";
String password = "0000";
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
//동적로딩 : JAVA와 DB를 연결해주는 driver 호출
//oracle.jdbc.driver라는 패키지에 OracleDriver라는 클래스 제공
conn = DriverManager.getConnection(url, user, password);
} catch (Exception e) {
e.printStackTrace();
System.out.println("getConn() Exception!");
}
return conn;
}//getConn()
//DB 종료 메소드 : conn, ps, rs → 역순으로 종료해야 함
public void dbClose() {
try {
if (rs != null) rs.close();
if (ps != null) ps.close();
if (conn != null) conn.close();
} catch (Exception e) {
e.printStackTrace();
System.out.println("dbClose() Exception!");
}
}//dbClose()
// 주소 검색 메소드
public ArrayList<MemberDTO> searchAddr(String searchAddr) {
conn = getConn();
String sql = "select * from tblMember where addr like ? order by num asc";
ArrayList<MemberDTO> list = new ArrayList<>();
try {
ps = conn.prepareStatement(sql);
ps.setString(1, "%" + searchAddr + "%");
rs = ps.executeQuery();
//전체 검색
while (rs.next()) { //rs.next()가 false가 될 때까지 반복
//columnLabel vs columnIndex
// → 테이블 구조가 바뀌면 index 구조도 바뀌므로 columnLabel을 사용해야한다.
int num = rs.getInt("num");
String name = rs.getString("name");
int age = rs.getInt("age");
String addr = rs.getString("addr");
String tel = rs.getString("tel");
MemberDTO dto = new MemberDTO(num, name, age, addr, tel);
list.add(dto);
}//while()
} catch (Exception e) {
e.printStackTrace();
System.out.println("searchAddr() Exception!");
} finally {
dbClose();
}
return list;
}//searchAddr()
}//class

6. 전체 코드
● MemberDTO.java
package com.hanul.member;
public class MemberDTO {
private int num;
private String name;
private int age;
private String addr;
private String tel;
public MemberDTO() {}
public MemberDTO(int num, String name, int age, String addr, String tel) {
super();
this.num = num;
this.name = name;
this.age = age;
this.addr = addr;
this.tel = tel;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
}
● MemberMain.java
import java.util.Scanner;
import com.hanul.member.MenuInput;
public class MemberMain {
public static void menuPrint() {
System.out.println("====회원관리====");
System.out.println("회원관리 입력 : I");
System.out.println("전체회원 검색 : S");
System.out.println("회원정보 삭제 : D");
System.out.println("회원주소 검색 : A");
System.out.println("회원관리 종료 : E");
System.out.println("=================\n");
}//menuPrint()
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
MenuInput input = new MenuInput(scanner);
while (true) {
menuPrint();
System.out.print("메뉴를 입력하세요 : ");
String menu = scanner.nextLine();
if (menu.equalsIgnoreCase("i")) {
//System.out.println("신규 회원 등록화면");
input.insertInput(); //회원정보를 등록하는 서브화면 호출
continue;
} else if(menu.equalsIgnoreCase("s")) {
input.getAllList(); //전체 회원을 검색하는 서브화면 호출
continue;
} else if(menu.equalsIgnoreCase("d")) {
input.deleteInput(); //회원정보를 삭제하는 서브화면 호출
} else if(menu.equalsIgnoreCase("a")) {
input.addrInput(); //주소를 검색하는 서브화면 호출
} else if (menu.equalsIgnoreCase("e")) {
System.out.print("정말 종료하시겠습니까(y/n)?");
String exit = scanner.nextLine();
if (exit.equalsIgnoreCase("y")) {
System.out.println("회원관리 프로그램을 종료합니다.\n");
System.exit(0);
break;
} else if (exit.equalsIgnoreCase("n")) {
continue;
} else {
System.out.println("메뉴를 잘못 입력하셨습니다.\n");
continue;
}
} else {
System.out.println("메뉴를 잘못 입력하셨습니다.\n");
continue;
}
}//while
scanner.close();
}//main()
}//class
● MenuInput.java
package com.hanul.member;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Scanner;
public class MenuInput {
private Scanner scanner;
public MenuInput(Scanner scanner) {
this.scanner = scanner;
}
//insertInput() : 회원정보 등록 서브화면
public void insertInput() {
System.out.println("회원정보 등록 화면 입니다.");
//DAO와 연동하여 DB에 접속한 후 번호의 중복 검사를 수행해야 한다.
System.out.print("번호를 입력하세요 : ");
int num = Integer.parseInt(scanner.nextLine());
MemberDAO dao = new MemberDAO();
ResultSet rs = dao.checkNum(num); //중복 검사를 하기 위해 번호검색
//데이터(하나의 레코드)의 유무를 판별하여 true/false를 반환하는 메소드 : next()
try {
if (rs.next()) { //검색 결과가 있다 → 중복된 번호
System.out.println("입력하신" + num + "번 자료는 이미 존재합니다.");
System.out.println("다른 번호를 입력하시기 바랍니다.");
} else { //검색 결과가 없다 → 사용가능한 번호
System.out.print("이름을 입력하세요 : ");
String name = scanner.nextLine(); //db의 변수 이름과 같아야 함
System.out.print("나이를 입력하세요 : ");
int age = Integer.parseInt(scanner.nextLine());
System.out.print("주소를 입력하세요 : ");
String addr = scanner.nextLine();
System.out.print("전화번호를 입력하세요 : ");
String tel = scanner.nextLine();
// System.out.println("num : " + num);
// System.out.println("name : " + name);
// System.out.println("age : " + age);
// System.out.println("addr : " + addr);
// System.out.println("tel : " + tel);
MemberDTO dto = new MemberDTO(num, name, age, addr, tel);
int succ = dao.insertMember(dto);
if (succ > 0) { //성공
System.out.println(num + "번 회원님의 정보가 등록되었습니다.");
} else {
System.out.println(num + "번 회원님의 정보가 등록되지 않았습니다.");
}
}
} catch (Exception e) {
e.printStackTrace();
}
}//insertInput()
//전체 회원 목록 검색 서브화면
public void getAllList() {
System.out.println("전체 회원 목록 검색 화면입니다.");
MemberDAO dao = new MemberDAO();
ArrayList<MemberDTO> list = dao.searchAllMember();
dao.display(list);
}//getAllList()y
//회원 정보 삭제 서브화면
public void deleteInput() {
System.out.println("회원 정보 삭제 화면입니다.");
System.out.print("삭제할 회원번호를 입력하세요 : ");
int num = Integer.parseInt(scanner.nextLine());
MemberDAO dao = new MemberDAO();
ResultSet rs = dao.checkNum(num);
try {
if (!(rs.next())) { //rs.next() == false(검색 결과가 없음 즉, 삭제할 번호가 없음)
System.out.println("입력하신 " + num + "번 자료는 없습니다.");
} else {
System.out.print("정말 삭제하시겠습니까(y/n)? : ");
String isDelete = scanner.nextLine();
if (isDelete.equalsIgnoreCase("y")) {
int succ = dao.deleteMember(num);
if (succ > 0) {
System.out.println(num + "번 회원님의 정보가 삭제되었습니다.");
} else {
System.out.println(num + "번 회원님의 정보가 삭제 실패되었습니다.");
}
} else if(isDelete.equalsIgnoreCase("n")) {
System.out.println("취소되었습니다.");
} else {
System.out.println("잘못 입력하셨습니다.");
}
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("deleteInput() Exception!");
}
}//deleteInput()
//주소 검색 서브화면
public void addrInput() {
System.out.println("주소 검색 서브화면입니다.");
System.out.print("검색할 주소를 입력하세요 : ");
String searchAddr = scanner.nextLine();
MemberDAO dao = new MemberDAO();
ArrayList<MemberDTO> list = dao.searchAddr(searchAddr);
dao.display(list);
}//addrInput()
}//class
● MemberDAO.java
package com.hanul.member;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
public class MemberDAO {
private Connection conn; //연결객체
private PreparedStatement ps; //전송객체
private ResultSet rs; //결과 객체
//DB 접속 메소드
public Connection getConn() {
String url = "jdbc:oracle:thin:@127.0.0.1:1521:XE";
// jdbc:oracle:thin: → 프로토콜
// @ → 구분 기호
// 127.0.0.1 → 자기 자신을 의미하는 ip
// 1521 → 포트 번호
// XE → 서비스 이름
String user = "hanul";
String password = "0000";
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
//동적로딩 : JAVA와 DB를 연결해주는 driver 호출
//oracle.jdbc.driver라는 패키지에 OracleDriver라는 클래스 제공
conn = DriverManager.getConnection(url, user, password);
} catch (Exception e) {
e.printStackTrace();
System.out.println("getConn() Exception!");
}
return conn;
}//getConn()
//DB 종료 메소드 : conn, ps, rs → 역순으로 종료해야 함
public void dbClose() {
try {
if (rs != null) rs.close();
if (ps != null) ps.close();
if (conn != null) conn.close();
} catch (Exception e) {
e.printStackTrace();
System.out.println("dbClose() Exception!");
}
}//dbClose()
//번호 중복 검사(번호 검색 메소드)
public ResultSet checkNum(int num) {
conn = getConn(); //DB 접속
//String sql = "select * from tblMember where num = " + num; //쿼리 작성(Statement)
String sql = "select * from tblMember where num = ?"; //쿼리 작성(PreparedStatement)
try {
ps = conn.prepareStatement(sql); //전송객체
ps.setInt(1, num);
//매개변수값을 전달(db는 인덱스가 1부터 시작)
//여기서 1은 첫번째 ?를 의미
rs = ps.executeQuery(); //쿼리가 실행 후 결과가 저장된 객체
} catch (Exception e) {
e.printStackTrace();
System.out.println("checkNum() Exception!");
} finally {
//dbClose();
}
return rs;
}//checkNum()
//회원 등록 메소드
public int insertMember(MemberDTO dto) {
conn = getConn(); //DB 접속
String sql = "insert into tblMember values(?, ?, ?, ?, ?)"; //sql 쿼리 작성
int succ = 0; //성공, 실패 여부를 저장할 변수
try {
ps = conn.prepareStatement(sql); //전송객체
ps.setInt(1, dto.getNum());
ps.setString(2, dto.getName());
ps.setInt(3, dto.getAge());
ps.setString(4, dto.getAddr());
ps.setString(5, dto.getTel());
succ = ps.executeUpdate(); //쿼리 실행(성공 시 1 저장)
} catch (Exception e) {
e.printStackTrace();
System.out.println("insertMember() Exception!");
} finally {
dbClose();
}
return succ;
}//insertMember()
//전체 회원 검색 메소드
public ArrayList<MemberDTO> searchAllMember() {
conn = getConn();
String sql = "select * from tblMember";
ArrayList<MemberDTO> list = new ArrayList<>();
try {
ps = conn.prepareStatement(sql); //전송객체
rs = ps.executeQuery();
while (rs.next()) { //rs.next()가 false가 될 때까지 반복
//columnLabel vs columnIndex
// → 테이블 구조가 바뀌면 index 구조도 바뀌므로 columnLabel을 사용해야한다.
int num = rs.getInt("num");
String name = rs.getString("name");
int age = rs.getInt("age");
String addr = rs.getString("addr");
String tel = rs.getString("tel");
MemberDTO dto = new MemberDTO(num, name, age, addr, tel);
list.add(dto);
}//while()
} catch (Exception e) {
e.printStackTrace();
System.out.println("searchAllMember() Exception!");
} finally {
dbClose();
}
return list;
}//searchAllMember()
//출력 메소드
public void display(ArrayList<MemberDTO> list) {
if (list.size() == 0) { //검색 결과가 없을 때
System.out.println("검색 결과가 없습니다.");
} else {
for (MemberDTO dto : list) {
System.out.print(dto.getNum() + "\t");
System.out.print(dto.getName() + "\t");
System.out.print(dto.getAge() + "\t");
System.out.print(dto.getAddr() + "\t");
System.out.print(dto.getTel() + "\n");
}//for-each
}//if
}//display()
//회원 정보 삭제 메소드
public int deleteMember(int num) {
conn = getConn();
String sql = "delete from tblMember where num = ?";
int succ = 0;
try {
ps = conn.prepareStatement(sql); //전송객체
ps.setInt(1, num);
succ = ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
System.out.println("deleteMember() Exception!");
} finally {
dbClose();
}
return succ;
}//deleteMember()
// 주소 검색 메소드
public ArrayList<MemberDTO> searchAddr(String searchAddr) {
conn = getConn();
String sql = "select * from tblMember where addr like ? order by num asc";
ArrayList<MemberDTO> list = new ArrayList<>();
try {
ps = conn.prepareStatement(sql);
ps.setString(1, "%" + searchAddr + "%");
rs = ps.executeQuery();
//전체 검색
while (rs.next()) { //rs.next()가 false가 될 때까지 반복
//columnLabel vs columnIndex
// → 테이블 구조가 바뀌면 index 구조도 바뀌므로 columnLabel을 사용해야한다.
int num = rs.getInt("num");
String name = rs.getString("name");
int age = rs.getInt("age");
String addr = rs.getString("addr");
String tel = rs.getString("tel");
MemberDTO dto = new MemberDTO(num, name, age, addr, tel);
list.add(dto);
}//while()
} catch (Exception e) {
e.printStackTrace();
System.out.println("searchAddr() Exception!");
} finally {
dbClose();
}
return list;
}//searchAddr()
}//class