一、实验内容和目的
该项目主要实现的是为用户提供一个友好的交互界面,并对学生信息管理系统的增删改查。用到的开发工具有java-IDEA和SQL-service。在数据库软件里建立一张表,通过java语言来操作表里的内容。
(1)设计一个简单的学生信息管理的程序,教学管理人员能够使用该程序对学生基本信息、课程信息进行管理,包括数据的添加、修改删除和浏览;能够对学生选课进行管理,包括添加学生选课信息、录入成绩;能使用查询功能,快速查看到指定学生的选课信息;能够对学生选课情况进行简单的统计,包括所选的总的课程数、总学分数及平均成绩。
(2)在添加学生基本信息、课程基本信息相关数据时,学号和课程号不能重复;在添加学生选课信息时,要求该学生和课程必须是存在的,而且不能添加重复的选课信息。
(3)应用程序提供操作界面,可以方便用户进行功能选择,实现 信息的管理和查询,并可以清晰地显示相关信息
二、语言、数据结构、算法
java swing mySQL
三、平台
eclipse mysql
四、源代码
AdminDo类
public class AdminDo {
private Integer id;
private String userName;
private String pwd;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
AdminService类
public interface AdminService {
boolean validataAdmin(AdminDo adminDo);
}
AdminServiceImpl类
public boolean validataAdmin(AdminDo adminDo) {
String sql = "select pwd from manager where user_name=?";
Connection conn = null;
PreparedStatement ps = null;
ResultSet resultSet=null;
try {
conn = DBUtil.getConn();
if (conn==null){
return false;
}
ps = conn.prepareStatement(sql);
ps.setString(1, adminDo.getUserName());
resultSet = ps.executeQuery();
while (resultSet.next()) {
String pwd = resultSet.getString(1);
if (adminDo.getPwd().equals(pwd)) {
return true;
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBUtil.closeRs(resultSet);
DBUtil.closeConn(conn);
DBUtil.closePs(ps);
}
return false;
}
}
App类
public class App {
public static void main(String[] args) {
new LoginView();
}
}
DBUtil类
import java.sql.*;
public class DBUtil {
private static final String URL="jdbc:mysql://localhost:3306/student?serverTimezone=Asia/Shanghai";
private static final String DRIVER="com.mysql.cj.jdbc.Driver";
private static final String USER_NAME="root";
private static final String PWD="010620";
Connection conn = null; // 连接
static {
try {
//com.mysql.jdbc.Driver 静态代码块
Class.forName(DRIVER);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection getConn(){
try {
return DriverManager.getConnection(URL,USER_NAME,PWD);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
//获取数据库连接
public static void closeConn(Connection connection){
if (connection!=null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void closePs(PreparedStatement ps){
if (ps!=null){
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void closeRs(ResultSet rs){
if (rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
DimensionUtil类
import javax.swing.*;
import java.awt.*;
public class DimensionUtil {
public static Rectangle getBounds(){
Dimension soreenSize=Toolkit.getDefaultToolkit().getScreenSize();
//保证主界面不会覆盖电脑任务栏
Insets screenInsets =Toolkit.getDefaultToolkit().getScreenInsets(new Jframe().getGraphicsConfiguration());
Rectangle rectangle= new Rectangle(screenInsets.left,screenInsets.top,soreenSize.width-screenInsets.left-screenInsets.right,
soreenSize.height-screenInsets.top-screenInsets.bottom);
return rectangle;
}
}
JtableDemo类
import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
import java.util.Vector;
public class JtableDemo extends Jframe {
public JtableDemo(){
super("测试jtable");
Vector
Vector
Vector
Vector
data.addElement(rowVector1);
data.addElement(rowVector2);
data.addElement(rowVector3);
//tablemodel和jtable关联后,只需要更新model就能把数据的变化反应到jtable中
StudentTableModel studentTableModel=StudentTableModel.assembleModel(data);
//jtable和table关联
JTable jTable=new JTable(studentTableModel);
//设置表头
JTableHeader tableHeader=jTable.getTableHeader();
tableHeader.setFont(new Font(null,Font.BOLD,16));
tableHeader.setForeground(Color.RED);
//设置表格体
jTable.setFont(new Font(null,Font.PLAIN,14));
jTable.setForeground(Color.BLACK);
jTable.setGridColor(Color.BLACK);
jTable.setRowHeight(30);
//设置多行选择
jTable.getSelectionModel().setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
//设置表格列的渲染方式
Vector
StudentCellRender render=new StudentCellRender();
for (int i = 0; i < columns.size(); i++) {
TableColumn column =jTable.getColumn(columns.get(i));
column.setCellRenderer(render);
if (i==0){
column.setPreferredWidth(50);
column.setMaxWidth(50);
column.setResizable(false);
}
}
Container contentPan =getContentPane();
//jtable放在jpanel上的话,默认是不展示列头的,需要特殊设置,放在jScrollPane上面
//默认是展示列头的
JScrollPane jScrollPane=new JScrollPane(jTable);
contentPan.add(jScrollPane);
setSize(600,400);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setResizable(false);
setVisible(true);
}
public static void main(String[] args) {
new JtableDemo();
}
}
class StudentCellRender extends DefaultTableCellRenderer{
//在每一行的每一列显示之前都会调用,隔行换色,居中
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
if (row%2==0){
setBackground(Color.LIGHT_GRAY);
}else {
setBackground(Color.WHITE);
}
setHorizontalAlignment(DefaultTableCellRenderer.CENTER);
return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
}
}
//自定义tablemodel
class StudentTableModel extends DefaultTableModel{
static Vector
static {
columns.addElement("学号");
columns.addElement("姓名");
columns.addElement("学院");
columns.addElement("专业");
columns.addElement("班级");
}
private StudentTableModel(){
super(null,columns);
}
private static StudentTableModel studentTableModel=new StudentTableModel();
public static StudentTableModel assembleModel(Vector
studentTableModel.setDataVector(data,columns);
return studentTableModel;
}
public static Vector
return columns;
}
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
}
LoginHandler类
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JButton;
import javax.swing.JOptionPane;
public class LoginHandler extends KeyAdapter implements ActionListener {
private final LoginView loginView;
public LoginHandler(LoginView loginView){
this.loginView=loginView;
}
@Override
public void actionPerformed(ActionEvent e) {
JButton jButton=(JButton) e.getSource();
String text=jButton.getText();
if ("重置".equals(text)){
loginView.getUserTxt().setText("");
loginView.getPwdField().setText("");
}else if ("登录".equals(text)){
extracted();
}
}
private void extracted() {
String user= loginView.getUserTxt().getText();
char[] chars=loginView.getPwdField().getPassword();
if (user==null||"".equals(user.trim())||chars==null){
JOptionPane.showMessageDialog(loginView,"用户名密码必填");
return;
}
String pwd=new String(chars);
System.out.println(user+":"+pwd);
//查询db,当数据库里也有相应的用户名和密码时才能登陆
AdminService adminService=new AdminServiceImpl();
AdminDo adminDo=new AdminDo();
adminDo.setUserName(user);
adminDo.setPwd(pwd);
boolean flag=adminService.validataAdmin(adminDo);
//boolean flag=true;
//跳转到主界面并销毁登录界面
new MainView();
loginView.dispose();
}
@Override
public void keyPressed(KeyEvent e) {
if (KeyEvent.VK_ENTER==e.getKeyCode()){
extracted();
}
}
}
LoginView类
import javax.swing.*;
import java.awt.*;
import java.net.URL;
public class LoginView extends Jframe {
JLabel nameLabel=new JLabel("学生信息管理系统",JLabel.CENTER);
SpringLayout springLayout=new SpringLayout();
JPanel centerPanel=new JPanel(springLayout);
JLabel userNameLabel=new JLabel("用户名:");
JTextField userTxt=new JTextField();
JLabel pwdLabel=new JLabel("密码:");
JPasswordField pwdField=new JPasswordField();
JButton loginBtn=new JButton("登录");
JButton resetBtn=new JButton("重置");
SystemTray systemTray;
TrayIcon trayIcon;
LoginHandler loginHandler;
public LoginView(){
super("学生管理系统");
loginHandler=new LoginHandler(this);
Container contentPan=getContentPane();
nameLabel.setFont(new Font("宋体",Font.PLAIN,30));
nameLabel.setPreferredSize(new Dimension(0,80));
Font centerFont=new Font("楷体",Font.PLAIN,20);
userNameLabel.setFont(centerFont);
userTxt.setPreferredSize(new Dimension(200,30));
pwdLabel.setFont(centerFont);
pwdField.setPreferredSize(new Dimension(200,30));
loginBtn.setFont(centerFont);
resetBtn.setFont(centerFont);
//把组件加到面板
centerPanel.add(userNameLabel);
centerPanel.add(userTxt);
centerPanel.add(pwdLabel);
centerPanel.add(pwdField);
loginBtn.addActionListener(loginHandler);
//增加按键事件,回车可登录
loginBtn.addKeyListener(loginHandler);
centerPanel.add(loginBtn);
resetBtn.addActionListener(loginHandler);
centerPanel.add(resetBtn);
//弹簧布局
extracted();
contentPan.add(nameLabel,BorderLayout.NORTH);
contentPan.add(centerPanel,BorderLayout.CENTER);
//设置loginBtn为默认按钮
getRootPane().setDefaultButton(loginBtn);
//图片
//自定义图标
setSize(600,400);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setResizable(false);
setVisible(true);
}
private void extracted() {
//布局userNameLabel
Spring childwidth=Spring.sum(Spring.sum(Spring.width(userNameLabel),Spring.width(userTxt)),Spring.constant(20));
int offsetX=childwidth.getValue()/2;
springLayout.putConstraint(SpringLayout.WEST,userNameLabel,-offsetX,
SpringLayout.HORIZONTAL_CENTER,centerPanel);
springLayout.putConstraint(SpringLayout.NORTH,userNameLabel,20,SpringLayout.NORTH,centerPanel);
//userTxt
springLayout.putConstraint(SpringLayout.WEST,userTxt,20,SpringLayout.EAST,userNameLabel);
springLayout.putConstraint(SpringLayout.NORTH,userTxt,0,SpringLayout.NORTH,userNameLabel);
//pwdLabel
springLayout.putConstraint(SpringLayout.EAST,pwdLabel,0,SpringLayout.EAST,userNameLabel);
springLayout.putConstraint(SpringLayout.NORTH,pwdLabel,20,SpringLayout.SOUTH,userNameLabel);
//pwdField
springLayout.putConstraint(SpringLayout.WEST,pwdField,20,SpringLayout.EAST,pwdLabel);
springLayout.putConstraint(SpringLayout.NORTH,pwdField,0,SpringLayout.NORTH,pwdLabel);
//loginBtn
springLayout.putConstraint(SpringLayout.WEST,loginBtn,50,SpringLayout.WEST,pwdLabel);
springLayout.putConstraint(SpringLayout.NORTH,loginBtn,20,SpringLayout.SOUTH,pwdLabel);
//resetBtn
springLayout.putConstraint(SpringLayout.WEST,resetBtn,120,SpringLayout.WEST,loginBtn);
springLayout.putConstraint(SpringLayout.NORTH,resetBtn,0,SpringLayout.NORTH,loginBtn);
}
public static void main(String[] args) {
new LoginView();
}
public JTextField getUserTxt() {//文本框返回用户的信息
return userTxt;
}
public JPasswordField getPwdField() {
return pwdField;
}
}
MainView类
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.Jframe;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
public class MainView extends Jframe {
JPanel northPanel=new JPanel(new FlowLayout(FlowLayout.LEFT));
JButton addBtn=new JButton("增加");
JButton updateBtn=new JButton("修改");
JButton delBtn=new JButton("删除");
JTextField searchTxt=new JTextField(15);
JButton searchBtn=new JButton("查询");
JPanel southPanel=new JPanel(new FlowLayout(FlowLayout.RIGHT));
JButton perBtn=new JButton("上一页");
JButton nextBtn=new JButton("下一页");
MainViewTable mainViewTable=new MainViewTable();
private int pageNow=1;//当前是第几页
private int pageSize=10;//一页显示多少条记录
MainviewHandler mainviewHandler;
public MainView (){
super("学生信息管理系统主界面");
Container contentPane = getContentPane();
mainviewHandler =new MainviewHandler(this);
//放置在北边的组件
extracted(contentPane);
//设置中间的jtable
extracted2(contentPane);
//放置在南边的组件
extracted1(contentPane);
//根据屏幕大小设置界面大小
setBounds(DimensionUtil.getBounds());
//设置窗体充满整个屏幕
setExtendedState(Jframe.MAXIMIZED_BOTH);
//自定义图标
//setSize(600, 400);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setResizable(true);
setVisible(true);
}
private void extracted2(Container contentPane){
TableDTO dto =getTableDTo();
//Vector
Vector
Vector
Vector
//data.addElement(rowVector1);
//data.addElement(rowVector2);
//data.addElement(rowVector3);
MainViewTableModel mainViewTableModel=MainViewTableModel.assembleModel(dto.getData());
mainViewTable.setModel(mainViewTableModel);
mainViewTable.renderRule();
JScrollPane jScrollPane=new JScrollPane(mainViewTable);
contentPane.add(jScrollPane,BorderLayout.CENTER);
showPreNext(dto.getTotalCount());
}
private TableDTO getTableDTo(){
StudentService studentService=new StudentServiceImpl();
StudentRequest request =new StudentRequest();
request.setPageNow(pageNow);
request.setPageSize(pageSize);
request.setSearchKey(searchTxt.getText().trim());
TableDTO tableDTO=studentService.retrieveStudents(request);
return tableDTO;
}
private void extracted1(Container contentPane) {
perBtn.addActionListener(mainviewHandler);
nextBtn.addActionListener(mainviewHandler);
southPanel.add(perBtn);
southPanel.add(nextBtn);
contentPane.add(southPanel,BorderLayout.SOUTH);
}
//设置上一页下一页是否可见
private void showPreNext(int totalCount){
if(pageNow==1){
perBtn.setVisible(false);
}
else {
perBtn.setVisible(true);
}
int pageCount=0;//总共有多少页
if(totalCount%pageSize==0){
pageCount=totalCount/pageSize;
}
else{
pageCount=totalCount/pageSize+1;
}
if(pageNow==pageCount){
nextBtn.setVisible(false);
}else {
nextBtn.setVisible(true);
}
}
private void extracted(Container contentPane) {
addBtn.addActionListener(mainviewHandler);
updateBtn.addActionListener(mainviewHandler);
searchBtn.addActionListener(mainviewHandler);
delBtn.addActionListener(mainviewHandler);
northPanel.add(addBtn);
northPanel.add(updateBtn);
northPanel.add(delBtn);
northPanel.add(searchTxt);
northPanel.add(searchBtn);
contentPane.add(northPanel,BorderLayout.NORTH);
}
public static void main(String[] args) {
new MainView();
}
public void setPageNow (int pageNow){
this.pageNow=pageNow;
}
public int getPageNow(){
return pageNow;
}
public void reloadTable(){
TableDTO dto=getTableDTo();
StudentService studentService=new StudentServiceImpl();
StudentRequest request =new StudentRequest();
request.setPageNow(pageNow);
request.setPageSize(pageSize);
request.setSearchKey(searchTxt.getText().trim());
Vector
MainViewTableModel.updatebleModel(dto.getData());
mainViewTable.renderRule();//隔行变色
}
}
MainViewCellRender类
import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import java.awt.*;
public class MainViewCellRender extends DefaultTableCellRenderer {
//在每一行的每一列显示之前都会调用,隔行换色,居中
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
if (row%2==0){
setBackground(Color.LIGHT_GRAY);
}else {
setBackground(Color.WHITE);
}
setHorizontalAlignment(DefaultTableCellRenderer.CENTER);
return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
}
}
MainviewHandler类
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
public class MainviewHandler implements ActionListener {
private MainView mainView ;
public MainviewHandler(MainView mainView){
this.mainView=mainView;
}
@Override
public void actionPerformed(ActionEvent e) {
JButton jButton=(JButton) e.getSource();
String text=jButton.getText();
if ("增加".equals(text)){
}else if ("修改".equals(text)){
}else if ("删除".equals(text)){
}else if ("查询".equals(text)){
mainView.setPageNow(1);
mainView.reloadTable();
}else if ("上一页".equals(text)){
mainView.setPageNow(mainView.getPageNow()-1);
mainView.reloadTable();
}else if ("下一页".equals(text)){
mainView.setPageNow(mainView.getPageNow()+1);
mainView.reloadTable();
}
}
}
MainViewTable类
import javax.swing.*;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableColumn;
import java.awt.*;
import java.util.Vector;
public class MainViewTable extends JTable {
public MainViewTable(){
JTableHeader tableHeader=getTableHeader();
tableHeader.setFont(new Font(null,Font.BOLD,16));
tableHeader.setForeground(Color.RED);
//设置表格体
setFont(new Font(null,Font.PLAIN,14));
setForeground(Color.BLACK);
setGridColor(Color.BLACK);
setRowHeight(30);
//设置多行选择
getSelectionModel().setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
}
public void renderRule(){
//设置表格列的渲染方式
Vector
MainViewCellRender render=new MainViewCellRender();
for (int i = 0; i < columns.size(); i++) {
TableColumn column =getColumn(columns.get(i));
column.setCellRenderer(render);
if (i==0){
column.setPreferredWidth(50);
column.setMaxWidth(50);
column.setResizable(false);
}
}
}
}
MainViewTableModel类
import javax.swing.table.DefaultTableModel;
import java.util.Vector;
public class MainViewTableModel extends DefaultTableModel {
static Vector
static {
columns.addElement("学号");
columns.addElement("姓名");
columns.addElement("学院");
columns.addElement("专业");
columns.addElement("班级");
}
private MainViewTableModel(){
super(null,columns);
}
private static MainViewTableModel mainViewTableModel=new MainViewTableModel();
public static MainViewTableModel assembleModel(Vector
mainViewTableModel.setDataVector(data,columns);
return mainViewTableModel;
}
public static void updatebleModel(Vector
mainViewTableModel.setDataVector(data,columns);
}
public static Vector
return columns;
}
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
}
StudentRequest类
public class StudentRequest {
private int pageNow;
private int pageSize;
private int start;
//查询词
private String searchKey;
public int getPageNow() {
return pageNow;
}
public void setPageNow(int pageNow) {
this.pageNow = pageNow;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getStart() {
return (pageNow-1)*pageSize;
}
public void setStart(int start) {
this.start = start;
}
public String getSearchKey() {
return searchKey;
}
public void setSearchKey(String searchKey) {
this.searchKey = searchKey;
}
}
StudentService类
public interface StudentService {
TableDTO retrieveStudents(StudentRequest studentRequest);
}
StudentServiceImpl类
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;
public class StudentServiceImpl implements StudentService {
@Override
public TableDTO retrieveStudents(StudentRequest request) {
StringBuilder sql=new StringBuilder();
sql.append("select*from student ");
if(request.getSearchKey()!=null&&!"".equals(request.getSearchKey().trim())) {
sql.append("where name like '% ").append(request.getSearchKey().trim()).append("%'");
}
sql.append("order by id desc limit").append(request.getStart()).append(",").append(request.getPageSize());
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
TableDTO returnDTO=new TableDTO();
try {
conn=DBUtil.getConn();
assert conn != null;
ps=conn.prepareStatement(sql.toString());
rs=ps.executeQuery();
//查询记录
returnDTO.setData(extracted(rs));
sql.setLength(0);
sql.append("select count(*) from student");
if(request.getSearchKey()!=null&&!"".equals(request.getSearchKey().trim())) {
sql.append("where name like '% ").append(request.getSearchKey().trim()).append("%'");
}
ps=conn.prepareStatement(sql.toString());
rs= ps.executeQuery();
while (rs.next()) {
int count=rs.getInt(1);
returnDTO.setTotalCount(count);
}
return returnDTO;
}catch(Exception e){
}finally {
DBUtil.closeRs(rs);
DBUtil.closePs(ps);
DBUtil.closeConn(conn);
}
return null;
}
private Vector
Vector
while (rs.next()){
//处理查出的每一条记录
Vector
TableDTO类
import java.util.Vector;
public class TableDTO {
private Vector
private int totalCount;
public Vector
return data;
}
public void setData(Vector
this.data = data;
}
public int getTotalCount() {
return totalCount;
}
public void setTotalCount(int totalCount) {
this.totalCount = totalCount;
}
}



