2021 年 7 月 31 日早 8 点左右
1、创建好数据库中对应表的实体类(student、teacher、subject、class_room、sel_subject)如:
2、连接数据库
- IDEA:文件—项目结构—库—加号+—java—选择对应下载位置的文件驱动—添加—一直 next
3、登录界面
- 通过调用 stuDao【连接数据库的类和查询用户名密码方法】的方法从数据库中查询出用户信息,再比对密码
(1)专门用户密码登录
(2)不同用户名和密码登录
-
登录成功后弹出,另一个界面:
-
只需在登录成功语句后,加一个新界面
new MyFrame("学生信息管理系统",100,100,400,400);
-
密码不可见性:使用【密码框】 JPasswordField t2;
输入的是一串符号
@Override public void actionPerformed(ActionEvent e) { JButton b = (JButton)e.getSource(); if(b.equals(b2)){ this.setNull(); }else if(b.equals(b1)){ // 通过调用 stuDao 的方法从数据库充查询出用户信息,再比对密码 StuDao stuDao = new StuDao(); Student student = stuDao.findByName(t1.getText()); if(student!=null&&student.getPassword().equals(t2.getText())){ JOptionPane.showMessageDialog(this, "登录成功!!"); this.setVisible(false); new MyFrame("学生信息管理系统",100,100,400,400); }else{ JOptionPane.showMessageDialog(this, "用户名或密码错误,请重新输入!"); } } }4、编辑主界面
-
采用菜单项,多面板切换显示
public class MyFrame extends JFrame implements ActionListener {
JMenuBar bar;
JMenu menu1;
JMenuItem add;
Panel contentPanel;
public MyFrame(String title,int x,int y,int width,int height)
{
bar=new JMenuBar();
//1、添加记录菜单项
menu1=new JMenu("添加记录");
bar.add(menu1);
add=new JMenuItem("学生");
menu1.add(add);
contentPanel=new Panel();
//菜单项添加事件监听器
add.addActionListener(this);
//设置窗口属性
this.setJMenuBar(bar);
this.setContentPane(new JLabel());
this.setTitle(title);
this.setBounds(x, y, width, height);
this.setVisible(true); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
@Override
public void actionPerformed(ActionEvent e) {
Object obj=e.getSource();
if(obj==add){
changeContentPane(new AddPanel());
}else if(obj==delete1){
changeContentPane(new DeletePanel());
}
}
//切换内容面板
public void changeContentPane(Container contentPane){
this.setContentPane(contentPane);
this.revalidate();
}
-
然后分别创每个菜单项的面板类,不断运行,调整每个文本框的位置
-
注意细节:按钮添加监视器
实例化每个平面
角标正确
2021 年 8 月 1 日 10 点左右
1、报错:Local variable 'stu' is redundant
局部变量是多余的
stu = new Student(number,name,sex,password,score);
return stu;
///////////////////////////
return new Student(number,name,sex,password,score);
```
2、打开多个模板
右上角设置—项目结构—加号—新建、导入—确定
3、IDEA 重启
文件——清除缓存——重启
4、IDEA 项目重构
菜单栏下面的榔头形状的绿色 构建项目
5、在主面板中弹出另一个界面
在多面板中,添加一个按钮、然后
浏览——点击浏览信息——确定
```java
@Override
public void actionPerformed(ActionEvent e) {
JButton b = (JButton)e.getSource();
if(b.equals(b1)){ JOptionPane.showMessageDialog(this, "请先添加你需要浏览的内容!!");//点击确定
new Sframe("浏览",400,400,500,500);
}
}
2021 年 8 月 2 日午 9 点多
1、显式类型参数 Student 可以替换为 <>
List list;
list = new ArrayList();
/////////////////////////////////
List list;
list = new ArrayList<>();
2、删除功能
使用方法要先实例出该方法的对象
dao=new StuDao();
否则 会报错 删除失败
3、Statement 中的三个 executeXXX()方法
- executeQuery: 只能执行 select 语句
- executeUpdate: 可以执行 insert、delete 和 update 语句,但不能执行 select
- execute:增删改查的 4 种(任意)语句都能执行。
4、按姓名删除功能
- 按什么删除 则 where xxx=?
- 在窗口一个界面中按学号(姓名)删除的按钮,分开定义各方法(即使一样的方法,改个名字)
//按姓名删除
public boolean delete2(String name)
{
boolean flag = false;
con = getCon();
try {
pst = con.prepareStatement("delete from student where name=?");
pst.setString(1, name);//按什么则定义什么
pst.execute();
flag = true;
pst.close();
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
return flag;
}
@Override
public void actionPerformed(ActionEvent e) {
if(b==b3){
dao=new StuDao();
String name = t2.getText();
if(dao.delete2(name)) {
JOptionPane.showMessageDialog(this, "恭喜你删除成功!!");
}else{
JOptionPane.showMessageDialog(this, "删除失败!!!");
}
this.setNull1();
}
}
5、添加功能
-
报错:Column count doesn't match value count at row 1
列不匹配
要先看报错,而不是在错的那一行,自己盲目改错
-
报错:Can not issue data manipulation statements with executeQuery()
不能发出数据操纵语句与 executeQuery()
- executeQuery: 只能执行 select 语句
- executeUpdate: 可以执行 insert、delete 和 update 语句,但不能执行 select
- execute:增删改查的 4 种(任意)语句都能执行。
-
添加部分数据
//3、创建预处理语句对象 pst = con.prepareStatement("insert into student values(null,?,?,?,?,null)"); //没有添加的数据用 null 表示 pst.setInt(1, number); pst.setString(2, name); pst.setInt(3, sex); pst.setDouble(4, score); //这些 1、2、3、4 对应的是?在第几个的位置6、statement 和 prepareStatement 的区别
-
JDBC 驱动会发送一个网络请求到数据解析和优化这个查询,而执行时会产生另一个网络请求,在 JDBC 驱动中,减少网络通讯是最终的目的.
-
访问数据库的速度:
prepareStatement 会先初始化 SQL,先把这个 SQL 提交到数据库中进行预处理,多次使用可提高效率。
createStatement 不会初始化,没有预处理,每次都是从 0 开始执行 -
SQL 对于只执行一次的 SQL 语句选择 Statement 是最好的。
-
相反, 如果 SQL 语句被多次执行选用 PreparedStatement 是最好的。
-
PreparedStatement 的第一次执行消耗是很高的, 它的性能体现在后面的重复执行,使用 PreparedStatement 的方式来执行一个针对数据库表的查询。
-
如果程序在运行期间只需要一次请求, 那么就使用 Statement. 对于 Statement, 同一个查询只会产生一次网络到数据库的通讯.
7、按学号查询
public Student findById(int id)
{
Student stu = null;
con = getCon();
try {
pst = con.prepareStatement("select * from student where number=?");
pst.setInt(1, id);
rs= pst.executeQuery();
if(rs.next())
{//2、3、4、5 是数据库中列的位置
int number = rs.getInt(2);
String name = rs.getString(3);
int sex = rs.getInt(4);
int score=rs.getInt(5);
stu = new Student(number,name,sex,score);
}
}catch (SQLException e) {
e.printStackTrace();
}
return stu;
}
8、更新功能
-
先添加一个查找按钮在更新界面里面、查找出来之后再修改数据点击更新
pst = con.prepareStatement("update student set name=?,sex=?,score=? number=?"); pst.setString(1, stu.getName()); pst.setInt(2, stu.getSex()); pst.setInt(3,stu.getScore()); pst.setInt(4, stu.getNumber()); //如果没有 where number=? 语句则数据库中数据全改为,界面上的数据了 //正确的: public boolean update(Student stu) { boolean flag = false; con = getCon(); try { //注意问号和 1/2/3/4 数据要对应、否则会混乱数据 pst = con.prepareStatement("update student set name=?,sex=?,score=? where number=?"); pst.setString(1, stu.getName()); pst.setInt(2, stu.getSex()); pst.setInt(3,stu.getScore()); pst.setInt(4, stu.getNumber()); pst.executeUpdate(); flag = true; } catch (SQLException e) { e.printStackTrace(); } return flag; }9、选课功能
-
定义一个添加到数据库 student 表中课程的选择按钮(字为选择,实则赋予添加功能),和一个选课完之后的查询显示功能
-
报错:Column 'id' cannot be null
主键 id 要设置为自动递增【Default——AUTO_INCREMENT】否则添加不进去
-
赋予按钮功能时,要注意按钮角标正确。
10、登录的三个组件
- JTextField【文本框】:用于输出文本、是明文。
- JPasswordField 【密码框】:用于输入密码,输入的是一串符号
- JLabel:用于显示一串字符。(文本框和密码框的字就是标签)
10、注册界面
- 增加注册功能:添加功能:添加用户名和密码到数据库中
- 在注册界面时:删去此行代码,然后注册完之后,点击右上角叉叉×,返回开始界面,进行登录。
- this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- this.setUndecorated(true); 【设置窗口不可移动,无顶部标题等装饰】
- this.setLocationRelativeTo(null); 【屏幕正中央】
8 月 4 日午 11 点左右
1、变量命名规范
首单词字母小写,后面每一个单词首字母大小、驼峰原则,知晓其意
2、 改为数据表界面
public class MyTableByTeacher extends JFrame implements ActionListener {
JTable jTable;
public MyTableByTeacher() throws SQLException, ClassNotFoundException {
StuDao stuDao = new StuDao();
String arr[] = {"学号", "名字", "性别", "成绩", "专业"};
String comm[][] = stuDao.getStudentList();
//以 comm 和 arr 为参数,创建一个表格
dtm = new DefaultTableModel(comm, arr);
jTable = new JTable(dtm);
//设置此表视图的首选大小
jTable.setPreferredScrollableViewportSize(new Dimension(600, 150));
//将表格加入到滚动条组件中
scrollPane = new JScrollPane(jTable);
this.add(scrollPane, BorderLayout.CENTER);
jTable.getTableHeader().setReorderingAllowed(false);//列不能移动
jTable.getTableHeader().setResizingAllowed(false);//不可拉动表格
// jTable.setEnabled(false);//表格不可更改数据
this.setTitle("数据表");
this.setVisible(true);//设置窗体可见
this.validate();//设置组件可见
this.pack();//自动调整组建大小使每个组件都能显示
this.setBounds(200, 200, 600, 260);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
3、动态刷新功能
StuDao 类中:
//刷新
public void changTable(DefaultTableModel dtm) {
String[][] comm = getGoodsList("", "");
int index = dtm.getRowCount();
while (index != 1) {
try {
dtm.removeRow(0);
index = dtm.getRowCount();
} catch (RuntimeException e) {
e.printStackTrace();
}
}
for (int i = 0; i < comm.length; i++) {
dtm.addRow(comm[i]);
}
dtm.removeRow(0);
dtm.fireTableDataChanged();
}
public String[][] getStudentList(){
con = getCon();
try {
pst = con.prepareStatement("select * from student ");
rs = pst.executeQuery();
rs.last();int row = rs.getRow();//获取记录的总条数
rs.beforeFirst();//游标回到第一个记录前的位置
String comm[][] = new String[row][5];//row 行、5 列
rs.next();//游标回到第一个记录的位置
for (int i = 0; i < row; i++) {
comm[i][0] = rs.getString("number");
comm[i][1] = rs.getString("name");
comm[i][2] = rs.getString("sex");
comm[i][3] = rs.getString("score");
comm[i][4] = rs.getString("profession");
rs.next();
}
rs.close();
return comm;
} catch (SQLException e) {
e.printStackTrace();
try {
pst.close();
con.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
return null;
}
4、销毁窗口
dispose();
5、老师身份的数据表新增功能:
数据学号唯一性?/?/【该学号已经存在,弹出对话框,判断新增学号是否存在事件???】("因为我在第一个文本框右边加入了一个标签,因此,如果编号已经存在,那么就会出现一个红×不可以注册,绿色√代表可以注册."??)
JButton b = (JButton)e.getSource();
// 添加
if (b== keep) {
dao=new StuDao();
Student stu=this.getStu();
if (dao.addStudent(stu)) {
JOptionPane.showMessageDialog(this, "恭喜你添加成功!!");
StuDao stuDao = new StuDao();
stuDao.changTable(dtm);
// 销毁窗口、就可以销毁上一个窗口
dispose();
}
6、老师身份的数据表修改功能
public class MyTableByTeacher extends JFrame implements ActionListener {
JTable jTable;
public MyTableByTeacher() throws SQLException, ClassNotFoundException {
// 监听表格中修改变化
jTable.getModel().addTableModelListener(new TableModelListener() {
@Override
public void tableChanged(TableModelEvent e) {
// 获取到修改的第几列
int col = e.getColumn();
//获取到修改的第几行
int row = e.getFirstRow();
Student stu = new Student();
String number = (String) dtm.getValueAt(row, 0);
stu.setNumber(Integer.parseInt(number));
String name = (String) dtm.getValueAt(row, 1);
stu.setName(name);
String sex = (String) dtm.getValueAt(row, 2);
stu.setSex(Integer.parseInt(sex));
String score = (String) dtm.getValueAt(row, 3);
stu.setScore(Integer.parseInt(score));
String profession = (String) dtm.getValueAt(row, 4);
stu.setProfession(profession);
stuDao.update(stu);
}
});
}
///////////////////////////////////////////////////////
@Override
public void actionPerformed(ActionEvent e) {
JButton b = (JButton) e.getSource();
if (b == update) {
UpdateFrame updateFrame = new UpdateFrame("更新", 500, 500, 320, 260);
updateFrame.setDtm(dtm);
int row = jTable.getSelectedRow();
if (row != -1) {
String number = (String) dtm.getValueAt(row, 0);
updateFrame.number.setText(number);
updateFrame.name.setText((String) dtm.getValueAt(row, 1));
updateFrame.sex.setText((String) dtm.getValueAt(row, 2));
updateFrame.score.setText((String) dtm.getValueAt(row, 3));
updateFrame.profession.setText((String) dtm.getValueAt(row, 4));
}
}
}
7、老师身份的数据表删除功能
if (b == delete) {
int row = jTable.getSelectedRow();
if (row != -1) {
String number = (String) dtm.getValueAt(row, 0);
StuDao stuDao = new StuDao(); stuDao.deleteByNumber(Integer.parseInt(number));
stuDao.changTable(dtm);
System.out.println(number);
}
}
8、 学生身份选课下拉列表
public class underChoose extends Panel implements ActionListener{
JLabel chooseSubject;
JComboBox underSubject;
JButton choose;
JPanel p1;
public underChoose(){
chooseSubject =new JLabel("选择课程");
underSubject =new JComboBox();
underSubject.addActionListener(this);
choose =new JButton("选择");
choose.addActionListener(this);
String List1[]={"计算机","音乐","美术"};
for (int i = 0; i < 3; i++) {
underSubject.addItem(List1[i]);
}
p1 =new JPanel();
p1.add(chooseSubject);
p1.add(underSubject);
this.add(p1,BorderLayout.CENTER);
this.setLayout(new FlowLayout());
this.setVisible(true);
}
//////////////////////////
public SelSubject getSel() {
SelSubject sel=new SelSubject(); underSubject.getSelectedItem());
return sel;
}
//////////////////////////////////
@Override
public void actionPerformed(ActionEvent e) {
if(underSubject.getSelectedItem()=="计算机"&&e.getSource()== choose||underSubject.getSelectedItem()=="音乐"&&e.getSource()== choose||underSubject.getSelectedItem()=="美术"&&e.getSource()== choose){
dao = new SelSubDao();
SelSubject sel = this.getSel();
if(dao.addSelSubject(sel)){ JOptionPane.showMessageDialog(this, "选择成功!!");
}else{ JOptionPane.showMessageDialog(this, "输入格式错误,请重新输入!");}
}
}


