[java] hiển thị CSDL với Jtable thông qua ODBC

chuotfx

Member
4/4/10
365
25
18
hôm nay, mình demo 1 bài nho nhõ về kết nối cơ sỡ dữ liệu với cầu nối ODBC

trước tiên các bạn tạo 1 cơ sở dữ liệu và tạo đối tượng ODBC.( bước này các bạn xem trên web )

bước 2 là tạo kết nối:

PHP:
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con = DriverManager.getConnection("jdbc:odbc:vidu1");
có nhiều cách kết nối khác nhau, cách trên là cách đơn giản nhất, mà thầy cũng yêu cầu mình làm thế này thôi.

chữ vidu1 là tên của đối tượng ODBC mà mình mới tạo ra ở bước trên.

bước 3 là thực hiện các câu lệnh truy vấn trong SQL

việc này được thực hiện thông qua statement

PHP:
Statement stmt = con.createStatement();
tới đây thì chúng ta chia ra làm 2 nhóm chính:

  • nhóm các câu lệnh select thì dùng hàm executeQuery của statement
  • nhóm các câu lệnh update,insert,delete thì gọi chung là Update và thực hiện thông qua hàm executeUpdate
với update thì chúng ta ko quan tâm kiểu trả về, mà quam tâm chính ở đây là nhóm lệnh select vì nó trả về 1 bảng Resultset

đây là code sữ lý 1 bảng đơn giản

PHP:
while(rs.next()){
                System.out.println(rs.getString("ten"));
            }
các bạn nên nhớ là cấu trúc của Resultset là có 2 dòng first và after , 2 dòng này kô có tác dụng trong thi cuối kỳ, nhưng mà dùng nó thì phải next Resultset 1 cái để con trỏ có thể chỉ tới dữ liệu mình lấy đc

Và java còn cung cấp 1 loại nữa là ResultSetMetaData
cái này các bạn tự tìm hiễu nha, dùng nó cũng sướng lắm

======================

Đây là code đơn giả của 1 bài kết nối CSDL bằng ODBC

PHP:
import java.sql.*;

public class Demo1 {
    public static void main(String &#&#[&#&#] agrs){
        try {
            
            
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            Connection con = DriverManager.getConnection("jdbc:odbc:vidu1");
            Statement stmt = con.createStatement();
            
            ResultSet rs = stmt.executeQuery("select * from hello");
            
            while(rs.next()){
                System.out.println(rs.getString("ten"));
            }
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
================================
còn đây là code 1 bài mình demo, có giao diện

PHP:
package CSDL;

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Vector;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;

public class DemoSQL extends JFrame implements ActionListener {
    
    private JTextField nameData,select;
    private JButton ok,clear,query;
    private JPanel display,control;
    private Connection con ;
    
    public DemoSQL(){
        super("DemoSQL");
        setSize(600, 600);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
        
        setLayout(new BorderLayout());
        addZoom();
        control.setVisible(false);
        display.setVisible(false);
    }
    
    private void addZoom() {
        
        // phan tên CSDL
        JPanel p1 = new JPanel();
        p1.setLayout(new FlowLayout(FlowLayout.CENTER));
        p1.add(new JLabel("Data name "));
        nameData = new JTextField(10);
        p1.add(nameData);
        ok = new JButton("OK");
        ok.addActionListener(this);
        p1.add(ok);
        add(p1,BorderLayout.NORTH);
        
        // phan hien thi
        display = new JPanel();
        display.setBorder(BorderFactory.createTitledBorder(" Result :"));
        add(display,BorderLayout.CENTER);
        
        // phan dieu khien
        clear = new JButton("Clear");
        clear.addActionListener(this);
        query = new JButton("Query");
        query.addActionListener(this);
        select = new JTextField(30);
        control = new JPanel();
        control.setLayout(new FlowLayout(FlowLayout.CENTER));
        control.add(new JLabel("SQL"));
        control.add(select);
        control.add(query);
        control.add(clear);
        add(control,BorderLayout.SOUTH);
    }

    public static void main(String&#&#[&#&#] args) {
        new DemoSQL();
    }


    public void actionPerformed(ActionEvent e) {
        if(e.getSource()==ok){
            if(Connect(nameData.getText())){
                control.setVisible(true);
                display.setVisible(true);
            }

        }
        else if(e.getSource()==clear){
            select.setText("");
            display.removeAll();
            display.setVisible(false);
            display.setVisible(true);
        }
        else if(e.getSource()==query){
            selectData(select.getText());
        }
        
    }

    private void selectData(String sql) {
        
        Statement stmt;
        ResultSet rs;
        try {
             stmt = con.createStatement();
             rs = stmt.executeQuery(sql);
        } catch (SQLException e) {
            display.removeAll();
            display.setVisible(false);
            display.setVisible(true);
            return;
        }    
        creatTable(rs);    
    }

    private void creatTable(ResultSet rs) {
        display.removeAll();
        Vector vtData=new Vector() ;
        Vector vtColumn = null ;
        
        ResultSetMetaData rsm = null;
        
        try {
            rsm = rs.getMetaData();
            int col = rsm.getColumnCount();
            vtColumn = new Vector(col,col);
            for (int i = 1; i <= col; i++){
                 vtColumn.add(rsm.getColumnName(i));
            }
                 
            vtData = new Vector(10,10);
            Vector temp;
            while(rs.next()){
                temp = new Vector(col);
                for(int i = 1; i<=col;i++){
                    temp.add(rs.getString(i));
                }
                vtData.add(temp);
            }
             
            JTable table = new JTable(vtData,vtColumn);
            display.add(new JScrollPane(table));
            
        } catch (SQLException e) {}
        
        display.setVisible(false);
        display.setVisible(true);
    }

    private boolean Connect(String name) {
        
        try {
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            con = DriverManager.getConnection("jdbc:odbc:"+name);
        } catch (Exception e) {
            
            return false;
        }
            
        return true;
    }

}
bài này làm đơn giản với câu lệnh select thôi, các bạn có thể tự viết thêm, để chiều trãnh mình làm lun cho đủ bộ

còn đây là kết quả chạy, nhớ là bước đầu là điền đúng tên ODBC mình vừa tạo ra




cuối cùng chúc các bạn thành công.:ghost18:
 

nasural

Active Member
11/2/11
379
87
28
Ðề: [java] hiển thị CSDL với Jtable thông qua ODBC

bạn ơi, mình chả hiểu luôn, cho xin cái giao diện luôn đi.
 

chuotfx

Member
4/4/10
365
25
18
Ðề: [java] hiển thị CSDL với Jtable thông qua ODBC

bài này là demo Jtable để hiển thị 1 resultset khi select từ database và lấy các trường metadata của nó để hiển thị tên cột. cái hình đó up lên host chùa nên die rồi. còn mình xóa hết csdl trong máy nên chã biết bây giờ nó là của cái nào nữa
 

mrniit

New Member
20/6/11
16
0
1
Ðề: [java] hiển thị CSDL với Jtable thông qua ODBC

cho mình hỏi chút. khi run nó báo lỗi như sau. java.sql.SQLException: No suitable driver found for jdbc. ai biết chỉ với vừa mới học java:(
 

skidrow

Member
18/7/10
58
0
6
Ðề: [java] hiển thị CSDL với Jtable thông qua ODBC

add thêm cái driver của nó vô thư viện, lên gg tìm
 

mrniit

New Member
20/6/11
16
0
1
Ðề: [java] hiển thị CSDL với Jtable thông qua ODBC

mình đã add cai sqljdbc4 rồi nhưng nó vẫn vậy, add cái sqljdbc cũng tương tự. Đến nản
 

skidrow

Member
18/7/10
58
0
6
Ðề: [java] hiển thị CSDL với Jtable thông qua ODBC

nếu làm vs access thì lên gg kiếm cái này Access_JDBC file jar về add zô. nếu làm vs mysql thì lên đây
http://dev.mysql.com/downloads/connector/j/5.0.html tải zề, add zô, đọc sách, rồi dùng.
Vừa mới học java học cái nì làm chy
 

mrniit

New Member
20/6/11
16
0
1
Ðề: [java] hiển thị CSDL với Jtable thông qua ODBC

sqljdbc cơ mà. accset với mysql thì nói làm chi