在java中显示数据库表

时间:2015-08-18 23:25:02

标签: java database resultset

我正在尝试从我的数据库中填充表格。我按照教程,我的代码显示在下面,但是我收到此错误,无法弄清楚原因。在我的数据库中,我有'名字,姓氏,地址,城市,州,邮编',不确定是否需要此信息来帮助我解决我的问题

有人可以帮忙吗

先谢谢你的帮助。

package medicalrecords;

import java.awt.*;
import java.sql.*;
import java.util.*;
import javax.swing.*;

public class TableFromDatabase extends JPanel {
private Connection conexao = null;

public TableFromDatabase() {
Vector columnNames = new Vector();
Vector data = new Vector();

try {
        //  Connect to an Access Database
        conexao = DriverManager.getConnection("jdbc:derby://" + "localhost"
                + ":1527/Medical Records", "root", "password");



        //  Read data from a table
        String sql = "select * from SD2799.PATIENTRECORDS";
        try (Statement stmt = conexao.createStatement(); 
        ResultSet rs = stmt.executeQuery(sql)) {
            ResultSetMetaData md = rs.getMetaData();
            int columns = md.getColumnCount();

            //  Get column names
            for (int i = 1; i <= columns; i++) {
                columnNames.addElement(md.getColumnName(i));
            }

            //  Get row data
            while (rs.next()) {
                Vector row = new Vector(columns);

                for (int i = 1; i <= columns; i++) {
                    row.addElement(rs.getObject(i));
                }

                data.addElement(row);
            }

        }
        conexao.close();
    } catch (Exception e) {
        System.out.println(e);
    }

    //  Create table with database data
    JTable table = new JTable(data, columnNames) {
        @Override
        public Class getColumnClass(int column) {
            for (int row = 0; row < getRowCount(); row++) {
                Object o = getValueAt(row, column);

                if (o != null) {
                    return o.getClass();
                }
            }

            return Object.class;
        }
    };

    JScrollPane scrollPane = new JScrollPane(table);
    add(scrollPane);

    JPanel buttonPanel = new JPanel();
    add(buttonPanel, BorderLayout.SOUTH);
}

public static void main(String[] args) {

    javax.swing.SwingUtilities.invokeLater(() -> {
        JFrame frame = new JFrame("Patient Records");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //Create and set up the content pane.
        TableFromDatabase newContentPane = new TableFromDatabase();
        newContentPane.setOpaque(true); //content panes must be opaque
        frame.setContentPane(newContentPane);

        //Display the window.
        frame.pack();
        frame.setVisible(true);
    });

    }
}

1 个答案:

答案 0 :(得分:2)

您的消息&#34; 使用未经检查或不安全的操作。注意:使用-Xlint重新编译:未选中以获取详细信息&#34;不是错误,但它是一个警告。 Vector类是通用的(泛型在1.5中添加到Java中),这意味着它需要一个类型参数。这里,它意味着它可以容纳的对象类型。

如果要使用命令行选项&#34; -Xlint:unchecked&#34;重新编译?如警告所示,编译器将为您提供有关警告的更多详细信息,包括违规行。

您没有为任何Vector提供类型参数,因此它们是 raw ,这意味着没有提供类型参数。编译器警告您使用原始类型,并且您的类型安全性存在风险。

您可以提供相应的类型参数以消除警告。在TableFromDatabase构造函数中,顶部:

Vector<String> columnNames = new Vector<String>();
Vector<Vector<Object>> data = new Vector<Vector<Object>>();

以及稍后在同一个构造函数中:

Vector<Object> row = new Vector<Object>(columns);

但是,Vector在Java 1.2中被ArrayList(及其List接口)取代。实际上,Vector已经过改进,然后实现了新的List接口。您似乎不需要Vector的线程安全,因此建议您使用ArrayList代替。

List<String> columnNames = new ArrayList<String>();
List<Vector<Object>> data = new ArrayList<List<Object>>();

List<Object> row = new ArrayList<Object>(columns);

从Java 1.7开始,您可以使用&#34;菱形运算符&#34;,并删除赋值运算符右侧的类型参数,让Java推断出正确的类型,例如:

List<String> columnNames = new ArrayList<>();
List<Vector<Object>> data = new ArrayList<>();

List<Object> row = new ArrayList<>(columns);