这个学期,学校奇葩的给我这个专业开了个Java(说怪也不怪,大学学校总要教你那么一两门高级语言嘛),唉!作为这个物联网工程专业的学生,总是有说不完的苦,有些学校放在电子信息工程学院,有些则放在计算机学院,当然也有厉害的双一流重点大学,比如江南大学,人家牛逼,开了个物联网工程学院!可以说,物联网的学生是软硬通吃,这边数据结构还没看懂,那边单片机电路图,数电逻辑门电路图又来了,真是崩溃。可能学软件的会不服,唉不服就不服吧,洛阳亲友如相问,我说你在敲代码。
说说我这学期学Java的感受吧,上课呢,几乎是不听的。哇,不是我不听啊,是不知道听啥,一上课,老师先在讲台上操作一波,装jdk啦,配置变量啦,安装文本编辑器啦,先胡乱来一通,然后打开JAVA API帮助文档,然后,你懂的,对着文档和书本,然后一节课没了。没办法,只好自己上网找视频自学,然后买书看(这里推荐视频——《韩顺平零基础学Java》以及书籍《Java编程思想》个人觉得还行,Java编程思想有点深,略微看看,学完基础的可以回头再看),你还别说,这一自学,觉得还挺有意思,意思在哪呢,居然可以自学了,哈哈哈,当然啦,我是开玩笑的。这自学的本事还是要有的。总之,既然选择学习·一门语言,就安心学吧,管它火不火,未来怎么样,脚踏实地就好。好,文章铺垫吹逼到此先告一段落,等我讲完关键的在继续吹,哈哈啊哈。
我们切入正题,大学里学过编程语言的都知道,然后都要附加一个啥实验设计课,这一到期末。可苦了不少人,这课程设计怎么做啊,是个问题啊,没办法,到处找同班牛逼的同学,组个队,先不管三七二十一,报上大腿在讲。这学期,课设题目一下来,我**的懵了,这啥玩意啊,推箱子游戏,象棋游戏,飞机大战,坦克大战,在线聊天,各种系统,这都什么万一嘛。上课对着PPt,实验课就讲点简单的创建类,创建构造方法,然后课设来这一通,可把我搞坏了。没办法,程序员嘛,最忌讳的就是沉不住气,莫慌,我来思考一波,做游戏,像象棋,飞机大战等肯定要做算法,不行直接pass,我就连数据结构都没学好,谈什么算法,那就做系统吧,仔细一想,还挺简单,莫非就是实现几个功能,增删改查,在一想那肯定要数据库,再深一点,既然用Java做,肯定要可视化界面,那么GUI逃不掉,既然这样,我毫不犹豫的选择了小型学生管理系统,好就它了,叫上我那两个不靠谱的队友,让他们把Java GUI好好看看,剩下的我来做。
当晚,就进入实战,首先我们来安装数据库,配置好数据库,建立STUDENT数据库,建立表stu,好啦,这都是数据库的内容,应该都会的,不行的找度娘。(数据库用的是MySQL-5.1.51,数据库安装程序以及对应的jar包我已上传至网盘Msq_l5.1.51(提取码:1wdz)。然后是想想该干嘛,题目是这样的(如下图),是不是很懵,然后好啦,是最艰难的部分,系
功能的设计,想了好多,去你的,就来个界面加几个按钮,实现几个增删改查的功能吧,我在纸上画了功能流程图,唉,技术太烂,画不好。
好的,我们来看看代码部分。(本人编程菜鸟,不喜勿喷)
话不多说,上代码→
第一步,创建好项目,创建package,创建类,导包(所需要的包已经打包上传至网盘,链接在上面)
首先是主类部分,也就是主界面部分
class Student:
public class Student extends JFrame implements ActionListener
{
//定义面板所需组件
JTable jt = null;
JScrollPane jsp = null;
JPanel jp1 ,jp2,jp3;
JButton jb1,jb2,jb3,jb4;
JLabel jl1;
JTextField jtf;
Table_Model tm;
public static void main(String[] args)
{
Student s1 = new Student();
}
//构造student的函数
public Student() {
//上部
jp1 = new JPanel();
jtf = new JTextField(15);
jb1 = new JButton("查询");
//注册jb1的监听器
jb1.addActionListener(this);
jl1 = new JLabel("请输入名字");
jp1.add(jl1);
jp1.add(jtf);
jp1.add(jb1);
//下部
jp2 = new JPanel();
jb2 = new JButton("添加");
jb3 = new JButton("修改");
jb4 = new JButton("删除");
jb2.addActionListener(this);
jb3.addActionListener(this);
jb4.addActionListener(this);
jp2.add(jb2);
jp2.add(jb3);
jp2.add(jb4);
//中部
//* 创建一个数据模型对象,更新table
Table_Model tm = new Table_Model();
//初始化jtable
jt = new JTable(tm);
//初始化JScrollBar
jsp = new JScrollPane(jt);
jsp.getHorizontalScrollBar();
//设置jframe
this.add(jsp);
this.add(jp1,"North");
this.add(jp2,"South");
this.setSize(400, 400);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
this.setTitle("小型学生管理系统");
this.setLocationRelativeTo(null);
}
//监听
public void actionPerformed(ActionEvent e)
{
//判断点击的按钮
//1、查询
if(e.getSource() == jb1) //使用getsource方法时,要保证复写的actionPerformed方法与所监听的按钮在同一个类中
{
//获取jtf的信息
String name = this.jtf.getText().trim() ;
//给一个sql语句
String sql = "select * from stu where name = '"+name+"'";
//构建新的数据模型。并更新
Table_Model tm = new Table_Model(sql);
//将查询到的信息写到jtable中
jt.setModel(tm);
System.out.println("查询成功");
}
//2、添加
else if(e.getSource() == jb2)
{
Table_add ta = new Table_add(this,"添加学生",true);
Table_Model tm = new Table_Model();
jt.setModel(tm);
}
//3、修改
else if(e.getSource()==jb3)
{
int rownum =this.jt.getSelectedRow();
if(rownum==-1)
{
//提示
JOptionPane.showMessageDialog(this,"请选择一行");
return;
}
else {
//显示修改对话框
Table_Update tu= new Table_Update(this,"修改对话框",true,rownum);
}
Table_Model tm = new Table_Model();
jt.setModel(tm);
}
//4、删除
else if(e.getSource() == jb4)
{
int rownum =this.jt.getSelectedRow();
if(rownum == -1) {
JOptionPane.showMessageDialog(this, "请选择一行");
return;
}
else {
Table_Model tm = new Table_Model();
//获取学生id
int id = (Integer)tm.getValueAt(rownum, 0);
System.out.println(id);
PreparedStatement ps = null;
try {
Class.forName("com.mysql.jdbc.Driver");
Connection ct = DriverManager.getConnection("jdbc:mysql://localhost:3306/student","root", "123");
ps= ct.prepareStatement("delete from stu where id = ?;");
ps.setInt(1, id);
ps.executeUpdate();
}
catch(Exception e4) {
e4.printStackTrace();
}
//刷新表格
tm = new Table_Model();
jt.setModel(tm);
}
}
}
Table_Model类继承了AbstractTableModel,可以参照这篇文章理解一下点击打开链接(感谢这位叫Terry_dong的作者,如有侵犯版权与我联系,会立即删除文章)。这个类的作用至关重要,因为增删改查的每个功能都要用到它。那我来说一下他的作用吧,其实呢,它是用来刷新主界面的表格数据的,也就是将数据写到JTable中,因为,每执行一次功能都要将执行后的结果放到表格上,而如果不创建这个类,那么就要在每个功能类中区写重复的代码,不觉得这样很蠢么,其实这个类也没什么难的,无非加载驱动,提取数据库中的数据,然后通过AbstractTableModel中的方法,对行列数据进行更新。其中,这个类有查询功能函数public void inint(String sql)实现了这个功能,然后在构造函数中public Table_Model(String sql) {this.inint(sql);}再次调用这个函数,通过传入的sql语句进行查询。再这里,一定要学会数据的链接,
Class.forName("com.mysql.jdbc.Driver");
ct= DriverManager.getConnection("jdbc:mysql://localhost:3306/student","root", "123")
ps = ct.prepareStatement(sql);rs = ps.executeQuery();
关于这部分内容可以去百度一下用法
class Table_add:
public class Table_add extends JDialog implements ActionListener{
JLabel jl1,jl2,jl3,jl4,jl5;
JButton jb1,jb2;
JTextField jtf1,jtf2,jtf3,jtf4,jtf5;
JPanel jp1,jp2,jp3;
//构造函数,定义一个添加信息页面//Frame 父窗口,title窗口名字,指定模式或非模式
public Table_add(Frame owner,String title,boolean modal) {
super(owner,title,modal);
jl1 = new JLabel("学号");
jl2 = new JLabel("姓名");
jl3 = new JLabel("系别");
jl4 = new JLabel("性别");
jl5 = new JLabel("年龄");
jtf1 = new JTextField();
jtf2 = new JTextField();
jtf3 = new JTextField();
jtf4 = new JTextField();
jtf5 = new JTextField();
jb1 = new JButton("添加");
jb2 = new JButton("取消");
jp1 = new JPanel();
jp2 = new JPanel();
jp3 = new JPanel();
//设置布局,添加组件
jp1.setLayout(new GridLayout(5, 1));
jp2.setLayout(new GridLayout(5, 1));
jp1.add(jl1);
jp1.add(jl2);
jp1.add(jl3);
jp1.add(jl4);
jp1.add(jl5);
jp2.add(jtf1);
jp2.add(jtf2);
jp2.add(jtf3);
jp2.add(jtf4);
jp2.add(jtf5);
jp3.add(jb1);
jp3.add(jb2);
this.add(jp1,BorderLayout.WEST);
this.add(jp2,BorderLayout.CENTER);
this.add(jp3, BorderLayout.SOUTH);
jb1.addActionListener(this);
this.setSize(300, 200);
this.setLocationRelativeTo(null);
this.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
if(e.getSource() == jb1) {
//连接数据库所需变量
Connection ct = null;
Statement stm = null;
ResultSet rs = null;
PreparedStatement ps = null;
try {
Class.forName("com.mysql.jdbc.Driver");
ct = DriverManager.getConnection("jdbc:mysql://localhost:3306/student","root", "123");
ps = ct.prepareStatement("insert into stu values(?,?,?,?,?);");
//获取数据
ps.setInt(1, Integer.parseInt(this.jtf1.getText().trim()));
ps.setString(2, this.jtf2.getText().trim());
ps.setString(3, this.jtf3.getText().trim());
ps.setString(4, this.jtf4.getText().trim());
ps.setString(5, this.jtf5.getText().trim());
int i = ps.executeUpdate();
if(i != 0) {
System.out.println("添加成功");
}
else {
System.out.println("添加失败");
}
}
catch(Exception e2) {
e2.printStackTrace();
}
finally {
try {
ct.close();
ps.close();
}
catch (Exception e2) {
e2.printStackTrace();
}
}
this.dispose();
}
else if(e.getSource() == jb2) {
dispose();
}
}
}
public class Table_Update extends JDialog implements ActionListener {
//定义我需要的swing组件
JLabel jl1, jl2,jl3, jl4, jl5 ,jl6;
JButton jb1,jb2;
JTextField jtf1,jtf2,jtf3,jtf4,jtf5,jtf6;
JPanel jp1,jp2,jp3;
//将table对象作为变量传过来
Table_Model tm = new Table_Model();
//构造函数 Frame代表父窗口口,title代表窗口的名字,model指定是模式窗口,还是非模式的窗口,rownum代表行号
public Table_Update(Frame owner,String title,boolean model,int rownum) {
super(owner,title, model);
jl1=new JLabel("学号");
jl2=new JLabel("姓名");
jl3=new JLabel("系别");
jl4=new JLabel("性别");
jl5=new JLabel("年龄");
jtf1=new JTextField();
jtf2=new JTextField();
jtf3=new JTextField();
jtf4=new JTextField();
jtf5=new JTextField();
//初始化数据
jtf1.setText((String)tm.getValueAt(rownum,0).toString());
//setEditable设置指定的 boolean 变量,以指示此 文本控件 是否应该为可编辑的
jtf1.setEditable(false);
//jtf1.setText((String)tm.getValueAt(rownum,0));
jtf2.setText((String)tm.getValueAt(rownum,1));
jtf3.setText((String)tm.getValueAt(rownum,2));
jtf4.setText((String)tm.getValueAt(rownum,3));
jtf5.setText((String)tm.getValueAt(rownum,4));
jb1=new JButton ("修改");
jb2=new JButton ("取消");
jp1=new JPanel();
jp2=new JPanel();
jp3=new JPanel();
//设置布局
jp1.setLayout(new GridLayout(5,1));
jp2.setLayout(new GridLayout(5,1));
//添加组件
jp1.add(jl1);
jp1.add(jl2);
jp1.add(jl3);
jp1.add(jl4);
jp1.add(jl5);
jp2.add(jtf1);
jp2.add(jtf2);
jp2.add(jtf3);
jp2.add(jtf4);
jp2.add(jtf5);
jp3.add(jb1);
jp3.add(jb2);
this.add(jp1,BorderLayout.WEST);
this.add(jp2,BorderLayout.CENTER);
this.add(jp3,BorderLayout.SOUTH);
//注册监听
jb1.addActionListener(this);
jb2.addActionListener(this);
//展现
this.setSize(300,200);
this.setLocationRelativeTo(null);
this.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
if(e.getSource()==jb1){
//连接数据库所需变量
Connection ct = null;
Statement stm = null;
PreparedStatement ps = null;
try {
Class.forName("com.mysql.jdbc.Driver");
ct = DriverManager.getConnection("jdbc:mysql://localhost:3306/student","root", "123");
//传入SQL语句
ps=ct.prepareStatement("update stu set Name=?,deparment=?,sex=?,age=? where id = ?;");
//获取数据在文本框中显示
ps.setString(1, this.jtf2.getText());
ps.setString(2, this.jtf3.getText());
ps.setString(3, this.jtf4.getText());
ps.setString(4, this.jtf5.getText());
ps.setString(5, this.jtf1.getText());
ps.executeUpdate();
int i=ps.executeUpdate();
if(i==1){
System.out.println("修改成功");
}
else{
System.out.print("修改失败");
}
}
catch(Exception e3) {
e3.printStackTrace();
}
finally {
try {
ps.close();
ct.close();
}
catch (SQLException e4) {
e4.printStackTrace();
}
}
this.dispose();
}
else if(e.getSource() == jb2)
{
dispose();
}
}
这个类跟修改一模一样,只是在新的窗口的文本框上提前写好内容,并且可以修改。
数据库部分:
最后呢,我学Java也就个把月,感觉大学就在颓废,这个系统我花了三晚,边看视频边写,不听上网百度各个函数的用法等,就希望大家学习编程语言要脚踏实地,一步一个脚印,编程的路上很快乐,要坚持下去,时间长了,你就能将自己学的知识为自己所用。累了,就来杯95年的Java。最后将所有代码放在这链接点击打开链接密码:yw7z ,供参考。像我这种渣渣,就不往GitHub上传了。
~end