2024-11-21















package jdbc;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.*;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
public class DEPT extends JFrame {
Connection con = null; // DB와 연결하는 객체
PreparedStatement pstmt = null; // SQL문을 DB에 전송하는 객체
ResultSet rs = null; // SQL문 실행 결과를 가지고 있는 객체
String sql = null; // SQL문을 저장하는 문자열 변수.
JTextField jtf1, jtf2, jtf3;
JTable table;
DefaultTableModel model;
public DEPT() {
setTitle("부서 테이블 GUI");
// 컨테이너 두 개를 만들자.
JPanel container1 = new JPanel(); // 상단 컨테이너
JPanel container2 = new JPanel(); // 하단 컨테이너
// 1. 컴포넌트를 만들어 보자.
// 1-1. 상단 컨테이너에 올려질 컴포넌트를 만들자.
JLabel jl1 = new JLabel("부서번호 : ");
jtf1 = new JTextField(3);
JLabel jl2 = new JLabel("부서명 : ");
jtf2 = new JTextField(10);
JLabel jl3 = new JLabel("근무지 : ");
jtf3 = new JTextField(15);
// 1-2. 중앙에 들어갈 컴포넌트를 만들자.
String[] header = {"부서번호", "부서명", "근무지"};
/*
* - DefaultTableModel : 테이블을 만들고 난 후 데이터를 넣고, 추가
* 수정, 삭제 시에 변경이 가능한 컴포넌트.
*
* - JTable : 일단은 테이블을 만들고 난 후 데이터를 넣으면 한 번 만든 테이블의
* 데이터는 변경이 불가능한 컴포넌트. 즉, 추가, 수정, 삭제가
* 불가능한 컴포넌트. 단순하게 보여주기만 하는 테이블 컴포넌트
*/
model = new DefaultTableModel(header, 0);
table = new JTable(model);
JScrollPane jsp = new JScrollPane(
table,
ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
// 1-3. 하단 컨테이너에 들어갈 컴포넌트를 만들자.
JButton button1 = new JButton("전체목록");
JButton button2 = new JButton("부서추가");
JButton button3 = new JButton("부서수정");
JButton button4 = new JButton("부서삭제");
// 2. 컴포넌트를 컨테이너에 올려주어야 한다.
// 2-1. 상단 컨테이너에 1-1 컴포넌트들을 올려주자.
container1.add(jl1); container1.add(jtf1);
container1.add(jl2); container1.add(jtf2);
container1.add(jl3); container1.add(jtf3);
// 2-2. 하단 컨테이너에 1-3 컴포넌트들을 올려주자.
container2.add(button1); container2.add(button2);
container2.add(button3); container2.add(button4);
// 3. 컨테이너를 프레임에 올려주어야 한다.
add(container1, BorderLayout.NORTH);
add(jsp, BorderLayout.CENTER);
add(container2, BorderLayout.SOUTH);
setBounds(300, 300, 500, 250);
pack();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
// 4. 이벤트 처리
// 전체목록(button1)버튼을 클릭했을 떄 DEPT 테이블의 전체 목록을 JTable 출력
button1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 드라이버 로딩 및 데이터베이스 연결 작업 메서드 호출
connect();
// 전체 테이블 목록의 화면을 지워주는 메서드.
model.setRowCount(0); // 여기서 0번은 부서번호, 부서명, 근무지 타이틀을 말함
// DB에서 전체 내역을 조회하는 메서드 호출
select();
}
});
// 부서 추가(button2)버튼을 클릭했을 때 각각의 텍스트 필드에 입력된 정보를 DB에 추가
// 추가된 전체리스트를 화면(JTable)에 보여주면 됨.
button2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 드라이버 로딩 및 데이터베이스 연결 작업 메서드 호출
connect();
// 데이터베이스에 저장하는 메서드 호출
insert();
// 입력되었던 텍스트필드 영역 초기화.
jtf1.setText(""); jtf2.setText(""); jtf3.setText("");
jtf1.requestFocus();
// 전체 테이블 목록의 화면을 지워주는 메서드.
model.setRowCount(0); // 여기서 0번은 부서번호, 부서명, 근무지 타이틀을 말함
// DB에서 전체 내역을 조회하는 메서드 호출
select();
}
});
// 부서 수정(button3)버튼을 눌렀을 때 각각의 텍스트필드에 입력된 정보를 가지고 DB에서
// 수정 후, 수정된 전체리스트를 화면에(JTable)에 다시 보여주면 됨.
button3.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 드라이버 로딩 및 데이터베이스 연결 작업 메서드 호출
connect();
// 데이터베이스에 수정하는 메서드 호출
update();
// 입력되었던 텍스트필드 영역 초기화.
jtf1.setText(""); jtf2.setText(""); jtf3.setText("");
jtf1.requestFocus();
// 전체 테이블 목록의 화면을 지워주는 메서드.
model.setRowCount(0); // 여기서 0번은 부서번호, 부서명, 근무지 타이틀을 말함
// DB에서 전체 내역을 조회하는 메서드 호출
select();
}
});
// JTable의 특정 행을 클릭 후 부서삭제(button4)버튼을 눌렀을 때
// 클릭된 행을 DB에서 삭제시키면 됨.
// 삭제 후에 DEPT 테이블의 전체 목록을 JTable에 다시 보여줌.
button4.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int result = JOptionPane.showConfirmDialog(
null, "정말로 삭제 하시겠습니까?",
"확인", JOptionPane.YES_NO_OPTION);
System.out.println("result >>> " + result);
System.out.println("close >>> " + JOptionPane.CLOSED_OPTION);
System.out.println("no >>> " + JOptionPane.NO_OPTION);
if (result == JOptionPane.CLOSED_OPTION) {
JOptionPane.showInternalMessageDialog(null, "윈도우 창을 종료하셨습니다.");
} else if (result == JOptionPane.NO_OPTION) {
JOptionPane.showInternalMessageDialog(null, "아니오 버튼을 클릭하셨습니다.");
} else { // 확인 버튼을 클릭한 경우
// 드라이버 로딩 및 데이터베이스 연결 작업 메서드 호출
connect();
// 데이터베이스에 삭제하는 메서드 호출
delete();
// 입력되었던 텍스트필드 영역 초기화.
jtf1.setText(""); jtf2.setText(""); jtf3.setText("");
jtf1.requestFocus();
// 전체 테이블 목록의 화면을 지워주는 메서드.
model.setRowCount(0); // 여기서 0번은 부서번호, 부서명, 근무지 타이틀을 말함
}
}
});
}
public static void main(String[] args) {
new DEPT();
} // main() 메서드 end
// 데이터베이스를 연동하는 메서드
void connect() {
String driver = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@localhost:1521:xe";
String user = "basic";
String password = "1234";
try {
// 1단계 : 오라클 드라이버를 동적으로 메모리로 로딩.
Class.forName(driver);
// 2단계 : 오라클 데이터베이스와 연결 시도.
con = DriverManager.getConnection(url, user, password);
if (con != null) {
System.out.println("오라클 데이터베이스와 연결 성공!!!");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} // connect() 메서드 end
// DEPT 테이블의 전체 목록을 조회하는 메서드.
void select() {
try {
// 1. 데이터베이스에 전송할 SQL문 작성.
sql = "select * from dept order by deptno";
pstmt = con.prepareStatement(sql);
// 2. 데이터베이스에 SQL문 전송 및 실행
rs = pstmt.executeQuery();
// 3. 레코드 수 만큼 반복해서 데이터를 추출.
while (rs.next()) {
int deptno = rs.getInt("deptno");
String dname = rs.getString("dname");
String loc = rs.getString("loc");
Object[] data = {deptno, dname, loc};
// 저장한 한 개의 레코드(data)를 model 에 추가를 해줌.
model.addRow(data);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
// 데이터베이스와 연결되어 있던 자원 종료하기
if (rs != null) rs.close();
if (pstmt != null) pstmt.close();
if (con != null) con.close();
}
catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} // select() 메서드 end
// DEPT 테이블에 부서 정보를 추가하는 메서드
void insert() {
try {
// 1. 데이터베이스에 전송할 SQL문 작성.
sql = "insert into dept values(?, ?, ?)";
pstmt = con.prepareStatement(sql);
pstmt.setInt(1, Integer.parseInt(jtf1.getText()));
pstmt.setString(2, jtf2.getText());
pstmt.setString(3, jtf3.getText());
// 2. 데이터베이스에 SQL문 전송 및 실행
int result = pstmt.executeUpdate();
if (result > 0) {
JOptionPane.showMessageDialog(null, "부서 등록 성공");
} else {
JOptionPane.showMessageDialog(null, "부서 등록 실패");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
// 데이터베이스와 연결되어 있던 자원 종료하기
if (pstmt != null) pstmt.close();
//if (con != null) con.close(); --> 이후 select()메서드 호출을 위해 종료 x
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} // insert() 메서드 end
// DEPT 테이블의 특정 레코드를 수정하는 메서드
void update() {
try {
// 1. 데이터베이스에 전송할 SQL문 작성
sql = "update dept set dname = ?, loc= ? where deptno = ?";
pstmt = con.prepareStatement(sql);
pstmt.setString(1, jtf2.getText());
pstmt.setString(2, jtf3.getText());
pstmt.setInt(3, Integer.parseInt(jtf1.getText()));
// 2. 데이터베이스에 SQL문 전송 및 실행
int result = pstmt.executeUpdate();
if (result > 0) {
JOptionPane.showMessageDialog(null, "부서 정보 수정 완료");
} else {
JOptionPane.showMessageDialog(null, "부서 정보 수정 실패");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
if (pstmt != null) pstmt.close();
//if (con != null) con.close(); --> 이후 select()메서드 호출을 위해 종료 x
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} // update() 메서드 end
// DEPT 테이블에서 특정 행을 삭제시키는 메서드
void delete() {
try {
// 1. 데이터베이스에 전송할 SQL문 작성
sql = "delete from dept where deptno = ?";
pstmt = con.prepareStatement(sql);
// JTable에서 선택된 행(row)의 값을 int 형으로 반환해 주는 메서드 객체
// getSelectedRow() : 테이블에서 선택시 행(row) 한 줄이 선택됨.
int row = table.getSelectedRow();
pstmt.setInt(1, (int)model.getValueAt(row, 0));
// 2. 데이터베이스에 SQL문 전송 및 실행
int result = pstmt.executeUpdate();
if (result > 0) {
JOptionPane.showInternalMessageDialog(null, "부서 삭제 성공");
} else {
JOptionPane.showInternalMessageDialog(null, "부서 삭제 실패");
}
// 테이블(model)에서 바로 한 행 삭제
model.removeRow(row);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
// 데이터베이스에 연결된 자원 종료
if (pstmt != null) pstmt.close();
if (con != null) con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} // delete() 메서드 end
}'Java > 기초 내용 정리' 카테고리의 다른 글
| Java(Example)_EMP (0) | 2024.12.12 |
|---|---|
| Java(Example)_MEMBER (0) | 2024.12.12 |
| Java(Example)_DEPT (0) | 2024.12.12 |
| Java(JDBC)_00 (0) | 2024.12.12 |
| Java(Network)_Exam_01 (0) | 2024.11.12 |