연락처 프로그램 완성
ContactMain06.java
package edu.java.contact06;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JLabel;
import java.awt.Font;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
import javax.swing.JButton;
import javax.swing.JTextArea;
import javax.swing.JScrollPane;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.awt.event.ActionEvent;
import javax.swing.JTable;
import javax.swing.JList;
import javax.swing.JTextPane;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
public class ContactMain06 {
private JFrame frame;
private static JTextField textName;
private static JTextField textPhone;
private static JTextField textEmail;
private static JTextField txtIndex;
private static ContactDAOImple dao; // ContactDAOImple 인스턴스를 저장할 변수
private static JLabel lblName;
private static JLabel lblPhone;
private static JLabel lblEmail;
private static JTextArea txtAreaInfo;
private static JTextArea txtAreaLog;
private static String[] header = { "NO", "이름", "전화번호", "이메일" };
private static Object[] records = new Object[header.length];
private static DefaultTableModel model; // 테이블 형태를 만들 변수
private static JTable table;
/**
* Launch the application.
*/
public static void main(String[] args) {
try {
dao = ContactDAOImple.getInstance();
} catch (Exception e) {
} // 다형성. 싱글톤 인스턴스 생성
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
ContactMain06 window = new ContactMain06();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
} // end main()
/**
* Create the application.
*/
public ContactMain06() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 680, 703);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);
JLabel lblNewLabel = new JLabel("연락처 프로그램 Version 0.6");
lblNewLabel.setFont(new Font("굴림", Font.PLAIN, 34));
lblNewLabel.setBounds(12, 10, 461, 72);
frame.getContentPane().add(lblNewLabel);
lblName = new JLabel("이름");
lblName.setFont(new Font("굴림", Font.PLAIN, 34));
lblName.setBounds(12, 72, 139, 72);
frame.getContentPane().add(lblName);
lblPhone = new JLabel("전화번호");
lblPhone.setFont(new Font("굴림", Font.PLAIN, 34));
lblPhone.setBounds(12, 149, 139, 72);
frame.getContentPane().add(lblPhone);
lblEmail = new JLabel("이메일");
lblEmail.setFont(new Font("굴림", Font.PLAIN, 34));
lblEmail.setBounds(12, 227, 139, 72);
frame.getContentPane().add(lblEmail);
textName = new JTextField();
textName.setBounds(163, 89, 283, 52);
frame.getContentPane().add(textName);
textName.setColumns(10);
textPhone = new JTextField();
textPhone.setColumns(10);
textPhone.setBounds(163, 156, 283, 52);
frame.getContentPane().add(textPhone);
textEmail = new JTextField();
textEmail.setColumns(10);
textEmail.setBounds(163, 228, 283, 52);
frame.getContentPane().add(textEmail);
JButton btnInsert = new JButton("등록");
btnInsert.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
InsertMember();
}
});
btnInsert.setFont(new Font("굴림", Font.BOLD, 24));
btnInsert.setBounds(12, 294, 103, 52);
frame.getContentPane().add(btnInsert);
JButton btnUpdate = new JButton("수정");
btnUpdate.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
updateMember();
VTxtAreaLog();
}
});
btnUpdate.setFont(new Font("굴림", Font.BOLD, 24));
btnUpdate.setBounds(12, 356, 103, 52);
frame.getContentPane().add(btnUpdate);
JButton btnDelete = new JButton("삭제");
btnDelete.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
deleteMamber();
selectAllContactTable();
VTxtAreaLog();
}
});
btnDelete.setFont(new Font("굴림", Font.BOLD, 24));
btnDelete.setBounds(127, 356, 103, 52);
frame.getContentPane().add(btnDelete);
JButton btnAllSearch = new JButton("전체검색");
btnAllSearch.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
VTxtAreaLog();
selectAllContactTable();
selectAll();
}
});
btnAllSearch.setFont(new Font("굴림", Font.BOLD, 24));
btnAllSearch.setBounds(245, 356, 201, 52);
frame.getContentPane().add(btnAllSearch);
JButton btnSearch = new JButton("검색");
btnSearch.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
selectByIndax();
selectContactTable();
VTxtAreaLog();
}
});
btnSearch.setFont(new Font("굴림", Font.BOLD, 24));
btnSearch.setBounds(245, 290, 103, 52);
frame.getContentPane().add(btnSearch);
txtIndex = new JTextField();
txtIndex.setText("번호입력");
txtIndex.addFocusListener(new FocusAdapter() {
@Override
public void focusGained(FocusEvent e) {
txtIndex.setText("");
}
});
txtIndex.setToolTipText("");
txtIndex.setBounds(127, 294, 103, 52);
frame.getContentPane().add(txtIndex);
txtIndex.setColumns(10);
JScrollPane scrollPane = new JScrollPane();
scrollPane.setBounds(12, 418, 434, 99);
frame.getContentPane().add(scrollPane);
txtAreaInfo = new JTextArea();
scrollPane.setViewportView(txtAreaInfo);
JScrollPane scrollPane_1 = new JScrollPane();
scrollPane_1.setBounds(12, 527, 434, 104);
frame.getContentPane().add(scrollPane_1);
txtAreaLog = new JTextArea();
scrollPane_1.setViewportView(txtAreaLog);
JScrollPane scrollPane_2 = new JScrollPane();
scrollPane_2.setBounds(458, 372, 194, 259);
frame.getContentPane().add(scrollPane_2);
// 테이블 초기화
model = new DefaultTableModel(header, 0) {
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
};
table = new JTable(model);
table.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
int row = table.getSelectedRow();
int col = table.getSelectedColumn();
Object value = table.getValueAt(row, col);
System.out.println(value);
}
});
table.setFont(new Font("굴림", Font.PLAIN, 15));
scrollPane_2.setViewportView(table);
} // end initialize();
private static void deleteMamber() {
try {
System.out.println("검색할 인덱스 입력>");
String indexst = txtIndex.getText();
// 문자열을 숫자로 변환
int index = Integer.parseInt(indexst);
int count = ((ContactDAOImple) dao).getSize();
if (index >= 0 && index < count) {
int result = dao.delete(index);
if (result == 1) {
txtAreaLog.setText("연락처 정보 삭제 완료");
selectAllContactTable();
}
} else {
txtAreaLog.setText("0부터 " + (count - 1) + "까지만 입력하세요.");
}
} catch (NumberFormatException | IndexOutOfBoundsException e) {
txtAreaLog.setText("0 이상의 정수를 입력하세요.");
}
} // end deleteMamber()
private static void updateMember() {
try {
System.out.println("인덱스 입력>");
String indexst = txtIndex.getText();
// 문자열을 숫자로 변환
int index = Integer.parseInt(indexst);
int count = ((ContactDAOImple) dao).getSize();
if (index >= 0 && index < count) {
System.out.println("전화번호 입력>");
String phone = textPhone.getText();
System.out.println("이메일 입력>");
String email = textEmail.getText();
if (phone.equals("") || email.equals("")) {
txtAreaLog.setText("이름, 전화번호, 이메일을 입력해 주세요." + "\n");
return; // InsertMember() 종료
}
ContactDTO dto = new ContactDTO(index, "", phone, email);
int result = dao.update(index, dto);
if (result == 1) {
txtAreaLog.setText("연락처 정보 수정 완료");
clearTextFields();
selectAllContactTable();
} else {
txtAreaLog.setText("수정에 실패했습니다." + "\n");
txtAreaLog.setText("0부터 " + (count - 1) + "까지만 입력하세요.");
}
}
} catch (NumberFormatException | IndexOutOfBoundsException e) {
txtAreaLog.setText("0 이상의 정수를 입력하세요.");
}
} // end updateMember()
private static void selectByIndax() {
try {
System.out.println("검색할 인덱스 입력>");
String indexst = txtIndex.getText();
System.out.println(indexst);
// 문자열을 숫자로 변환
int index = Integer.parseInt(indexst);
int count = dao.select().size();
System.out.println(count);
if (index >= 0 && index < count) {
ContactDTO dto = dao.select(index);
String result = "--- 연락처 " + index + " ---" + "\n" + dto + "\n";
txtAreaInfo.append(result);
} else {
txtAreaLog.setText("0부터 " + (count) + "까지만 입력하세요.");
}
} catch (NumberFormatException | IndexOutOfBoundsException e) {
txtAreaLog.setText("0 이상의 정수를 입력하세요.");
}
} // end selectByIndax()
private static void selectAll() {
// try {
// ArrayList<ContactDTO> list = dao.select();
//
// int count = dao.getCount();
// for (int i = 0; i < count; i++) {
// String result = "--- 연락처 " + i + " ---" + "\n" + list.get(i) + "\n";
// txtAreaInfo.append(result);
// System.out.println("연락처 정보 [" + i + "]");
// System.out.println(list.get(i));
//
// }
int size = ((ContactDAOImple) dao).getSize();
ArrayList<ContactDTO> list = dao.select();
StringBuffer buffer = new StringBuffer();
long startTime = System.currentTimeMillis();
for (int i = 0; i < size; i++) {
buffer.append("연락처[" + i + "] \n" + list.get(i) + "\n");
}
txtAreaInfo.setText(buffer.toString());
long endTime = System.currentTimeMillis();
System.out.println("걸린 시간 : " + (endTime - startTime));
// } catch (Exception e) {
// e.printStackTrace();
// }
} // end selectAll()
private static void InsertMember() {
System.out.println("--- 연락처 정보 등록 ---");
System.out.println("이름 입력>");
String name = textName.getText();
System.out.println("전화번호 입력>");
String phone = textPhone.getText();
System.out.println("이메일 입력>");
String email = textEmail.getText();
System.out.println("등록");
if (name.equals("") || phone.equals("") || email.equals("")) {
txtAreaLog.setText("저장할 연락처 정보를 입력하세요.");
return; // InsertMember() 종료
}
ContactDTO dto = new ContactDTO(0, name, phone, email);
int check = dao.insert(dto);
if (check == 1) {
txtAreaLog.setText("연락처를 등록했습니다." + "\n");
clearTextFields();
} else {
txtAreaLog.setText("등록에 실패했습니다." + "\n");
}
int count = dao.getSize();
String result = "등록된 연락처 개수 : " + count + "\n" + "연락처 등록 완료" + "\n";
txtAreaLog.append(result);
} // end InsertMember()
private static void clearTextFields() {
textName.setText("");
textPhone.setText("");
textEmail.setText("");
}
private static void VTxtAreaLog() {
int count = dao.getSize();
String result = "등록된 연락처 개수 : " + count + "\n";
txtAreaLog.append(result);
} // end VTxtAreaLog()
private static void selectAllContactTable() {
ArrayList<ContactDTO> list = dao.select();
System.out.println(list);
model.setRowCount(0);
System.out.println(list.size());
for (int i = 0; i < list.size(); i++) {
records[0] = i + 1;
records[1] = list.get(i).getName();
records[2] = list.get(i).getPhone();
records[3] = list.get(i).getEmail();
model.addRow(records);
}
} // end selectAllContactTable()
private void selectContactTable() {
model.setRowCount(0);
try {
System.out.println("검색할 인덱스 입력>");
String indexst = txtIndex.getText();
System.out.println(indexst);
// 문자열을 숫자로 변환
int index = Integer.parseInt(indexst);
int count = ((ContactDAOImple) dao).getSize();
System.out.println(count);
if (index >= 0 && index < count) {
ContactDTO dto = dao.select(index);
records[0] = dto.getIndex();
records[1] = dto.getName();
records[2] = dto.getPhone();
records[3] = dto.getEmail();
model.addRow(records);
} else {
txtAreaLog.setText("0부터 " + (count - 1) + "까지만 입력하세요.");
}
} catch (NumberFormatException | IndexOutOfBoundsException e) {
txtAreaLog.setText("0 이상의 정수를 입력하세요.");
}
} // end selectContactTable()
}// end ContactMain05
OracleQuery.java
package edu.java.contact06;
// JDBC에서 DB 접속에 사용될 상수들, SQL 문장들 정의
public interface OracleQuery {
public static final String URL =
"jdbc:oracle:thin:@localhost:1521:xe"; // 접속할 오라클 DB 경로
public static final String USER = "scott";
public static final String PASSWORD = "tiger";
public static final String TABLE_NAME = "EX_CONTACT";
public static final String COL_CONTACT_ID = "CONTACT_ID";
public static final String COL_NAME = "NAME";
public static final String COL_PHONE = "PHONE";
public static final String COL_EMAIL = "EMAIL";
// 데이터 등록
// INSERT INTO EX_CONTACT
// VALUES (CONTACT_SEQ.nextval, ?, ?, ?);
public static final String SQL_INSERT = "INSERT INTO " + TABLE_NAME
+ " VALUES (CONTACT_SEQ.nextval, ?, ?, ?)";
// SELECT * FROM EX_CONTACT WHERE CONTACT_ID = ?;
public static final String SQL_SELECT_BY_CONTACT_ID =
"SELECT * FROM " + TABLE_NAME +
" WHERE " + COL_CONTACT_ID + " = ?";
public static final String SQL_SELECT_ALL =
"SELECT * FROM " + TABLE_NAME + " ORDER BY " + COL_CONTACT_ID;
// 데이터 수정
// UPDATE EX_CONTACT
// SET NAME = ?, PHONE = ?, EMAIL = ?
// WHERE CONTACT_ID = ?
public static final String SQL_UPDATE =
"UPDATE " + TABLE_NAME + " SET " +
COL_NAME + " = ? , " +
COL_PHONE + " = ? , " +
COL_EMAIL + " = ? " +
"WHERE " + COL_CONTACT_ID + " = ?";
// 데이터 삭제
// DELETE EX_CONTACT WHERE CONTACT_ID = ?
public static final String SQL_DELETE =
"DELETE " + TABLE_NAME + " WHERE " + COL_CONTACT_ID + " = ?";
} // end OracleQuery
ContactDTO.java
package edu.java.contact06;
import java.io.Serializable;
public class ContactDTO implements Serializable{
// 멤버 변수(필드, 프로퍼티)
private int index;
private String name; // 이름
private String phone; // 연락처
private String email; // 이메일
public ContactDTO() {
super();
// TODO Auto-generated constructor stub
}
public ContactDTO(int index, String name, String phone, String email) {
super();
this.index = index;
this.name = name;
this.phone = phone;
this.email = email;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getPhone() {
return phone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
@Override
public String toString() {
return "Contact [NO = " + index + ", name = "+ name +", phone = " + phone + ", email = " + email + "]";
}
}
ContactDAO.java
package edu.java.contact06;
import java.util.ArrayList;
public interface ContactDAO {
// 연락처 정보 등록
public abstract int insert(ContactDTO dto);
// 연락처 정보 전체 검색
public abstract ArrayList<ContactDTO> select();
// 연락처 정보 인덱스 검색
public abstract ContactDTO select(int index);
// 연락처 정보 인덱스 수정
public abstract int update(int index, ContactDTO dto);
// 연락처 삭제 인덱스
public abstract int delete(int index);
} // end ContactDAO
ContactDAOImple.java
package edu.java.contact06;
import java.sql.*;
import java.util.*;
import oracle.jdbc.driver.OracleDriver;
public class ContactDAOImple implements ContactDAO, OracleQuery {
// 1. private static 자기 자신 타입의 변수 선언
private static ContactDAOImple instance = null;
// 2. private 생성자
private ContactDAOImple() {
}
// 3. public static 메소드 - 인스턴스를 리턴하는 메소드 구현
public static ContactDAOImple getInstance() {
if (instance == null) {
instance = new ContactDAOImple();
}
return instance;
}
// 전체 검색 데이터 list에서 size를 리턴
public int getSize() {
return select().size();
}
@Override
public int insert(ContactDTO dto) {
int result = 0;
Connection conn = null;
PreparedStatement pstmt = null;
System.out.println("insert()"); // 로그 찍기
System.out.println("dto = " + dto);
System.out.println("JDBC 5 - 입력받은 데이터를 쿼리에 적용하여 insert");
try {
// 2. JDBC 드라이버를 메모리에 로드
DriverManager.registerDriver(new OracleDriver());
System.out.println("드라이버 로드 성공");
// 4. DB와 Connection(연결)을 맺음
conn = DriverManager.getConnection(URL, USER, PASSWORD);
System.out.println("DB 연결 성공");
// 5. Connection 객체를 사용하여 Statement 객체를 생성
pstmt = conn.prepareStatement(SQL_INSERT);
// 6. SQL 문장 완성 = SQL_INSERT 쿼리의 ?를 채워주는 코드
pstmt.setString(1, dto.getName());
pstmt.setString(2, dto.getPhone());
pstmt.setString(3, dto.getEmail());
// SQL 쿼리의 ? 순서와 parameterIndex의 값을 동일하게 지정
// 예시) ?가 첫 번째이면 parameterIndex = 1
// setInt() : DB의 Number 타입
// setString() : DB의 varchar, varchar2 타입
// setFloat() : DB의 Float 타입
// setDate() : DB의 Date 타입
// 7. SQL 문장 실행(DB 서버로 SQL 전송)
result = pstmt.executeUpdate();
// 8. DB 서버가 보낸 경과 확인/처리
System.out.println(result + "행이 삽입되었습니다.");
System.out.println("데이터 저장 완료");
} catch (Exception e) {
e.toString();
} finally {
try {
conn.close();
pstmt.close();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
return result;
} // end insert
@Override
public ArrayList<ContactDTO> select() {
ArrayList<ContactDTO> list = new ArrayList<>();
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null; // select query 결과 저장할 클래스
try {
// 2. JDBC 드라이버를 메모리에 로드
DriverManager.registerDriver(new OracleDriver());
System.out.println("드라이버 로드 성공");
// 4. DB와 Connection(연결)을 맺음
conn = DriverManager.getConnection(URL, USER, PASSWORD);
System.out.println("DB 연결 성공");
pstmt = conn.prepareStatement(SQL_SELECT_ALL);
rs = pstmt.executeQuery();
while (rs.next()) {
int contactId = rs.getInt(1); // COMTACT_ID 컬럼
String name = rs.getString(2); // NAME 컬럼
String phone = rs.getString(3); // PHONE 컬럼
String email = rs.getString(4); // EMAIL 컬럼
ContactDTO dto = new ContactDTO(contactId, name, phone, email);
// System.out.println(vo);
list.add(dto);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
conn.close();
pstmt.close();
rs.close();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
return list;
}
@Override
public ContactDTO select(int contactId) {
ContactDTO dto = new ContactDTO();
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null; // select query 결과 저장할 클래스
try {
// 2. JDBC 드라이버를 메모리에 로드
DriverManager.registerDriver(new OracleDriver());
System.out.println("드라이버 로드 성공");
// 4. DB와 Connection(연결)을 맺음
conn = DriverManager.getConnection(URL, USER, PASSWORD);
System.out.println("DB 연결 성공");
pstmt = conn.prepareStatement(SQL_SELECT_BY_CONTACT_ID);
pstmt.setInt(1, contactId);
rs = pstmt.executeQuery();
if (rs.next()) {
contactId = rs.getInt(1); // CONTACT_ID 컬럼
String name = rs.getString(2); // NAME 컬럼
String phone = rs.getString(3); // PHONE 컬럼
String email = rs.getString(4); // EMAIL 컬럼
dto = new ContactDTO(contactId, name, phone, email);
// System.out.println(vo);
return dto;
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
conn.close();
pstmt.close();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
return dto;
}
@Override
public int update(int contactId, ContactDTO dto) {
Connection conn = null;
PreparedStatement pstmt = null;
try {
// 2. JDBC 드라이버를 메모리에 로드
DriverManager.registerDriver(new OracleDriver());
System.out.println("드라이버 로드 성공");
// 4. DB와 Connection(연결)을 맺음
conn = DriverManager.getConnection(URL, USER, PASSWORD);
System.out.println("DB 연결 성공");
pstmt = conn.prepareStatement(SQL_UPDATE);
// 6. SQL 문장 완성 = SQL_INSERT 쿼리의 ?를 채워주는 코드
pstmt.setString(1, dto.getName());
pstmt.setString(2, dto.getPhone());
pstmt.setString(3, dto.getEmail());
pstmt.setInt(4, contactId);
// 7. SQL 문장 실행(DB 서버로 SQL 전송)
int result = pstmt.executeUpdate();
// 8. DB 서버가 보낸 경과 확인/처리
System.out.println(result + "행이 수정되었습니다.");
} catch (
SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
conn.close();
pstmt.close();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
return 1;
}
@Override
public int delete(int contactId) {
Connection conn = null;
PreparedStatement pstmt = null;
try {
// 2. JDBC 드라이버를 메모리에 로드
DriverManager.registerDriver(new OracleDriver());
System.out.println("드라이버 로드 성공");
// 4. DB와 Connection(연결)을 맺음
conn = DriverManager.getConnection(URL, USER, PASSWORD);
System.out.println("DB 연결 성공");
pstmt = conn.prepareStatement(SQL_DELETE);
pstmt.setInt(1, contactId);
// 7. SQL 문장 실행(DB 서버로 SQL 전송)
int result = pstmt.executeUpdate();
// 8. DB 서버가 보낸 경과 확인/처리
System.out.println(result + "행이 수정되었습니다.");
} catch (SQLException e) {
} finally {
try {
conn.close();
pstmt.close();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
return 1;
}
}