2012-09-04 2 views
0

데이터베이스 레코드를 가져 오는 데 문제가 있습니다. 데이터베이스 레코드를 JTable에 표시하는 가장 좋은 방법은 무엇입니까? 지금 당장 레코드를 가져 와서 Object [] [ ] 배열에서이 변수가 Object [] [] 데이터의 값을 JTable에 표시되도록하고 싶었지만이 작업을 수행하고 있는지 알지 못합니다. 그리고 내 데이터베이스의 레코드에 따라 Object [] [] 데이터 크기를 초기화 할 수 있습니까? 여기 Java JTable 데이터베이스 레코드 표시

감사

내 코드입니다 : 당신은 내가 레코드를 페치 루프에 대해 여러를 사용하여 볼 수 있습니다뿐만 아니라

ResultSet rs = null; 
Statement sql = null; 
Object[][] data = new Object[100][100]; 

     String query = "SELECT * FROM INVENTORY"; 
     sql = con.createStatement(); 
     sql.executeQuery(query); 
     rs = sql.getResultSet(); 

     while(rs.next()){ 
      for(int i = 0; i < data.length; i++){ 
       for(int j = 0; j < data[i].length; j++){ 
        int valId = rs.getInt(1); 
        String valName = rs.getString(2); 
        String valCat = rs.getString(3); 
        String valDesc = rs.getString(4); 
        double valPrice = rs.getDouble(5); 
        int valstock = rs.getInt(6); 
        int valSupply = rs.getInt(7); 

        System.out.println(valId); 
        System.out.println(valName); 
        System.out.println(valCat); 
        System.out.println(valDesc); 
        System.out.println(valPrice); 
        System.out.println(valstock); 
        System.out.println(valSupply); 

, 그것은 바로 루프 배수를 사용할 수 있나요? 또는 쉬운 방법이 있으며 내 데이터베이스의 전체 레코드에 따라 Object [] [] 배열을 초기화 할 수 있습니까?

+1

당신이 전에이 질문을하지? http://stackoverflow.com/questions/12242333/java-jtable-result-from-database – MadProgrammer

+0

그래,하지만 콘솔에만 표시됩니다. 어떻게 JTable에 표시 할 수 있습니까? 변수 데이터를 호출했지만 아무 것도 표시하지 않지만 열 헤더 만. 이걸로 나를 도울 수 있니? – Zyrax

+0

이전 질문의 개념은 완전히 동일합니다. Object [] [] 배열을 생성 한 다음 테이블 모델에 직접 공급할 수 있습니다. – MadProgrammer

답변

2

당신은 데이터 홀더 만들 ArrayList에

먼저 사용해야한다 : 당신이 행에 의한 결과 집합 행을 반복 그리고

ArrayList<Object[]> data = new ArrayList<Object[]>(); 

을 새로운 객체 [] 배열을 저장할 때마다 생성 행.

while(rs.next()){ 
    Object[] row = new Object[]{rs.getInt(1), 
        rs.getString(2), 
        rs.getString(3), 
        rs.getString(4), 
        rs.getDouble(5), 
        rs.getInt(6), 
        rs.getInt(7)}; 
    data.add(row); 
} 
Object[][] realData = data.toArray(new Object[data.size()][]); 

는 '*'을 사용하고 바로 필드를 나열 할 수있는 SQL 쿼리를 변경 한 경우 그것은 또한 좋은 것 : 테이블에있는 항목의 수는 행의 열 수 있어야한다.

+0

"*"를 사용하지 않기로 한 +1 – MadProgrammer

+0

당신의 대답은 모두 너무 좋았습니다. 지금 그것은 내 JTable에 표시됩니다 .. SQL 문에서 *를 사용하는 단점은 무엇입니까? 죄송합니다. Java에서 멍청한 녀석입니다. – Zyrax

+1

1. 기둥의 순서. 현재 주문이 알고 있다고 가정하고 있습니다. 그렇게해서는 안됩니다. 더 나쁜 경우에는 열 이름을 사용하여 결과 집합에서 값을 검색해야합니다. 2. 데이터베이스에서 더 많은 데이터베이스를 가져올 수 있습니다. 테이블에 100 개의 열이 있으면 재사용 시간 (DB에서 처리)과 대역폭을 낭비하게됩니다. – MadProgrammer

1

적절한 행과 열 수를 사용하여 data의 크기를 초기화해야합니다. 행 수를 얻으려면 here 절차를 따르십시오. 열 수를 얻으려면 JavaDocs에서 대답을 찾으십시오.

이렇게하면 위에있는 루프 중 하나를 제거 할 수 있습니다. 단지

final int columnCount = rs.getMetaData().getColumnCount(); 
int row = 0; 
while(rs.next()) { 
    for(int index = 0; index < columnCount; index ++) { 
     data[row][index] = rs.getObject(index); 
    } 
    row ++; 
} 

으로 또는 대신 Object[][]를 사용하여 당신을 떠나 Model가 MVC 아키텍처를 다음있어서, List<Model>를 사용합니다.

+0

데이터베이스와 드라이버가 양방향 커서를 지원하는지 알지 못하고'ResultSet.last'를 사용하는 것에 대해 조심해야합니다. 그러나 제안을 좋아하지 않는다는 의미는 아닙니다.) – MadProgrammer

+0

@MadProgrammer, 동의합니다. –

2

이전 대답에서 시작했습니다.

데이터베이스에서 얼마나 많은 행이 나오는지 미리 알 수는 없습니다. 사용할 수있는 기술이 있지만, 추측 할 수만 있습니다 (JDBC에 익숙해 진 지 오래되었습니다).

행 개수를 미리 알지 못하는 경우에는 일종의 동적 배열이 필요합니다. 재미 있은만큼, Java는 하나를 제공합니다. 그것은 ArrayList이라고합니다. 이렇게하면 실제로 필요한 요소 수를 모른 채 요소를 추가 할 수 있습니다.

둘째, 나는 그 개체를 가장 잘 나타내는 개체에 행 결과를 저장합니다. 이는 데이터 구조의 복잡성을 크게 줄이고 코드 x에 변경 사항을 적용하기 쉽게 만들고 열 x의 길이를 결정합니다. 당신이 기대하고있는 값 ... 예를 들어

public class Inventory { 

    private int id; 
    private String name; 
    private String catagory; 
    private String description; 
    private double price; 
    private int stock; 
    private int supply; 

    public Inventory(int id, String name, String catagory, String description, double price, int stock, int supply) { 
     this.id = id; 
     this.name = name; 
     this.catagory = catagory; 
     this.description = description; 
     this.price = price; 
     this.stock = stock; 
     this.supply = supply; 
    } 

    public void setCatagory(String catagory) { 
     this.catagory = catagory; 
    } 

    public void setDescription(String description) { 
     this.description = description; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public void setPrice(double price) { 
     this.price = price; 
    } 

    public void setStock(int stock) { 
     this.stock = stock; 
    } 

    public void setSupply(int supply) { 
     this.supply = supply; 
    } 

    public String getCatagory() { 
     return catagory; 
    } 

    public String getDescription() { 
     return description; 
    } 

    public int getId() { 
     return id; 
    } 

    public String getName() { 
     return name; 
    } 

    public double getPrice() { 
     return price; 
    } 

    public int getStock() { 
     return stock; 
    } 

    public int getSupply() { 
     return supply; 
    } 

} 

같은

뭔가.

의 I는 I은 단순히 목록을 사용하도록 유혹 할 것, 거기에서 기본적으로 List

List<Inventory> inventoryList = new ArrayList<Inventory>(50); // This is a "seed" value to helps performance 
while(rs.next()){ 
    Inventory inventory = new Inventory(rs.getInt(1), 
     rs.getString(2), 
     rs.getString(3), 
     rs.getString(4), 
     rs.getDouble(5), 
     rs.getInt(6), 
     rs.getInt(7)) 
    inventoryList.add(inventory); 
} 

에이 정보를 저장하는 것입니다. 이것은 아마 우리 자신의 AbstractTableModel를 구현해야합니다, 그러나 ..... 장기적으로 java.util.collection에서 Vectors이 문제를 해결할 사용

+0

ArrayList의 50은 무엇을 표시 할 결과의 총 개수입니까? – Zyrax

+0

[JavaDocs] (http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#ArrayList%28int%29)'각 ArrayList 인스턴스에는 용량이 있습니다. 용량은 목록에 요소를 저장하는 데 사용되는 배열의 크기입니다. 항상 최소한 목록 크기만큼 큽니다. 요소가 ArrayList에 추가되면 용량이 자동으로 커집니다. 성장 정책의 세부 사항은 요소를 추가 할 때 일정한 상환 시간 비용이 있다는 사실 외에도 명시되지 않습니다. " – MadProgrammer

+0

"50 "은 간단하게 질문에 대답하기 위해 추측입니다. 시간이 지남에 따라 새 요소를 추가 할 때 배열 목록을 더 빠르게 만드는 것이 있습니다. 'ArrayList'는 동적입니다. 즉, 고정 된 용량이 없다는 것을 의미합니다. 더 많은 요소를 추가함에 따라 커질 것입니다. 즉, 미리 필요한 요소의 수를 알 필요가 없습니다. – MadProgrammer