JDBCTable.java使用JTable显示数据表

运行结果少了书上图中的表格,是正确的运行结果吗?请问是怎么样查询呢?navicat里面的表创建是对的吗?不太懂,求解答。谢谢!
package cs;
import java.awt. *;
import java.awt.List;
import java.awt.event. *;

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

import javax.swing.table. *;
class JDBCJTable extends JFrame{
JTextField txtQuery = new JTextField(10);
JButton btnQuery = new JButton("按条件查询");
JTable table = new JTable();

AbstractTableModel tm;
String titles[];
Class<? >colClasses[];
java.util.List<java.util.List<Object>>records;

public JDBCJTable() {
    JPanel pnl = new JPanel();
    pnl.add(txtQuery);
    pnl.add(btnQuery);
    getContentPane().add(pnl, BorderLayout.NORTH);
    
    table.setToolTipText("显示全部查询结果");
    table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    table.setCellSelectionEnabled(false);
    table.setShowVerticalLines(true);
    table.setShowHorizontalLines(true);
    
    JScrollPane scrollpane = new JScrollPane(table);
    getContentPane().add(scrollpane, BorderLayout.CENTER);
    
    btnQuery.addActionListener(e->{
        try {
            showData();
        }catch(Exception ex) {
            ex.printStackTrace();
        }
    });
    setSize(400,300);
    setTitle("Show Database table in JTable");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setLocationRelativeTo(null);
    setVisible(true);
}
public void showData() throws SQLException, ClassNotFoundException{
    Class.forName("org.sqlite.JDBC");
    String connString = "jbdc:sqlite:d/javaExample/ch11/jbdcDemo/test3.bd";
    Connection connection = DriverManager.getConnection(connString);
    
    String sql = "select * from people where name like?";
    PreparedStatement stmt = connection.prepareStatement(sql);
    stmt.setString(1, "%"+txtQuery.getText().trim()+"%");
    ResultSet rs = stmt.executeQuery();
    ResultSetMetaData meta = rs.getMetaData();
    
    int colCnt = meta.getColumnCount();
    System.out.println(colCnt);
    titles = new String[colCnt];
    colClasses = new Class[colCnt];
    for(int i = 0;i<colCnt;i++) {
        titles[i]=meta.getColumnName(i+1);
        String className = meta.getColumnClassName(i+1);
        Class<? >clz = String.class;
        if(className!=null)
            try {
                clz=Class.forName(className);
            }catch(Exception ex) {
                ex.printStackTrace();
            }
        colClasses[i]=clz;
    }
    records.clear();
    while(rs.next()) {
        java.util.List<Object>one_record = new ArrayList<>();
        for(int i = 0;i<titles.length;i++) {
            Object obj = rs.getObject(i+1);
            System.out.print(obj+";");
            one_record.add(obj==null?null:obj.toString());
        }
        records.add(one_record);
        System.out.println();
    }
    table.setModel(tm);
    tm.fireTableStructureChanged();
    
}
public void initTableModel() {
    records = new ArrayList<>();
    tm = new AbstractTableModel() {
        public int getColumnCount() {
            return titles.length;
        }
        public int getRowCount() {
            return records.size();
        }
        public Object getValueAt(int row, int column) {
            if(!records.isEmpty())
                return (records.get(row)).get(column);
            else
                return null;
        }
        public String getColumnName(int column) {
            return titles[column];
        }
        public Class<? >getColumnClass(int column){
            return colClasses[column];
        }
        public void setValueAt(Object value,int row,int column) {
            
        }
        public boolean isCellEditable(int row,int column) {
            return false;
    }
};

}

public static void main(String[] args) {
SwingUtilities.invokeLater(()->{
JDBCJTable frame = new JDBCJTable();
frame.initTableModel();
try {
frame.showData();
}catch(Exception e) {
e.printStackTrace();
}
});
}

}

img

img

img