JDBC 2008. 12. 2. 11:43

JDBC2.0 커서이동



/*
    현재 프로그램은 콘솔창에서 실행되는 프로그램이다.
 *  전체 -> 1  추가 ->2  삭제 ->3  종료->4
 *  위의 메뉴에 따라 키보드로부터 값을 받아서 처리해야 한다.

    rs.last() // 커서를 마지막으로 이동
    rs.getRow(); // 테이블의 행의 갯수를 리턴함

    아래코드는 넷빈으로 작성된 코드인데 ui부분은 swing의jTable을 이용하였다.
    JDBC2.0 을 이용해서 커서를 제어하는 부분만 보면 도움이 될것이다. 

    테스트를 위한 SQL 스크립트파일 및 넷빈에서 돌려볼수있는 JAVA 소스 첨부
 */




import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;

/*
 * JDBC_JTable.java
 */
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;


public class JDBC_JTable extends javax.swing.JFrame {
    private Connection con;
    private Statement stmt;
    private PreparedStatement pstmt;
    private CallableStatement cstmt;
    private ResultSet rs;
    int row_count,col_count;
   
 
    public JDBC_JTable() {
        initComponents();
        setBounds(200,200,500,500);
        connected();
    }
 private void connected(){       
     try {
         Class.forName("oracle.jdbc.driver.OracleDriver");
         con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:sg", "scott", "tiger");
         /*
          * Statement를 아래와 같이 만들어주는 이유는 아래의 Statement를 통하여 얻어지는 결과
          * 객체(ResultSet)의 커서와 형태를 유동적 또는 유연하게 하기 위해 JDBC2.0 기술을 사용한다.
          *  ex> rs.last(); // 커서를 마지막 행으로 이동
          *      rs.beforeFirst(); // 커서를 첫행보다 앞으로 이동
          *      rs.first(); // 커서를 첫행으로 이동
          */
         stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
         pstmt = con.prepareStatement(
                 "insert into phone_values(phone_t_idx.nextvla,?,?,?)");
         cstmt = con.prepareCall("{call del_phone(?)}");
         setTitle("db연결완료");
     } catch (Exception exception) {}
 }
 
    private void closed(){
        try {
            if(rs!=null)
                rs.close();
            if(stmt!=null)
                stmt.close();
            if(pstmt!=null)
                pstmt.close();
            if(cstmt !=null)
                cstmt.close();
            if(con !=null)
                con.close();
        } catch (Exception e) {
        }
    }
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                         
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        table = new javax.swing.JTable();
        jMenuBar1 = new javax.swing.JMenuBar();
        jMenu1 = new javax.swing.JMenu();
        jMenuItem1 = new javax.swing.JMenuItem();
        jMenuItem2 = new javax.swing.JMenuItem();
        jMenuItem3 = new javax.swing.JMenuItem();
        jSeparator1 = new javax.swing.JSeparator();
        jMenuItem4 = new javax.swing.JMenuItem();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        table.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {

            }
        ));
        jScrollPane1.setViewportView(table);

        getContentPane().add(jScrollPane1, java.awt.BorderLayout.CENTER);

        jMenu1.setText("SQL");

        jMenuItem1.setText("전체보기");
        jMenuItem1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem1ActionPerformed(evt);
            }
        });
        jMenu1.add(jMenuItem1);

        jMenuItem2.setText("추가");
        jMenu1.add(jMenuItem2);

        jMenuItem3.setText("삭제");
        jMenu1.add(jMenuItem3);
        jMenu1.add(jSeparator1);

        jMenuItem4.setText("종료");
        jMenu1.add(jMenuItem4);

        jMenuBar1.add(jMenu1);

        setJMenuBar(jMenuBar1);

        pack();
    }// </editor-fold>                       

private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {                                          
        try {
            rs = stmt.executeQuery("select * from phone_t");
            /*결과 객체의 커서를 마지막 행으로 이동*/
            rs.last();
            row_count = rs.getRow();  // 레코드의 수 (1차원 배열의 수);
            rs.beforeFirst(); // 결과 객체의 커서를 원위치
           
            /*컬럼 명들을 가져오기 위한 작업*/
            ResultSetMetaData rsmd = rs.getMetaData();  // 열들의 대한 정보객체
            col_count = rsmd.getColumnCount();
           String[] f = new String[col_count];
            for(int i = 0 ; i<f.length ; i++){
                f[i] = rsmd.getColumnName(i+1);
            }
            /* 윗 부분까지가 컬럼 작업완료*/
           
            /*db의 자원을 Object형 2차원 배열로 재포장 작업*/
            Object[][] data = new Object[row_count][col_count];
            /*
             * 실제 자원은 ResultSet이 가지고 있으므로 그곳에 있는 자원들을
             * data라는 2차원 배열의 각 요소에 넣어주면된다.
             */
            for(int r =0;rs.next();r++){ // 레코드 수만큼
                for(int c = 0;c<col_count;c++){ //컬럼의 수만큼 반복하는 반복문
                    data[r][c] = rs.getString(c+1);
                    System.out.println(data[r][c]);
                }
            }
            table.setModel(new MyModel(data,f));
           
    } catch (Exception exception) {
    }

}                                         

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new JDBC_JTable().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                    
    private javax.swing.JMenu jMenu1;
    private javax.swing.JMenuBar jMenuBar1;
    private javax.swing.JMenuItem jMenuItem1;
    private javax.swing.JMenuItem jMenuItem2;
    private javax.swing.JMenuItem jMenuItem3;
    private javax.swing.JMenuItem jMenuItem4;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JSeparator jSeparator1;
    private javax.swing.JTable table;
    // End of variables declaration                  

}