IT/Java

java - JFrame DB 연결 출력

노마드오브 2018. 11. 22. 21:00

CustomerManager.java

package com.example.jdbc;


import java.awt.BorderLayout;

import java.awt.Container;

import java.awt.GridLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.util.HashMap;

import java.util.Map;


import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JOptionPane;

import javax.swing.JPanel;

import javax.swing.JScrollPane;

import javax.swing.JTable;

import javax.swing.JTextField;


/*

addActionListener(ActionListener l) {

    if (사용자가 버튼을 클릭했을때) {

        l.actionPerformed();

    }

}

*/


public class CustomerManager extends JFrame implements ActionListener {

    

    JPanel p1, p2, p3, p4, p5, pWest;

    JTextField tfNo, tfName, tfEmail, tfTel;

    JButton btnSel, btnAdd, btnUpdate, btnDel;

    JTable table;

    Container contentPane;

    

    CustomerDao customerDao;

    

    public CustomerManager() {

        setTitle("고객 관리 프로그램");

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        

        customerDao = new CustomerDao(); // DB객체준비

        

        setLayout(new BorderLayout());

        contentPane = getContentPane();

        

        pWest = new JPanel(new GridLayout(5, 1));

        

        p1 = new JPanel();

        p1.add(new JLabel("번호"));

        p1.add(tfNo = new JTextField(12));

        pWest.add(p1);

        

        p2 = new JPanel();

        p2.add(new JLabel("이름"));

        p2.add(tfName = new JTextField(12));

        pWest.add(p2);

        

        p3 = new JPanel();

        p3.add(new JLabel("이메일"));

        p3.add(tfEmail = new JTextField(12));

        pWest.add(p3);

        

        p4 = new JPanel();

        p4.add(new JLabel("전화번호"));

        p4.add(tfTel = new JTextField(12));

        pWest.add(p4);

        

        contentPane.add(pWest, BorderLayout.WEST);

        

        p5 = new JPanel();

        p5.add(btnSel = new JButton("보기"));

        p5.add(btnAdd = new JButton("추가"));

        p5.add(btnUpdate = new JButton("수정"));

        p5.add(btnDel = new JButton("삭제"));

        

        contentPane.add(p5, BorderLayout.SOUTH);

        

        // 버튼 이벤트 연결

        btnSel.addActionListener(this);

        btnAdd.addActionListener(this);

        btnUpdate.addActionListener(this);

        btnDel.addActionListener(this);

        

        setSize(700, 300);

        setLocationByPlatform(true);

        setVisible(true);

    }

    

    // 고객정보 보기

    private void select() {

        Map<String, Object> map = customerDao.getCustomer();

        

        Object[][] data = (Object[][]) map.get("data");

        String[] colNames = (String[]) map.get("colNames");

        

        // 테이블 생성

        table = new JTable(data, colNames);

        // 테이블을 프레임 컨텐트팬 중앙에 붙이기

        contentPane.add(new JScrollPane(table), BorderLayout.CENTER);

        // 보여주기 설정으로 화면 갱신

        setVisible(true);

    } // select()

    

    private void add() {

        String strNo = tfNo.getText().trim();

        String strName = tfName.getText().trim();

        String strEmail = tfEmail.getText().trim();

        String strTel = tfTel.getText().trim();

        

        if (strNo.length() == 0 || strName.length() == 0) {

            JOptionPane.showMessageDialog(this, "필수사항을 입력하세요", "에러", JOptionPane.ERROR_MESSAGE);

            return;

        }

        

        // 매개변수값을 Map 타입으로 준비

        Map<String, Object> map = new HashMap<>();

        map.put("no", Integer.parseInt(strNo));

        map.put("name", strName);

        map.put("email", strEmail);

        map.put("tel", strTel);

        // 실행

        int count = customerDao.insertCustomer(map);

        // "입력성공" 메시지

        if (count > 0) {

            JOptionPane.showMessageDialog(this, "입력성공", "입력성공", JOptionPane.INFORMATION_MESSAGE);

        }

        // 입력상자 초기화 (비우기)

        tfNo.setText("");

        tfName.setText("");

        tfEmail.setText("");

        tfTel.setText("");

        

        // 반영결과를 테이블로 보여주기

        select();

    } // add()


    public void update() {

        String strNo = tfNo.getText().trim();

        String strName = tfName.getText().trim();

        String strEmail = tfEmail.getText().trim();

        String strTel = tfTel.getText().trim();

        

        if (strNo.length() == 0 || strName.length() == 0) {

            JOptionPane.showMessageDialog(this, "필수사항을 입력하세요", "에러", JOptionPane.ERROR_MESSAGE);

            return;

        }

        

        // 매개변수값을 Map 타입으로 준비

        Map<String, Object> map = new HashMap<>();

        map.put("no", Integer.parseInt(strNo));

        map.put("name", strName);

        map.put("email", strEmail);

        map.put("tel", strTel);

        int count = customerDao.updateCustomer(map);

   

        if (count > 0) {

        JOptionPane.showMessageDialog(this, "수정성공", "수정성공", JOptionPane.INFORMATION_MESSAGE);

        }

   

        tfNo.setText("");

        tfName.setText("");

        tfEmail.setText("");

        tfTel.setText("");

        

    select();

    } // update()

    

    public void del() {

        String strNo = tfNo.getText().trim();

        

        if (strNo.length() == 0) {

            JOptionPane.showMessageDialog(this, "필수사항을 입력하세요", "에러", JOptionPane.ERROR_MESSAGE);

            return;

        }

        

        int no = Integer.parseInt(strNo);

        // DB객체 삭제 메소드 호출

        int count = customerDao.delete(no);

        // "삭제성공" 메시지

        if (count > 0) {

            JOptionPane.showMessageDialog(this, "삭제성공", "삭제성공", JOptionPane.INFORMATION_MESSAGE);

        }

        

        // 입력상자 초기화 (비우기)

        tfNo.setText("");

        tfName.setText("");

        tfEmail.setText("");

        tfTel.setText("");

        

        // 반영결과를 테이블로 보여주기

        select();

    }

    

    @Override

    public void actionPerformed(ActionEvent e) {

        Object obj = e.getSource();

        // instanceof 연산자는 참조변수의 타입이 아닌

        // 참조변수가 잡고있는 실제 객체의 타입을 확인함.

        if (obj instanceof JButton) {

            if (obj == btnSel) {

                select();

            } else if (obj == btnAdd) {

                add();

            } else if (obj == btnUpdate) {

            update();

            } else { // btnDel

            del();

            }

        } else if (obj instanceof JTextField) {

            

        }

    }


    public static void main(String[] args) {

        new CustomerManager();

    }


}






CustomerDao.java
package com.example.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

public class CustomerDao {
    // DB 접속정보
    String driver = "org.h2.Driver";
    // jdbc:h2:~/mydb
    // jdbc:h2:tcp://localhost/~/mydb
    String url = "jdbc:h2:~/mydb";
    String user = "sa";
    String pwd = "";

    private Connection getConnection() {
        Connection con = null;
        try {
            Class.forName(driver);
            con = DriverManager.getConnection(url, user, pwd);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return con;
    } // getConnection()
    
    
    public Map<String, Object> getCustomer() {
        Map<String, Object> map = new HashMap<>();
        String[] colNames; // 열이름 => 1차원 배열
        Object[][] data; // 2차원 배열 데이터
        
        Connection con = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        try {
            con = getConnection();
            String sql = "select * from customer";
            pstmt = con.prepareStatement(sql, 
                    ResultSet.TYPE_SCROLL_INSENSITIVE, 
                    ResultSet.CONCUR_UPDATABLE);
            
            rs = pstmt.executeQuery();
            ResultSetMetaData rsmd = rs.getMetaData();
            // 열의 개수 가져오기
            int colCount = rsmd.getColumnCount();
            System.out.println("열의개수: " + colCount);
            // 행의 개수를 가져오기 위해서 커서를 행마지막으로 옮기기
            rs.last();
            // 행의 개수 가져오기(마지막 행번호가 행의 개수)
            int rowCount = rs.getRow();
            System.out.println("행의개수: " + rowCount);
            
            // 열이름을 저장할 배열객체 생성. 열의크기로 적용.
            colNames = new String[colCount];
            for (int i=0; i<colCount; i++) {
                colNames[i] = rsmd.getColumnName(i+1);
            }
            
            rs.beforeFirst(); // 커서를 원래위치로 설정
            
            // 데이터 => 2차원 배열 저장
            data = new Object[rowCount][colCount];
            for (int r=0; r<rowCount; r++) { // 행
                rs.next();
                for (int c=0; c<colCount; c++) { // 열
                    data[r][c] = rs.getObject(c+1);
                }
            }
            
            map.put("data", data);
            map.put("colNames", colNames);
       
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
closeJDBC(con, pstmt, rs);
}
        
        return map;
    } // getCustomer()
    
    
    public int insertCustomer(Map<String, Object> map) {
        int count = 0;
        Connection con = null;
        PreparedStatement pstmt = null;
        
        try {
            con = getConnection();
            String sql = "insert into customer (no,name,email,tel) values (?,?,?,?)";
            pstmt = con.prepareStatement(sql);
            pstmt.setInt(1, (Integer) map.get("no"));
            pstmt.setString(2, (String) map.get("name"));
            pstmt.setString(3, (String) map.get("email"));
            pstmt.setString(4, (String) map.get("tel"));
            // 실행
            count = pstmt.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
closeJDBC(con, pstmt, null);
}
        
        return count;
    } // insertCustomer
    
    public int updateCustomer(Map<String, Object> map) {
    int count = 0;
    Connection con = null;
    PreparedStatement pstmt = null;
   
    try {
con = getConnection();
String sql = "update customer set name = ?, email = ?, tel = ? where no = ?";
pstmt = con.prepareStatement(sql);
pstmt.setString(1, (String) map.get("name"));
pstmt.setString(2, (String) map.get("email"));
pstmt.setString(3, (String) map.get("tel"));
pstmt.setInt(4, (Integer) map.get("no"));
count = pstmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
closeJDBC(con, pstmt, null);
}
   
    return count;
    }
    
    public int delete(int no) {
    int count = 0;
    Connection con = null;
    PreparedStatement pstmt = null;
   
    try {
con = getConnection();
String sql = "delete from customer where no = ?";
pstmt = con.prepareStatement(sql);
pstmt.setInt(1, no);
count = pstmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
closeJDBC(con, pstmt, null);
}
   
    return count;
    }
    
    private void closeJDBC(Connection con, PreparedStatement pstmt, ResultSet rs) {
   
    if (rs != null) {
    try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
    }
   
    if (pstmt != null) {
    try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
    }
   
    if (con != null) {
    try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
    }
    } // closeJDBC()
    
}