GaussDB数据库实验二:数据库应用程序设计实验

文章目录

  • 前言
  • 一、实验任务-——人力资源管理系统
  • 二、项目设计
    • 1. 项目结构
    • 2. 项目源代码
  • 三、功能展示
    • 1. Staff(普通职员)
    • 2. Manager(部门经理)
    • 3. HrManager(人事经理)
  • 总结与感悟


前言

本实验承接GaussDB数据库实验一:SQL基础实验,旨在开发一个简单的人力资源管理系统。


一、实验任务-——人力资源管理系统

GaussDB数据库实验二:数据库应用程序设计实验_第1张图片
GaussDB数据库实验二:数据库应用程序设计实验_第2张图片
GaussDB数据库实验二:数据库应用程序设计实验_第3张图片
GaussDB数据库实验二:数据库应用程序设计实验_第4张图片

二、项目设计

1. 项目结构

本项目的结构如下:

- .classpath
- .project
+ .settings/
  - org.eclipse.core.resources.prefs
  - org.eclipse.jdt.core.prefs
+ bin/
  + openGauss/
    - HrManager.class
    - Human.class
    - human_resources_management.class
    - Manager.class
    - utils.class
+ src/
  + openGauss/
    - HrManager.java
    - Human.java
    - human_resources_management.java
    - Manager.java
    - utils.java
  • human_resources_management.java:主程序
  • Human.java :普通职员类
  • Manager.java:部门经理类,继承了Human类
  • HrManager.java:人事经理类
  • utils.java:定义了一些工具

2. 项目源代码

  • human_resources_management.java
package openGauss;


import java.sql.*;
import java.util.Scanner;

public class human_resources_management {
	
	static String driver = "org.postgresql.Driver";
	// 服务器的ip和数据库的端口,需要根据自己设置
    static String sourceURL = "jdbc:postgresql://120.46.176.58:26000/human_resource";
  
    // 数据库的用户名与密码,需要根据自己的设置
    static final String username = "taoyongding";
    static final String passwd = "taoyongding@123";
    
    static Connection conn = null;
    static Scanner sc = new Scanner(System.in);
    
    static void menuWorker(int staff_id) {
    	System.out.println("您好!请输入您的password:");
    	Human worker = new Human(staff_id);
    	if(utils.checkpassword(worker.queryPassword())) {
    		while (true) {
        		System.out.println("请输入数字进入对应功能:\n"
        				+ "1 查看您的基本信息\n"
        				+ "2 修改您的电话号码\n"
        				+ "3 退出系统");
                int opt = sc.nextInt();

                if (opt == 3) {
                    System.out.println("感谢您的使用!");
                    break;
                }
                worker.choose(opt);
            }
    	}
    }
    
    static void menuManager(int staff_id) {
    	System.out.println("经理您好!请输入您的password:");
    	Manager manager = new Manager(staff_id);
    	if(utils.checkpassword(manager.queryPassword())) {
    		while (true) {
        		System.out.println("请输入数字进入对应功能:\n"
        				+ "1 查看本部门所有员工基本信息\n"
        				+ "2 按员工编号查询员工基本信息\n"
        				+ "3 按员工姓名查询员工基本信息\n"
        				+ "4 统计查询本部门员工最高工资,最低工资以及平均工资\n"
        				+ "5 退出系统");
                int opt = sc.nextInt();
                if (opt == 5) {
                    System.out.println("感谢您的使用!");
                    break;
                }
                manager.choose(opt);
            }
    	}
    }
    
    static void menuHrManager() {
    	System.out.println("人事经理您好!请输入您的password:");
    	if(utils.checkpassword("hr@001")) {
    		HrManager hrManager = new HrManager();
    		while (true) {
        		System.out.println("请输入数字进入对应功能:\n"
        				+ "1 查看所有员工基本信息(选择按员工编号升序排列,或者按工资降序排列)\n"
        				+ "2 按员工编号查询员工基本信息\n"
        				+ "3 按员工姓名查询员工基本信息\n"
        				+ "4 统计各部门员工最高工资,最低工资以及平均工资\n"
        				+ "5 查询各部门基本信息\n"
        				+ "6 根据部门编号修改部门名称\n"
        				+ "7 查询各工作地点基本信息\n"
        				+ "8 增加新的工作地点\n"
        				+ "9 按员工编号查询员工工作信息,包括其历史工作信息,返回员工编号,职位编号和部门编号\n"
        				+ "10 退出系统");
                int opt = sc.nextInt();
                if (opt == 10) {
                    System.out.println("感谢您的使用!");
                    break;
                }
                hrManager.choose(opt);
            }
    	}
    }

	public static void main(String[] args) {
        PreparedStatement stmt = null;
        try {
        	// 注册JDBC驱动
            Class.forName(driver).newInstance();

            // 打开链接
            conn = DriverManager.getConnection(sourceURL, username, passwd);
            System.out.println("连接数据库...");
            
            System.out.println("请输入您的staff_id:");
            //测试样例:员工 107 经理 100 hr hr001
            
            //Michael Hartstein
            String staff_id = sc.nextLine();
            if(staff_id.equals("hr001") == false) {
            	//用staff_id 查询对应的manager_id
            	int s_id = Integer.parseInt(staff_id);
            	String sql;
                sql = "SELECT * FROM staffs WHERE manager_id=?";
                stmt = conn.prepareStatement(sql);
                stmt.setInt(1, s_id);             
                ResultSet rs = stmt.executeQuery();
                if(rs.next()) {//能够查到,说明是某个部门的经理
                	menuManager(s_id);
                }
                else {//为普通员工
                	menuWorker(s_id);
                }
            }
            else {//为hr
            	menuHrManager();
            }
            sc.close();
        } catch (SQLException se) {
            // 处理JDBC异常
            se.printStackTrace();
        } catch (Exception e) {
            // 处理其他异常
            e.printStackTrace();
        } finally {
            // 关闭资源
            try {
                if (stmt != null) {
                    stmt.close();
                }
            } catch (SQLException se2) {
            	
            }// 什么都不做
            try {
                if (conn != null) {
                    conn.close();
                }
            } catch (SQLException se) {
                se.printStackTrace();
            }
        }
        System.out.println("Goodbye!");
    }
}
  • Human.java
package openGauss;

import java.sql.*;
import java.util.Scanner;

public class Human {
	// 普通员工类,实现以下功能:
	// 1 在员工主页面,可以选择查看员工自己基本信息
	// 2 在员工主页面,修改员工自己的电话号码
	protected int staff_id;
	public Connection conn = null;
	public Scanner sc = null;
	public Human(int staff_id) {
		this.sc = human_resources_management.sc;
		this.conn = human_resources_management.conn;
		this.staff_id = staff_id;
	}
	
	public void query() {
		//System.out.println("您的基本信息如下:");
		String sql = "SELECT * FROM staffs WHERE staff_id=" + staff_id;
		utils.queryBySql(sql);
	}
	
	public int querySectionId() {
		String sql;
		sql = "SELECT section_id FROM staffs WHERE staff_id=" + staff_id;
		int section_id = -1;
        try {
        	Statement stmt = conn.createStatement();       
            ResultSet rs = stmt.executeQuery(sql);
            
            if(rs.next()) {
            	section_id = rs.getInt("section_id");
            	return section_id;
            }
            
            rs.close();
            stmt.close();
        } catch (SQLException e) {
            e.printStackTrace();
            return -1;
        }
        return section_id;
	}

	
	public String queryPassword() {
		String sql;
		sql = "SELECT password FROM staffs WHERE staff_id=" + staff_id;
		String password = null;
        try {
        	Statement stmt = conn.createStatement();
            
            ResultSet rs = stmt.executeQuery(sql);
            
            if(rs.next()) {
            	password = rs.getString("password");
            	return password;
            }
            
            rs.close();
            stmt.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return password;
	}
	
	public void updatePhoneNumber() {
		System.out.println("请输入新的电话号码(请按照xxx.xxx.xxxx的格式):");
		String phone_number = sc.next();	
		String sql = "UPDATE staffs SET phone_number = "+ phone_number +"WHERE staff_id=" + staff_id;
		utils.updateBySql(sql);
	}
	
	public void choose(int opt) {
		switch(opt) {
			case 1:
				query();
				break;
			case 2:
				updatePhoneNumber();
				break;
		}
	}
}

  • Manager.java
package openGauss;

import java.util.Scanner;

public class Manager extends Human {
	// 部门经理类,实现以下功能:
	// 1 查看本部门所有员工基本信息(选择按员工编号升序排列,或者按工资降序排列);
	// 2 按员工编号查询员工基本信息;
	// 3 按员工姓名查询员工基本信息;
	// 4 统计查询本部门员工最高工资,最低工资以及平均工资;
	
	Scanner sc = new Scanner(System.in);
	public Manager (int staff_id) {
		super(staff_id);
	}
	public void queryAll() {
		// 查看本部门所有员工基本信息
		String sql = null;
		
		System.out.println("您好!\n输入1,可按员工编号升序查询\n输入2,可按薪资降序查询");
		
		int opt = sc.nextInt();
		switch(opt) { 
			case 1:
				sql = "SELECT * FROM staffs WHERE section_id="+this.querySectionId()+" ORDER BY staff_id ASC";
			case 2:
				sql = "SELECT * FROM staffs WHERE section_id="+this.querySectionId()+" ORDER BY salary DESC";
			default:
				utils.queryBySql(sql);
				break;
		}
		
	}
	
	public void queryById() {
		// 按员工编号查询员工基本信息
		System.out.println("请输入所要查询的员工编号:");
		int id = sc.nextInt();
		Human worker = new Human(id);
		if(worker.querySectionId() != this.querySectionId()) {
			System.out.println("查询失败,请输入本部门员工的编号!\n");
		}
		else {
			worker.query();
			System.out.println("查询成功!\n");
		}
		
	}
	
	public void queryByName() {
		// 按员工姓名查询员工基本信息(可能重名,所以要考虑多个)
		System.out.println("请输入所要查询的员工姓名(例如Yongding Tao):");
		String name = sc.nextLine();
		utils.queryByName(name, this.querySectionId());
	}
	
	public void querySalary() {
		// 统计查询本部门员工最高工资,最低工资以及平均工资
		String sql = "SELECT MAX(salary) AS highest_salary,\n"
				+ "       MIN(salary) AS lowest_salary,\n"
				+ "       AVG(salary) AS average_salary\n"
				+ "FROM staffs\n"
				+ "WHERE section_id = " +this.querySectionId()+"\n";
		utils.queryBySql(sql);
	}
	
	@Override
	public void choose(int opt) {
		switch(opt) {
			case 1:
				queryAll();
				break;
			case 2:
				queryById();
				break;
			case 3:
				queryByName();
				break;
			case 4:
				querySalary();
				break;
		}
	}
}
  • HrManager.java
package openGauss;

import java.sql.*;
import java.util.Scanner;

public class HrManager{
	// 人事经理类,实现以下功能:
	// 1 查看所有员工基本信息(选择按员工编号升序排列,或者按工资降序排列);
	// 2 按员工编号查询员工基本信息;
	// 3 按员工姓名查询员工基本信息;
	// 4 统计各部门员工最高工资,最低工资以及平均工资;
	// 5 查询各部门基本信息;
	// 6 根据部门编号修改部门名称;
	// 7 查询各工作地点基本信息;
	// 8 增加新的工作地点;
	// 9 按员工编号查询员工工作信息,包括其历史工作信息,返回员工编号,职位编号和部门编号;
	Scanner sc = null;
	Connection conn = null;
	
	public HrManager() {
		this.sc = human_resources_management.sc;
		this.conn = human_resources_management.conn;
	}
	public void queryAll() {
		// 查看所有员工基本信息
		String sql = null;
		
		System.out.println("您好!\n输入1,可按员工编号升序查询\n输入2,可按薪资降序查询");
		
		int opt = sc.nextInt();
		switch(opt) { 
			case 1:
				sql = "SELECT * FROM staffs ORDER BY staff_id ASC";
				break;
			case 2:
				sql = "SELECT * FROM staffs ORDER BY salary DESC";
				break;
		}
		utils.queryBySql(sql);
		
	}
	
	public void queryById() {
		// 按员工编号查询员工基本信息
		System.out.println("请输入所要查询的员工编号:");
		int id = sc.nextInt();
		Human worker = new Human(id);
		worker.query();
		System.out.println("查询成功!\n");
	}
	
	public void queryByName() {
		// 按员工姓名查询员工基本信息(可能重名,所以要考虑多个)
		System.out.println("请输入所要查询的员工姓名(例如Yongding Tao):");
		sc.nextLine();
		String name = sc.nextLine();
		utils.queryByName(name);
	}
	
	public void querySalary() {
		// 统计各部门员工最高工资,最低工资以及平均工资;
		String sql = "SELECT section_id,"
				+ "MAX(salary) AS highest_salary,\n"
				+ "MIN(salary) AS lowest_salary,\n"
				+ "AVG(salary) AS average_salary\n"
				+ "FROM staffs\n"
				+ "GROUP BY section_id\n"
				+ "ORDER BY section_id ASC";
		utils.queryBySql(sql);
	}
	
	public void querySection() {
		// 查询各部门基本信息;
		String sql = "SELECT * FROM sections";
		utils.queryBySql(sql);
		
	}
	
	public void updateSection() {
		// 根据部门编号修改部门名称;
		System.out.println("请输入部门编号:");
		int section_id = sc.nextInt();
		System.out.println("当前部门名称为:");
		String sql = "SELECT section_name FROM sections WHERE section_id = " + section_id;
		utils.queryBySql(sql);
		System.out.println("请输入新的部门名称:");
		sc.nextLine();
		String section_name = sc.nextLine();
		sql = "UPDATE sections SET section_name='"+section_name+"' WHERE section_id="+section_id;
		utils.updateBySql(sql);
	}
	
	public void queryPlace() {
		// 查询各工作地点基本信息;
		String sql = "SELECT * FROM places";
		utils.queryBySql(sql);
	}
	
	public void addNewPlace() {
		System.out.println("您想要插入一个新地点,请根据引导完成数据读入");
		System.out.println("请输入部门编号:");
		int place_id = sc.nextInt();
		System.out.println("请输入部门所在地街道地址:");
		String street_address = sc.nextLine();
		System.out.println("请输入部门所在地邮政编码:");
		String postal_code = sc.nextLine();
		System.out.println("请输入部门所在城市:");
		String city = sc.nextLine();
		System.out.println("请输入部门所在省:");
		String state_province = sc.nextLine();
		System.out.println("请输入国家简写(如CN)");
		String state_id = sc.next();
		String sql = "INSERT INTO places (place_id, street_address, postal_code, city, state_province, state_id)"
				+ String.format("VALUES (%d, '%s', '%s', '%s', '%s', '%s')", place_id, street_address, postal_code, city, state_province, state_id);
		utils.updateBySql(sql);
//		
//		VALUES (1001, '123 Main St', '12345', 'New York', 'NY', 'US');

	}
	
	public void queryHistory() {
		// 查询工作历史信息 //test 101
		System.out.println("请输入所要查询的员工编号:");
		sc.nextLine();
		int staff_id = sc.nextInt();
		String sql = "SELECT * FROM employment_history WHERE staff_id="+staff_id;
		utils.queryBySql(sql);
		System.out.println("查询成功!\n");
	}
	
	public void choose(int opt) {
		switch(opt) {
			case 1:
				queryAll();
				break;
			case 2:
				queryById();
				break;
			case 3:
				queryByName();
				break;
			case 4:
				querySalary();
				break;
			case 5:
				querySection();
				break;
			case 6:
				updateSection();
				break;
			case 7:
				queryPlace();
				break;
			case 8:
				addNewPlace();
				break;
			case 9:
				queryHistory();
				break;
		}
	}
}
  • utils.java
package openGauss;

import java.sql.*;
import java.util.Scanner;

public class utils {
	static public Scanner sc = human_resources_management.sc;
	static public Connection conn = human_resources_management.conn;
	
    public static void printCurrentRowData(ResultSet resultSet) throws SQLException {
        ResultSetMetaData metaData = resultSet.getMetaData();
        int columnCount = metaData.getColumnCount();

        for (int i = 1; i <= columnCount; i++) {
            String columnName = metaData.getColumnName(i);
            Object columnValue = resultSet.getObject(i);

            System.out.println(columnName + ": " + columnValue);
        }
    }
    
    public static void printQueryResults(ResultSet resultSet) throws SQLException {
        ResultSetMetaData metaData = resultSet.getMetaData();
        int columnCount = metaData.getColumnCount();

        // 打印表头
        for (int i = 1; i <= columnCount; i++) {
            //System.out.print(metaData.getColumnName(i) + "\t");
        	System.out.format("%-20s", metaData.getColumnName(i));
        }
        System.out.println();

        // 打印分隔线
        for (int i = 1; i <= columnCount; i++) {
            System.out.print("--------------------");
        }
        System.out.println();

        // 打印数据行
        for (int i = 1; i <= columnCount; i++) {
            //System.out.print(resultSet.getString(i) + "\t");
        	System.out.format("%-20s", resultSet.getString(i));
        }
        System.out.println();
        while (resultSet.next()) {
            for (int i = 1; i <= columnCount; i++) {
                //System.out.print(resultSet.getString(i) + "\t");
            	System.out.format("%-20s", resultSet.getString(i));
            }
            System.out.println();
        }
    }
    
    public static void queryByName(String fullName) {
    	String[] names = fullName.split(" ");
    	if(names.length != 2) {
    		System.out.println("输入错误!");
    		return;
    	}
    	String sql = "SELECT staff_id FROM staffs WHERE first_name=\'"+names[0]+"\'AND last_name=\'"+names[1]+"\'";
    	try {
        	Statement stmt = conn.createStatement();      
            ResultSet rs = stmt.executeQuery(sql);
            
            while(rs.next()) {
            	int staff_id = rs.getInt("staff_id");
            	Human worker = new Human(staff_id);
            	worker.query();
            }
            
            rs.close();
            stmt.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    
    public static void queryByName(String fullName, int section_id) {
    	String[] names = fullName.split(" ");
    	if(names.length != 2) {
    		System.out.println("输入错误!");
    		return;
    	}
    	String sql = "SELECT staff_id FROM staffs WHERE first_name=\'"+names[0]+"\'AND last_name=\'"+names[1]+"\'";
    	try {
        	Statement stmt = conn.createStatement();      
            ResultSet rs = stmt.executeQuery(sql);
            
            while(rs.next()) {
            	int staff_id = rs.getInt("staff_id");
            	Human worker = new Human(staff_id);
            	if(worker.querySectionId() == section_id) {//是自己部门的人
            		worker.query();
            	}
            	else continue;
            }
            
            rs.close();
            stmt.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public static void queryBySql(String sql) {
    	try {
        	Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery(sql);
            if(rs.next()) {
            	printQueryResults(rs);
            }
            rs.close();
            stmt.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    
    public static void updateBySql(String sql) {
    	try {
        	Statement stmt = conn.createStatement();
            stmt.executeUpdate(sql);
            
            System.out.println("更新成功!");
            stmt.close();
        } catch (SQLException e) {
        	System.out.println("更新失败!");
            e.printStackTrace();
        }
    }
    
    public static boolean checkpassword(String correct) {
    	String password = sc.next();
    	int cnt = 0;
    	while(password.equals(correct) == false) {
    		System.out.println("登入失败,请重新输入!");
    		cnt++;
    		if(cnt == 5) {
    			System.out.println("连续5次错误,系统退出!");
    			return false;
    		}
    		password = sc.next();
    	}
    	System.out.println("登入成功!");
    	return true;
    }
}


三、功能展示

这部分将会对人力资源管理系统三种角色的功能分别进行展示。

1. Staff(普通职员)

  • 输入staff_id,系统自动识别是staffManager还是HrManager

GaussDB数据库实验二:数据库应用程序设计实验_第5张图片

  • 输入失败,将会重新输入,连续失败5次则退出系统

GaussDB数据库实验二:数据库应用程序设计实验_第6张图片

2. Manager(部门经理)

  • 功能1

GaussDB数据库实验二:数据库应用程序设计实验_第7张图片
GaussDB数据库实验二:数据库应用程序设计实验_第8张图片

  • 功能2

GaussDB数据库实验二:数据库应用程序设计实验_第9张图片

  • 功能3

GaussDB数据库实验二:数据库应用程序设计实验_第10张图片

  • 功能4

在这里插入图片描述

3. HrManager(人事经理)

  • 功能1

GaussDB数据库实验二:数据库应用程序设计实验_第11张图片
GaussDB数据库实验二:数据库应用程序设计实验_第12张图片

  • 功能2

GaussDB数据库实验二:数据库应用程序设计实验_第13张图片

  • 功能3

GaussDB数据库实验二:数据库应用程序设计实验_第14张图片

  • 功能4

GaussDB数据库实验二:数据库应用程序设计实验_第15张图片

  • 功能5

GaussDB数据库实验二:数据库应用程序设计实验_第16张图片

  • 功能6

GaussDB数据库实验二:数据库应用程序设计实验_第17张图片
GaussDB数据库实验二:数据库应用程序设计实验_第18张图片

  • 功能7

GaussDB数据库实验二:数据库应用程序设计实验_第19张图片

  • 功能8

GaussDB数据库实验二:数据库应用程序设计实验_第20张图片
GaussDB数据库实验二:数据库应用程序设计实验_第21张图片

  • 功能9

GaussDB数据库实验二:数据库应用程序设计实验_第22张图片


总结与感悟

最终我成功完成了人力资源管理系统的编写,虽然还存在许多的不足,比如,没有使用前端页面进行展示,后端也没有相应地采用SpringBoot等框架规范我的编写,但对于之前没有接触过Java语言的我,已经是一个很大的进步。

通过这个项目,我初步学会了使用 Java 编程语言,了解了数据库的连接和操作。学会了使用 JDBC(Java Database Connectivity)来与数据库进行交互,包括建立数据库连接、执行 SQL 查询和更新语句等操作。

在开发过程中,我学会了使用 JDBC 的基本组件,如 Connection、Statement 和 ResultSet,并将其应用于人力资源管理系统中的各种功能,包括员工信息的查询、修改和统计等。

除了数据库操作,我还熟悉了 Java 的面向对象编程思想,通过定义和使用类、继承和重写方法等概念,实现了系统中的不同角色的功能。在我的编写过程中,我多次重构我的代码,将原来冗长的代码改为用多个类来编写,从而简化代码,理清思路。

这个项目的完成不仅锻炼了我的编程能力,还培养了我的问题解决能力和学习能力。在遇到问题时,我广泛查阅文档和资料,并通过调试和试错的方式找到解决方案。这种持续学习和不断探索的精神是非常重要的,尤其在软件开发领域。

通过这个项目,我也体验到了软件开发的整个过程,包括需求分析、系统设计、编码实现和测试等环节。这对于我进一步了解和掌握软件开发流程和方法论非常有帮助。

总的来说,我在完成这个人力资源管理系统的过程中取得了很大的进步,并掌握了许多有价值的技能和知识,为我打开了一扇新的窗口。

最后,感谢孙老师在课程过程中的悉心教导,也感谢在课堂上和我一起讨论学习的同学们。

你可能感兴趣的:(数据库,数据库,gaussdb,java)