怎样读取数据库表格以表格形式输出?
- 创建表
- 链接数据库
- 查询语句得到数据
- 得到的数据转化
- 重组创建的表
结果演示
源代码
package Links;
import java.awt.*;
import java.math.BigDecimal;
import javax.swing.*;
import java.sql.*;
import java.sql.Date;
import java.time.LocalDate;
import java.util.*;
import javax.swing.table.*;
/**
* @Author: 冀十三
* @DescIption:读取数据库以表格输出
* @Date:2021--06--10--21:13
*/
public class JDBCJTable extends JFrame {
// 声明一个类AbstractTableModel对象
AbstractTableModel model;
// 声明一个类JTable对象
JTable table;
// 声明一个滚动面板对象
JScrollPane jscrollpane;
// 声明表头
String titles[];
Class<?> colClasses[];
// 二维表 列的类型 // 声明一个二维向量存储每一行数据
Vector<Vector<String>> records;
public void initTableModel() {
records = new Vector<>();
// 实例化向量
model = new AbstractTableModel() {
private static final long serialVersionUID = 1L;
public int getColumnCount() {
// 取得表格列数
return titles.length;
}
public int getRowCount() {
return records.size();
// 取得表格行数
}
public String getValueAt(int row, int column) {
if (!records.isEmpty())
// 取得单元格中的属性值
return records.elementAt(row).elementAt(column);
else
return null;
}
public String getColumnName(int column) {
return titles[column];
// 设置表格列名
}
public Class<?> getColumnClass(int column) {
System.out.println("getColumnClass(int column):" + colClasses[column]);
return colClasses[column];
}
public void setValueAt(Object value, int row, int column) {
}
public boolean isCellEditable(int row, int column) {
return false;
// 设置单元格不可编辑,为缺省实现
}
};
}
//这里我使用了我写的另一个工具类中链接数据库的方法。
//文末附链接
Connection conn=JDBCUtils.getConnection();
public void showData() throws SQLException, ClassNotFoundException {
// 执行查询
Statement stmt = JDBCUtils.getConnection().createStatement();
ResultSet rs = stmt.executeQuery(" SELECT * FROM `school`.`user`");
// 得到元数据
ResultSetMetaData meta = rs.getMetaData();
// 返回列的数量
int colCnt = meta.getColumnCount();
System.out.println(colCnt);
titles = new String[colCnt];
// 提供数据类型,重写
// public Class<?> getColumnClass(int column)
colClasses = new Class[colCnt];
for (int i = 0; i < colCnt; i++) {
// 得到列名,注意下标是从1开始的
titles[i] = meta.getColumnName(i + 1);
String className = meta.getColumnClassName(i + 1);
System.out.println("类型:" + className);
// 得到数据类型
Class<?> clz = Object.class;
if (className != null)
try {
clz = Class.forName(className);
} catch (Exception ex) {
ex.printStackTrace();
}
if (clz == Double.class) {
clz = BigDecimal.class;
}
if (clz == Date.class) {
clz = LocalDate.class;
}
colClasses[i] = clz;
}
// records 二维向量,记录每一行查询所得,已被初始化
records = new Vector<>();
records.removeAllElements();
while (rs.next()) {
// 每一行
Vector<String> rec_vector = new Vector<>();
// 从结果集中取数据放入向量rec_vector中
for (int i = 0; i < titles.length; i++) {
Object obj = rs.getObject(i + 1);
System.out.print(obj + ";");
rec_vector.addElement(obj == null ? null : obj.toString());
}
records.addElement(rec_vector);
System.out.println();
}
// 实例化JTable对象
// 使用继承JTable类的子类MTable实例化JTable对象
table = new MTable();
// 设置帮助提示
table.setToolTipText("显示全部查询结果");
// 设置表格调整尺寸模式
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
// 设置单元格选择方式
table.setCellSelectionEnabled(true);
table.setShowVerticalLines(true);
table.setShowHorizontalLines(true);
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
table.setSelectionBackground(Color.YELLOW);
table.setSelectionForeground(Color.gray);
table.setRowHeight(40);
table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
// 设置表格模型
table.setModel(model);
// 将表格放在滚动面板中
jscrollpane = new JScrollPane(table);
getContentPane().add(jscrollpane);
// 更新表格
model.fireTableStructureChanged();
// 注:设定数据,也可以用以下的构造方法
}
public static void main(String[] args) {
JDBCJTable f = new JDBCJTable();
f.initTableModel();
try {
f.showData();
} catch (Exception e) {
e.printStackTrace();
}
f.setSize(560, 480);
f.setLocationRelativeTo(null);
f.setTitle("数据库查询");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
}
//继承JTable //设置表格内容居中
class MTable extends JTable {
public MTable(Vector<Vector<String>> rowData, Vector<String> columnNames) {
super(rowData, columnNames);
}
public MTable() {
}
public JTableHeader getTableHeader() {
JTableHeader tableHeader = super.getTableHeader();
tableHeader.setReorderingAllowed(false);
DefaultTableCellRenderer hr = (DefaultTableCellRenderer) tableHeader.getDefaultRenderer();
hr.setHorizontalAlignment(DefaultTableCellRenderer.CENTER);
return tableHeader;
}
public TableCellRenderer getDefaultRenderer(Class<?> columnClass) {
DefaultTableCellRenderer cr = (DefaultTableCellRenderer) super.getDefaultRenderer(columnClass);
cr.setHorizontalAlignment(DefaultTableCellRenderer.CENTER);
return cr;
}
public boolean isCellEditable(int row, int column) {
return false;
}
}
链接数据库的方法
也可以 上主页置顶内容。