Java(Example)_DEPT2

2024. 12. 12. 18:40·Java/기초 내용 정리

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
'Java/기초 내용 정리' 카테고리의 다른 글
  • Java(Example)_EMP
  • Java(Example)_MEMBER
  • Java(Example)_DEPT
  • Java(JDBC)_00
mw41817
mw41817
일생의 개발 기록 저장소
  • mw41817
    IT 개발 일지
    mw41817
    • Index (487)
      • HTML (36)
        • 기초 내용 정리 (36)
      • CSS (29)
        • 기초 내용 정리 (29)
      • JavaScript (60)
        • 기초 내용 정리 (60)
      • JQuery (38)
        • 기초 내용 정리 (38)
      • Java (232)
        • 기초 내용 정리 (232)
      • JSP (46)
        • 기초 내용 정리 (46)
      • Spring, Boot (31)
        • 기초 내용 정리 (31)
      • DB (5)
        • Oracle SQL (5)
      • Code WorkBook (6)
        • programmers (6)
        • Baekjoon (0)
      • 기타 (1)
        • 유용한 사이트 (3)
  • 전체
    오늘
    어제
  • 글쓰기 관리
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 카테고리
    • 주인장 GitHub
  • 공지사항

  • 인기 글

  • 태그

    html #코딩 #프로그래밍 #기초
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.0
mw41817
Java(Example)_DEPT2
상단으로

티스토리툴바