MVC就是把代码按照不同的用放到不同包里,即分类归放。
m -- model | 数据模型层(实体类) |
v -- view | 视图层(和用户的交互视图) |
c -- controller | 控制层(业务逻辑) |
在一个java工程里面创建四个包,并导入驱动包。
controller包下包括StudentController.java和UserController.java。
package controller;
import java.sql.ResultSet;
import java.sql.SQLException;
import tools.JDBCTool;
public class StudentController {
//查找所有学生,返回二维数组,包括多行多列
public static String[][] selectStudents() {
//查询有多少条数据,返回的只是一个int类型数据
try {
//自定义函数查询接收数据条数
int length = getCounts();
//创建二维数组接收所有学生数据,包括多位学生的多条信息
String[][] students = new String[length][5];
String sql = "select * from student";
ResultSet set1 = JDBCTool.select(sql);
for(int i=0;i<length;i++){
//每完成一次循环都要移动到下一行
set1.next();
//getString()可以获取任何类型的数据
students[i][0]=set1.getString("Sid");
students[i][1]=set1.getString("Sname");
students[i][2]=set1.getString("Sage");
students[i][3]=set1.getString("Ssex");
students[i][4]=set1.getString("Szhuanye");
}
return students; //返回二维数组
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
JDBCTool.close(); //一定要关闭资源
}
return null;
}
//查询有多少条数据
public static int getCounts(){
String sql="select count(*) from student";
ResultSet set1 = JDBCTool.select(sql);
try {
set1.next();
return set1.getInt(1);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
JDBCTool.close();
}
return 0;
}
}
package controller;
import java.sql.ResultSet;
import java.sql.SQLException;
import model.User;
import tools.JDBCTool;
//做数据库查询
public class UserController {
//返回User对象,即可得到所有信息
public static User login(User user) {
//获取sql语句
String sql="select * from users where Username=? and Passwords=?";
ResultSet set = JDBCTool.select(sql,user.getUserName(),user.getPassword());
try {
if(set.next()) {
return new User(set.getInt("Uid"), set.getString("Uname"), set.getString("Username"), set.getString("Passwords"));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
JDBCTool.close();
}
return null;
}
}
建表
在model包下创建User类
利用系统自动构造函数
Getters和Setters方法
警告
点击Add unimplemented methods后会自定实现接口方法,此时方法上方出现@Override注解,这是一个标识注解,表示当前方法覆盖了父类的方法。
抛出异常
在类方法名括号后面会自动加上throws SQLException,但是最好不要轻易抛出异常。因为后续程序使用该类方法时也会要求抛出异常。
package model;
public class User {
private int id;
private String name;
private String userName;
private String password;
public User(int id, String name, String userName, String password) {
super();
this.id = id;
this.name = name;
this.userName = userName;
this.password = password;
}
public User(String userName, String password) {
super();
this.userName = userName;
this.password = password;
}
public User() {
super();
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
tool包直接使用之前的程序JDBCTool.java和JDBCTest.java。
view包下包括IndexView.java、LoginView.java、MainView.java、MyLabel.java。
package view;
/**
* 主界面
* @author 86171
*
*/
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.table.JTableHeader;
import controller.StudentController;
public class IndexView extends JFrame{
private MyLabel label;
private JButton changePassword;
private JButton exitLogin;
private JTabbedPane tabbed; //选项卡容器
private JTable table; //表格
private JTableHeader header; //表头
private JFrame i; //框架(容器)当前的界面
public IndexView(){
i = this;
this.setTitle("学生管理系统");
this.setLayout(null);//空布局
this.setSize(800, 750);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
label = new MyLabel("管理员:admin");
label.setBounds(150, 50, 100, 30);
this.add(label);
changePassword=new JButton("修改密码");
changePassword.setBounds(290, 50, 100, 30);
this.add(changePassword);
exitLogin = new JButton("退出登录");
exitLogin.setBounds(420, 50, 100, 30);
exitLogin.addActionListener(new ActionListener() {
@Override
/* @Override注解是一个标识注解
* 表示当前方法覆盖了父类的方法
*/
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
//让当前窗体不可见,从而实现界面跳转
i.setVisible(false);
//重新又new一个登录窗体
@SuppressWarnings("unused")
LoginView login = new LoginView();
}
});
this.add(exitLogin);
tabbed=new JTabbedPane(JTabbedPane.TOP);
//设置选项卡的坐标,将其设置在头部
tabbed.setBounds(0, 100, 800, 650);
//加入面板容器JPanel
JPanel panel1=new JPanel();
//给面板设置布局
panel1.setLayout(new FlowLayout());
JLabel labe = new JLabel("abc");
panel1.add(labe);
JPanel panel2=new JPanel();
panel2.setLayout(new FlowLayout());
JLabel labe1=new JLabel("123");
panel2.add(labe1);
JPanel panel3=new JPanel();
JPanel panel4=new JPanel();
//加入选项卡,第一个是名字,第二个是对象
tabbed.add("班级管理", panel1);
tabbed.add("教师管理", panel2);
tabbed.add("班主任管理",panel3);
tabbed.add("学生管理", panel4);
//空布局,加入的组件必须设置大小和位置
panel4.setLayout(null);
//设置表头,全为字符串类型
String []titles={"学号","姓名","年龄","性别","专业"};
//设置表数据,为二维数组。调用自定义的类方法,到数据库中查询所有学生
String[][] data = StudentController.selectStudents();
table = new JTable(data,titles); //数据在前,表头在后
table.setBounds(0, 30, 800, 620);
header = table.getTableHeader(); //利用表格的类方法获取表头
header.setBounds(0, 0, 800, 30);
//将表格和表头加入到面板4中
panel4.add(header); //先加表头
panel4.add(table); //再加表格
this.add(tabbed); //自带边框
this.setVisible(true); //让窗体可见
}
}
package view;
/**
* 登录界面
* @author 86171
*
*/
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import controller.UserController;
import model.User;
public class LoginView extends JFrame{
private static final long serialVersionUID = 1L;
private JLabel label;
private MyLabel userNameLabel; //账号
private MyLabel passwordLabel; //密码
private JTextField userName; //用户名输入框
private JTextField password; //密码输入框
private JButton login; //登录按钮
private JButton exit; //退出按钮
private JFrame i; //框架(容器)
public LoginView(){
i = this;
this.setTitle("登录");
this.setLayout(null);
//空布局,放置组件时必须设置位置和大小
this.setSize(450, 350);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//在关闭窗体的时候自动结束程序
label = new JLabel("欢迎进入学生管理系统");
label.setBounds(70,40,300,30);
//依次设置x轴、y轴、宽度、高度
label.setFont(new Font("黑体", 30, 30));
//依次设置字体、粗细、大小
this.add(label);
userNameLabel = new MyLabel("账号:");
userNameLabel.setBounds(75, 90, 50, 30);
this.add(userNameLabel);
passwordLabel = new MyLabel("密码:");
passwordLabel.setBounds(75, 140, 50, 30);
this.add(passwordLabel);
userName = new JTextField();
userName.setBounds(125, 90, 230, 30);
this.add(userName);
password = new JTextField();
password.setBounds(125, 140, 230, 30);
this.add(password);
login = new JButton("登录");
login.setBounds(135, 190, 70, 30);
//获取登录界面的账号和密码
login.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
//将用户名和密码封装成对象,到时候方便做数据传递
String user = userName.getText();
String pwd = password.getText();
//用户登录
User u = new User(user, pwd);
//到数据库中查询是否有该账号密码
u = UserController.login(u);
if(u!=null){
System.out.println(u.getName()+"登录成功");
//登录完成,关闭登录界面,即使登录窗体不可见
i.setVisible(false);
@SuppressWarnings("unused")
IndexView view = new IndexView();
}else{
System.out.println("登录失败");
}
}
});
this.add(login);
exit = new JButton("退出");
exit.setBounds(265, 190, 70, 30);
this.add(exit);
//让上面程序设置的窗体可见
this.setVisible(true);
}
}
package view;
/**
* 程序入口
* @author 86171
*
*/
public class MainView {
public static void main(String[] args) {
// TODO Auto-generated method stub
@SuppressWarnings("unused")
LoginView login=new LoginView();
}
}
package view;
import java.awt.Font;
import javax.swing.JLabel;
public class MyLabel extends JLabel{
private static final long serialVersionUID = 1L;
public MyLabel(String text){
super(text); //调用父类的带参构造
this.setFont(new Font("黑体", Font.PLAIN,16));
}
}
展示效果
登录界面
主界面(包括选项卡)