JavaGUI显示表格(连接数据库)基础

本人所作的其他相关博客:
Java窗体的创建,按钮的响应(最基础级别)
JavaGUI开发实践:登录界面模拟(连接数据库,不同身份用户进入不同界面)
这边建议各位使用快捷的窗体开发工具,JwindowBuilder,所有的窗体控件都是拖拽式的。具体使用各种博客都有。这里就不再赘述。

注意: 下面的代码不是很严谨,当时写的时候没注意,就是数据库连接使用完毕后,记得释放资源。

一、界面概览

在这里插入图片描述
获取数据库中的数据后,结果如图所示:
在这里插入图片描述
(1) 点击按钮“显示数据”后连接数据库信息:这里做的样例比较少。

(2) 点击"确定"或者取消以后,退出界面。
(3)点击“”取消按钮退出该界面。

以下是我的数据库信息:数据库版本为8.0.20
在这里插入图片描述
下面是数据库的变量名和数据类型。
在这里插入图片描述

一定要清楚自己数据库的各个量的数据类型,在后面获取结果集显示到表格中需要对应。

二、代码

package newGUI;

import javax.swing.*;
import javax.swing.table.JTableHeader;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.*;

public class SalesStatisticsFrame extends JFrame {
    private JScrollPane scpDemo;
    private JTableHeader jth;
    private JTable tabDemo;
    private JButton btnShow;
    private JButton bt1;
    private JButton bt2;

    {
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (Exception e) {
            System.out.println(e);
        }
    }

    public SalesStatisticsFrame() {
        super("生成采购报表");        //JFrame的标题名称
        this.setSize(660, 600);        //控制窗体大小
        this.setLayout(null);        //自定义布局
        this.setLocation(400, 100);    //点击运行以后,窗体在屏幕的位置
        this.scpDemo = new JScrollPane();
        this.bt1 = new JButton("确定");
        this.bt2 = new JButton("取消");
        this.btnShow = new JButton("显示数据");
        this.bt1.setBounds(100, 480, 100, 30);
        this.bt2.setBounds(380, 480, 100, 30);
        this.scpDemo.setBounds(10, 50, 580, 400);    //设置滚动框大小
        this.btnShow.setBounds(10, 10, 120, 30);    //设置按钮
        this.btnShow.addActionListener(new ActionListener()    //给“显示数据”按钮添加事件响应。
        {
            public void actionPerformed(ActionEvent ae) {
                btnShow_ActionPerformed(ae);
            }
        });
        /********按钮“确定”的响应*******/
        this.bt1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });
        /******按钮 “取消”的响应*****/
        this.bt2.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });
        /******* 将组件加入到窗体中******/
        add(this.scpDemo);
        add(this.btnShow);
        add(this.bt1);
        add(this.bt2);
        this.setVisible(true);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {
        new SalesStatisticsFrame();
    }

    /***连接数据库并显示到表格中***/
    public void btnShow_ActionPerformed(ActionEvent ae) {
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            String url = "jdbc:mysql://localhost:3306/supermarket?serverTimezone=CTT";//注意设置时区
            String username = "root";
            String passwords = "Yuanfeng200517";
            Connection conn = DriverManager.getConnection(url, username, passwords);
            String sql = "select * from sellsreport";
            PreparedStatement pstm = conn.prepareStatement(sql);
            ResultSet rs = pstm.executeQuery();
            int count = 0;
            while (rs.next()) {
                count++;
            }
            rs = pstm.executeQuery();
            // 将查询获得的记录数据,转换成适合生成JTable的数据形式
            Object[][] info = new Object[count][6];
            String[] title = {"序号", "商品名称", " 商品数量", "成本价", "售价", "库存余量"};
            count = 0;
            while (rs.next()) {
                info[count][0] = Integer.valueOf(rs.getInt("id"));
                info[count][1] = rs.getString("name");
                info[count][2] = Integer.valueOf(rs.getInt("quantity"));
                info[count][3] = rs.getString("cost");
                info[count][4] = rs.getString("sellingprice");
                info[count][5] = rs.getString("strockmargin");
                count++;
            }
            // 创建JTable
            this.tabDemo = new JTable(info, title);
            // 显示表头
            this.jth = this.tabDemo.getTableHeader();
            // 将JTable加入到带滚动条的面板中
            this.scpDemo.getViewport().add(tabDemo);
        } catch (ClassNotFoundException cnfe) {
            cnfe.printStackTrace();
            JOptionPane.showMessageDialog(null, "数据源错误", "错误", JOptionPane.ERROR_MESSAGE);
        } catch (SQLException sqle) {
            sqle.printStackTrace();
            JOptionPane.showMessageDialog(null, "数据操作错误", "错误", JOptionPane.ERROR_MESSAGE);
        }
    }
}
 
 

三、代码解释

  1. 首先,下面的代码是用来控制Java GUI 风格的:整个try用一个大括号包起来就不会出错了。
 {
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (Exception e) {
            System.out.println(e);
        }
    }
  1. 连接数据库操作说明:
    (1) 首先连接数据库,连接以后用count变量存储数据库中有多少行。
Class.forName("com.mysql.cj.jdbc.Driver");
    String url = "jdbc:mysql://localhost:3306/supermarket?serverTimezone=CTT";//注意设置时区
    String username = "root";
    String passwords = "Yuanfeng200517";
    Connection conn = DriverManager.getConnection(url, username, passwords);
    PreparedStatement pstm = conn.prepareStatement(sql);
    ResultSet rs = pstm.executeQuery();
    String sql = "select * from sellsreport";
    int count = 0;
			while(rs.next())
    {
        count++;
    }

用数组title来存储你想要显示的中的列属性名

String []title= {"序号","商品名称"," 商品数量","成本价","售价","库存余量"};

实际显示就是这样:
在这里插入图片描述

我们用一个二维数组来存储数据库中的二维表,
Object[][] info = new Object[count][6];
然后遍历结果集,将获取每行的数据:

count = 0;		//这里要清零,因为后面count要从0加到数据库中的行数。
	while(rs.next())
	{
		info[count][0] = Integer.valueOf( rs.getInt("id"));		//id是数据库中的变量名
		info[count][1] = rs.getString("name");
		info[count][2] = Integer.valueOf( rs.getInt("quantity") );
		info[count][3] = rs.getString("cost");
		info[count][4] = rs.getString("sellingprice");
		info[count][5] = rs.getString("strockmargin");
		count++;
	}

上面代码中:

如果数据库中变量是int型的,那么用 Integer.valueOf( rs.getInt("id"));	
如果数据库中变量是string型的,那么用  rs.getString("sellingprice");  
  引号内的字符是数据库中的变量名,必须和数据库的变量名称一样。

最后,我们把获得的数据变成表格的形式显示其中,JavaGUI用的是JTabel

// 创建JTable
	this.tabDemo = new JTable(info,title);
	// 显示表头
	this.jth = this.tabDemo.getTableHeader();
	// 将JTable加入到带滚动条的面板中
	this.scpDemo.getViewport().add(tabDemo); 
	}

项目全部代码下载地址: JavaGUI超市进销存管理系统 所有代码

四、项目全部代码下载地址

JavaGUI超市进销存管理系统 所有代码

五、 项目代码说明

有关项目的代码说明:
项目结构如下图(有很多功能用不上了,有些就是仅仅界面,没有任何响应。):
在这里插入图片描述

说明:

  1. 下面这个是连接数据库,生成采购报表的代码代码: SalesStatisticFrame.java
    ``在这里插入图片描述

  2. 下面这个是登录界面代码,Load_GUI.java
    在这里插入图片描述

  3. 其他的界面可以根据类名,或者直接运行来看,时间有点儿久了,忘记了。。

大一写的代码,很乱很不完整,见谅见谅

项目文件地址:JavaGUI超市进销存管理系统 所有代码

六、功能更新:根据下拉单内容查询不同数据库

这部分的功能更新已经放到我上面发的项目内了

我们实现的就是“设备信息详情”GUI界面。我们这个设备是,零售机设备,每个零售机中存储不同的商品。实现的数据查询内容就是根据设备名称查询设备中的商品信息

另外两个界面,生成数据报表GUI代码没有贴出来。

6.1 界面概览

在这里插入图片描述

上面的级联查询GUI代码分别在项目中的 EquipGoodsTable.java,EquipInfoTable.java,都已经更新了。有需要读者可以自行下载。JavaGUI超市进销存管理系统 所有代码

6.2 用到的主要控件

我们主要用的是JComboBox控件,主要用到的方法就是:

  1. jc1.getSelectedItem().toString();//获取选择的下拉单的内容并转换成String类型。

  2. jc1.addItem(“设备1号”);
    jc1.addItem(“设备2号”);
    jc1.addItem(“设备3号”);
    jc1.addItem(“设备4号”);;
    //给下拉单添加内容选项。这里是死的,其实也可以从数据库中获取

  3. 细节,sql拼接字符串,将下拉单选中的内容拼接到sql语句中:注意单引号和双引号不要缺失,否则报语法错误。

geteqp=jc1.getSelectedItem().toString();
System.out.println(geteqp);
String sql = "select * from goods where belongs='"+geteqp+"'"; 

这里的belongs是数据库中的字段名(就是数据库中列名)。
这里解释一下,为什么单引号中还要有双引号和+。这是因为,我们如果写到Navicat,使用SQL查询,可以这样写:

SELECT * FROM goods WHERE belongs=‘设备1号’;

也就是说,如果我们直接在Navicat查询,上面这个查询语句就是根据belongs值(belongs是varchar类型的)来查询。那么,如果要在Java语句中,我们要将获取到的下拉单的值用String变量geteqp存储,然后,为了避免将变量识别为字符串,我们就要加上转义字符"++",两个加号中间填的就是变量的名字,这样就不会将变量geteqp识别为字符串了。所以最终的SQL查询语句是:

"SELECT * FROM goods WHERE belongs='"+geteqp+"'";

七、其他相关博客

7.1 Java窗体的创建,按钮的响应(最基础级别)

7.2 JavaGUI开发实践:登录界面模拟(连接数据库)

7.3 项目全部代码下载地址

有兴趣看整个项目代码的,可以看看下面的分享下面的链接。

JavaGUI超市进销存管理系统 所有代码

其实最主要的功能模块已经总结在我分享的博客和这个博客了,不过,这个系统还有很多需要实现的,上面分享的项目里面还有很多未完善的功能,各位可以自己去拓展一下,SQL语句真的很重要…


版权声明:本文为SKMIT原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。