本实验承接GaussDB数据库实验一:SQL基础实验,旨在开发一个简单的人力资源管理系统。
本项目的结构如下:
- .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
:定义了一些工具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;
}
}
这部分将会对人力资源管理系统三种角色的功能分别进行展示。
staff
、Manager
还是HrManager
最终我成功完成了人力资源管理系统的编写,虽然还存在许多的不足,比如,没有使用前端页面进行展示,后端也没有相应地采用SpringBoot等框架规范我的编写,但对于之前没有接触过Java语言的我,已经是一个很大的进步。
通过这个项目,我初步学会了使用 Java 编程语言,了解了数据库的连接和操作。学会了使用 JDBC(Java Database Connectivity)来与数据库进行交互,包括建立数据库连接、执行 SQL 查询和更新语句等操作。
在开发过程中,我学会了使用 JDBC 的基本组件,如 Connection、Statement 和 ResultSet,并将其应用于人力资源管理系统中的各种功能,包括员工信息的查询、修改和统计等。
除了数据库操作,我还熟悉了 Java 的面向对象编程思想,通过定义和使用类、继承和重写方法等概念,实现了系统中的不同角色的功能。在我的编写过程中,我多次重构我的代码,将原来冗长的代码改为用多个类来编写,从而简化代码,理清思路。
这个项目的完成不仅锻炼了我的编程能力,还培养了我的问题解决能力和学习能力。在遇到问题时,我广泛查阅文档和资料,并通过调试和试错的方式找到解决方案。这种持续学习和不断探索的精神是非常重要的,尤其在软件开发领域。
通过这个项目,我也体验到了软件开发的整个过程,包括需求分析、系统设计、编码实现和测试等环节。这对于我进一步了解和掌握软件开发流程和方法论非常有帮助。
总的来说,我在完成这个人力资源管理系统的过程中取得了很大的进步,并掌握了许多有价值的技能和知识,为我打开了一扇新的窗口。
最后,感谢孙老师在课程过程中的悉心教导,也感谢在课堂上和我一起讨论学习的同学们。