본문 바로가기

Swing/JTable 07

JTable 07

자바의 JTable과 Oracle 데이터베이스의 EMP 테이블을 연동하는 예


EmpJTableFrame.java

import java.awt.event.MouseAdapter;

import java.awt.event.MouseEvent;

import javax.swing.JScrollPane;

import javax.swing.JTable;


public class EmpJTableFrame extends javax.swing.JFrame 

{

    private JTable table;

    private EmpTableModel model;

    

    public EmpJTableFrame() 

    {

        initComponents();

        

        model = new EmpTableModel();

        table = new JTable(model);

        table.setFillsViewportHeight(true);

        

        EmpTableModelHandler modelHandler = new EmpTableModelHandler(); 

        table.getModel().addTableModelListener(modelHandler);

        

        // 테이블 셀을 클릭하면 호출되는 이벤트 핸들러

        table.addMouseListener(new MouseAdapter() {

            @Override

            public void mouseClicked(MouseEvent e) {

                int column = table.getSelectedColumn();

                int row = table.getSelectedRow();

                String cellData = table.getModel().getValueAt(row, column).toString();

                System.out.printf("%d, %d, %s\n", row, column, cellData);

            }

        });

        

        JScrollPane scrollPane = new JScrollPane(table);

        scrollPane.setBounds(50, 50, 400, 400);

        this.getContentPane().add(scrollPane);

    }


   // 버튼을 누르면 호출되는 핸들러 메소드, 모델객체를 새로 생성하여 table.setModel( model )을 이용하면 스크롤바가 작동함

   private void actionPerformed( ActionEvent evt ) {

        model = new MyTableModel();

        EmpDAO dao = new EmpDAO();

        List<EmpVO> list = dao.getEmpList();

        model.setEmpList(list);

        table.setModel(model);


   }

   public static void main(String args[]) {

java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {

                new EmpJTableFrame().setVisible(true);

            }

        });

    }

}



EmpTableModel.java

import java.util.List;

import javax.swing.table.AbstractTableModel;


 class EmpTableModel extends AbstractTableModel 

 {

     private boolean DEBUG = true;

     private String[] columnNames;

     private Object[][] data;

     

     EmpTableModel()

     {

          columnNames = new String[]{"EMPNO", "ENAME", "HIREDATE", "DEPTNO", "SAL"};

     }


    public int getColumnCount() {

        return columnNames.length;

    }


    public int getRowCount() {

        return data.length;

    }


    public String getColumnName(int col) {

        return columnNames[col];

    }


    // 한개의 셀을 그릴 때마다 호출됨

    public Object getValueAt(int row, int col) {

    //System.out.print("getValueAt("+row+","+col+")");

        return data[row][col];

    }


    /*

     * JTable uses this method to determine the default renderer/

     * editor for each cell.  If we didn't implement this method,

     * then the last column would contain text ("true"/"false"),

     * rather than a check box.

     */

    public Class getColumnClass(int c) {

        return getValueAt(0, c).getClass();

    }


    /*

     * Don't need to implement this method unless your table's

     * editable.

     */

    public boolean isCellEditable(int row, int col) { // 이 메소드가 true 를 리턴한 경우에는 해당 셀을 편집가능하게 설정함

        //Note that the data/cell address is constant,

        //no matter where the cell appears onscreen.

        if (col < 2) {

            return false;

        } else {

            return true;

        }

    }


    /*

     * Don't need to implement this method unless your table's

     * data can change.

     */

    // JTable의 셀을 편집하고 엔터를 치면 호출되는 메소드

    public void setValueAt(Object value, int row, int col) { // TableModelListener.tableChanged()보다 먼저 호출됨

        System.out.println("setValueAt("+value+","+row+", "+col+")"); 

        if (DEBUG) {

            System.out.println("Setting value at " + row + "," + col

                               + " to " + value

                               + " (an instance of "

                               + value.getClass() + ")");

        }


        data[row][col] = value;


        fireTableCellUpdated(row, col); // 모든 리스너에게 셀 데이터 변경 통보


        if (DEBUG) {

            System.out.println("New value of data:");

            printDebugData();

        }

    }


    // 한 사원정보를 JTable 에 출력하려면 이 메소드를 호출하고 table.repaint()를 호출하면 됨

    public void setEmp(EmpVO emp)

    {

        data = new Object[1][];

        data[0] = new Object[5];

        data[0][0] = emp.getEmpno();

        data[0][1] = emp.getEname();

        data[0][2] = emp.getHiredate();

        data[0][3] = emp.getDeptno();

        data[0][4] = emp.getSal();

    }


    // 사원정보 리스트를 JTable 에 출력하려면 이 메소드를 호출하고 table.repaint()를 호출하면 됨

    public void setEmpList(List<EmpVO> list)

    {

        data = new Object[list.size()][];

        for(int i=0;i<data.length;i++) {

            data[i] = new Object[5];

            data[i][0] = list.get(i).getEmpno();

            data[i][1] = list.get(i).getEname();

            data[i][2] = list.get(i).getHiredate();

            data[i][3] = list.get(i).getDeptno();

            data[i][4] = list.get(i).getSal();

        }

    }


    private void printDebugData() {

        int numRows = getRowCount();

        int numCols = getColumnCount();


        for (int i=0; i < numRows; i++) {

            System.out.print("    row " + i + ":");

            for (int j=0; j < numCols; j++) {

                System.out.print("  " + data[i][j]);

            }

            System.out.println();

        }

        System.out.println("--------------------------");

    }

} // End of MyTableModel class



EmpTableModelHandler.java
import javax.swing.event.*;
import javax.swing.table.*;

public class EmpTableModelHandler implements TableModelListener
{
    @Override
    public void tableChanged(TableModelEvent e) 
    {
        int row = e.getFirstRow();
        int column = e.getColumn();
        TableModel model = (TableModel) e.getSource();
        String columnName = model.getColumnName(column);

        Object data = model.getValueAt(row, column);

        System.out.println("Table Changed("+data+")");
    }
    
}


EmpDAO.java
import java.sql.*;
import java.text.SimpleDateFormat;
import java.util.*;

public class EmpDAO 
{
    Connection conn;
    PreparedStatement pstmt;
    ResultSet rs;
    
    private Connection getConn()
    {
        String jdbc_driver = "oracle.jdbc.OracleDriver";
        String db_url = "jdbc:oracle:thin:@localhost:1521:XE";
        try{
          Class.forName(jdbc_driver);
          conn = DriverManager.getConnection(db_url,"scott","tiger");
          return conn;
        }catch(Exception ex){
            ex.printStackTrace();
        }
        return null;
    }

    public boolean saveEmp(EmpVO emp)
    {
        conn = getConn();
        String sql = "insert into emp2 (empno, ename, deptno, sal, hiredate) values(?,?,?,?,?)";

        try{
          pstmt = conn.prepareStatement(sql);
          pstmt.setInt(1, emp.getEmpno());
          pstmt.setString(2,emp.getEname() );
          pstmt.setInt(3, emp.getDeptno());
          pstmt.setInt(4, emp.getSal());

          String sDate = "2001/05/21";
          SimpleDateFormat sdf = new SimpleDateFormat("yyyy/mm/dd");
          java.util.Date uDate = sdf.parse(sDate);
          java.sql.Date sqlDate = new java.sql.Date(uDate.getTime());
          
          pstmt.setDate(5, sqlDate);
          
          int rowCnt = pstmt.executeUpdate();
          return rowCnt>0 ? true : false;
        }
        catch(Exception e) {
          e.printStackTrace();
        }finally{
            closeAll();
        }
        return false;
    }
    
    public List<EmpVO> getEmpList()
    {
        conn = getConn();
        String sql = "select empno, ename, hiredate, deptno, sal from emp2";
        try{
          pstmt = conn.prepareStatement(sql);
          rs = pstmt.executeQuery();
          ArrayList<EmpVO> list = new ArrayList<EmpVO>();
          
          while(rs.next()) {
             EmpVO emp = new EmpVO();
             emp.setEmpno(rs.getInt("EMPNO"));
             emp.setEname(rs.getString("ENAME"));
             emp.setHiredate(rs.getDate("HIREDATE"));
             emp.setDeptno(rs.getInt("DEPTNO"));
             emp.setSal(rs.getInt("SAL"));
             list.add(emp);
          }
          return list;
        }
        catch(Exception e) {
          e.printStackTrace();
        }finally{
            closeAll();
        }
        return null;
    }
    
    public EmpVO getEmpByEmpno(int empno)
    {
        conn = getConn();
        String sql = "select empno, ename, hiredate, deptno, sal from emp2 where empno=?";
        try{
          pstmt = conn.prepareStatement(sql);
          pstmt.setInt(1, empno);
          
          rs = pstmt.executeQuery();

          if(rs.next()) {
             EmpVO emp = new EmpVO();
             emp.setEmpno(rs.getInt("EMPNO"));
             emp.setEname(rs.getString("ENAME"));
             emp.setHiredate(rs.getDate("HIREDATE"));
             emp.setDeptno(rs.getInt("DEPTNO"));
             emp.setSal(rs.getInt("SAL"));
             return emp;
          }
        }
        catch(Exception e) {
          e.printStackTrace();
        }finally{
            closeAll();
        }
        return null;
    }
    
    public EmpVO getEmpByEname(String ename)
    {
        conn = getConn();
        String sql = "select empno, ename, hiredate, deptno, sal from emp2 where ename=?";
        try{
          pstmt = conn.prepareStatement(sql);
          pstmt.setString(1, ename);
          rs = pstmt.executeQuery();
          
          if(rs.next()) {
             EmpVO emp = new EmpVO();
             emp.setEmpno(rs.getInt("EMPNO"));
             emp.setEname(rs.getString("ENAME"));
             emp.setHiredate(rs.getDate("HIREDATE"));
             emp.setDeptno(rs.getInt("DEPTNO"));
             emp.setSal(rs.getInt("SAL"));
             return emp;
          }
        }
        catch(Exception e) {
          e.printStackTrace();
        }finally{
            closeAll();
        }
        return null;
    }
    
    public boolean updateEmp(EmpVO emp)
    {
        conn = getConn();
        String sql = "update emp2 set deptno=?, sal=? where empno=?";
        try{
          pstmt = conn.prepareStatement(sql);
          pstmt.setInt(1, emp.getDeptno());
          pstmt.setInt(2, emp.getSal());
          pstmt.setInt(3, emp.getEmpno());
          int rowCnt = pstmt.executeUpdate();
          return rowCnt>0 ? true : false;
        }
        catch(Exception e) {
          e.printStackTrace();
        }finally{
            closeAll();
        }
        return false;
    }
    
    public boolean deleteEmp(int empno) {
        conn = getConn();
        String sql = "delete from emp2 where empno=?";
        try{
          pstmt = conn.prepareStatement(sql);
          pstmt.setInt(1, empno);
          int rowCnt = pstmt.executeUpdate();
          return rowCnt>0 ? true : false;
        }
        catch(Exception e) {
          e.printStackTrace();
        }finally{
            closeAll();
        }
        return false;
    }
    
    private void closeAll()
    {
        try {
            if(rs!=null) rs.close();
            if(pstmt!=null) pstmt.close();
            if(conn!=null) conn.close();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
        
    }

}


EmpVO.java
import java.sql.Date;

public class EmpVO 
{
    private int empno;
    private String ename;
    private int deptno;
    private int sal;
    private Date hiredate;

    public void setEmpno(int empno) {
        this.empno = empno;
    }

    public void setEname(String ename) {
        this.ename = ename;
    }

    public void setHiredate(Date hiredate) {
        this.hiredate = hiredate;
    }

    public int getEmpno() {
        return empno;
    }

    public String getEname() {
        return ename;
    }

    public Date getHiredate() {
        return hiredate;
    }

    public int getDeptno() {
        return deptno;
    }

    public int getSal() {
        return sal;
    }

    public void setDeptno(int deptno) {
        this.deptno = deptno;
    }

    public void setSal(int sal) {
        this.sal = sal;
    }

}