项目源码在这里: MIMS
一点东西
在Java项目中,可以使用System.exit(0)代码执行来结束整个项目。
System.exit(0)是Java中的一个方法,其作用是退出Java虚拟机。调用该方法时,Java虚拟机会立即关闭并结束程序的运行,因此可以通过该方法来结束整个Java项目。
需要注意的是,在使用System.exit(0)时,应该确保已经完成了所有必要的操作,并且尽量不要将其滥用。过多地使用System.exit(0)可能会导致程序的异常结束,对项目造成潜在的安全问题或影响到线程池资源释放等问题。
项目结构
本章将以一个社区医疗信息管理系统为例,为读者示范如何开发C/S架构的应用程序,该系统包含系统登录、用户密码修改、用户管理、科室管理、医生管理、药品信息管理、挂号管理、预约挂号、医生诊断管理、缴费明细查询、费用结算等。
以下是控制台上模拟实现这些功能的大致流程:
-
实现系统登录功能,输入用户名和密码验证用户身份,只有通过验证的用户才能使用后续功能。可以通过Scanner类来获取用户输入的信息,并对该信息进行判断。
-
用户密码修改功能,按照用户输入的用户名,在数据库中更新该用户的密码。可以通过JDBC连接数据库并执行SQL语句来实现该操作。
-
科室医生管理功能,包括对科室和医生信息的增加、删除和修改操作。可以通过命令行菜单的形式来提供相应的选项,通过执行SQL语句实现查询或修改数据库中的信息。
-
药品信息管理功能,包括对药品信息的增加、删除和修改操作。同样可以通过命令行菜单的形式提供相应的选项,并通过执行SQL语句实现操作。
-
挂号管理和预约挂号功能,包括了患者基本信息、费用等的管理和查询。同样可以在命令行界面上提供相应的选项,管理员可以根据选择完成相关操作。
-
医生诊断管理功能,包括了病人姓名、就诊时间、症状描述、医生诊断结果等字段。管理员可以通过命令行方式查找和管理已经就诊的患者信息。
-
费用结算功能,包括了对患者缴费的操作。需要管理员在命令行输入患者ID和缴费金额,之后系统将自动更新患者的费用信息。
以上,是使用控制台来模拟实现医院管理系统各个功能的简要流程,主要涉及到使用Java编程,并且需要熟悉JDBC连接和MySQL数据库的基本知识。
用户登录
用户在控制台输入用户名和密码,如果表中有这个用户的用户名,就判断密码是否正确;如果表中没有这个用户的用户名,就提示用户名不存在。如果用户名存在就判断密码是否正确:密码如果不正确,就提示密码不正确;如果密码正确,再判断“角色”,如果是患者,就提示“登录成功!你是患者。”,如果是医生,就提示“登录成功,你是医生。”
根据需求所描述的功能,可以初步分析出t_user表需要包含的字段如下:
- id:用户ID,主键,自增长。
- username:用户名,唯一索引,用于区分不同的用户。
- password:密码,存储用户密码的hash值或加密后的密文。
- role:角色类型,表征该用户所属的角色,例如患者、医生等。
总体而言,上述四个字段是基础字段。—那么,就只用这四个字段!
数据库操作
MySQL,可以使用 AUTO_INCREMENT
属性来将ID字段设置为自增长。示例代码如下:
CREATE TABLE t_user (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
password VARCHAR(50) NOT NULL,
role VARCHAR(20) NOT NULL
);
其中,AUTO_INCREMENT
属性将 id
字段标记为自增长字段,并且在每次插入新记录时,会自动为该字段赋一个唯一的整数值,从而不需要手动指定主键。
需要注意的是,AUTO_INCREMENT只能用于整数类型的列。如果您使用的是其他数据库,可以查询其文档了解具体实现方式和限制条件。
UNSIGNED
是 MySQL 数据库支持的一种整数类型修饰符,将一个整数字段声明为 UNSIGNED
代表字段的取值范围限定在非负整数。
例如,当您将 id
字段声明为 INT UNSIGNED
类型时,该字段就不允许存储负数,而仅能存储0和正整数。使用这个修饰符可以帮助提高数据表的数据完整性,避免因为无效负数数据导致逻辑上的错误。
需要注意的是,如果某个整数列被声明为 UNSIGNED
,那么它对应的索引也必须是 UNSIGNED
。否则可能会造成不匹配的问题,导致索引无法正确地生效,进而影响到查询性能和结果准确性。
用户登录之前,通常需要先往数据库中的 t_user
表中插入一些用户信息,以便用户能够使用自己的账号和密码进行登录。
所以,在设计数据库的时候,需要先让数据库中有一些信息,在数据库中的t_user中插入一些数据。
INSERT INTO t_user VALUE(1,'zhangsan','123456','patient');
INSERT INTO t_user VALUE(2,'lisi','123456','doctor');
INSERT INTO t_user VALUE(3,'wangwu','123456','patient');
INSERT INTO t_user VALUE(4,'zhaoliu','123456','doctor');
INSERT INTO t_user VALUE(5,'Mike','123456','patient');
SELECT * FROM t_user;
JDBC操作
JDBC模板
以下是MySQL8.0版本的JDBC的模板
该模板包含了一个建立与数据库连接、创建 PreparedStatement 执行 SQL 语句、处理返回的结果集,并对资源进行关闭的完整流程。您仅需将 URL、USERNAME、PASSWORD 和 SQL 语句替换为自己的值即可完成基本的增删改查操作。
import java.sql.*;
public class JDBCTemplate {
private static final String URL = "jdbc:mysql://localhost:3306/mydatabase";
private static final String USERNAME = "username";
private static final String PASSWORD = "password";
public static void main(String[] args) throws SQLException {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
// 连接数据库
conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
// 创建PreparedStatement对象
ps = conn.prepareStatement("SELECT * FROM mytable WHERE id = ?");
// 设置参数
ps.setInt(1, 1);
// 执行查询语句
rs = ps.executeQuery();
// 处理结果集
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
int age = rs.getInt("age");
System.out.println("id=" + id + ", name=" + name + ", age=" + age);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 关闭连接,释放资源
if (rs != null) {
rs.close();
}
if (ps != null) {
ps.close();
}
if (conn != null) {
conn.close();
}
}
}
}
用户登录JAVA代码
package com.zhangcomy;
import java.sql.*;
import java.util.Scanner;
public class UserLogon {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/mims";
String user = "root";
String password = "123456";
Scanner sc=new Scanner(System.in);
System.out.println("请输入用户名:");
String inputUsername = sc.next();
System.out.println("请输入密码:");
String inputPassword =sc.next();
try (Connection conn = DriverManager.getConnection(url, user, password);
PreparedStatement ps = conn.prepareStatement("SELECT * FROM t_user WHERE username=?")) {
// 设置查询参数,查询是否有该用户的记录
ps.setString(1, inputUsername);
ResultSet rs = ps.executeQuery();
if (rs.next()) {
// 说明有该用户的记录
// 检查密码是否正确
String storedPassword = rs.getString("password");
if (inputPassword.equals(storedPassword)) {
System.out.println("登录成功!");
} else {
System.out.println("密码错误!");
}
} else {
System.out.println("用户名不存在!");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
用户密码修改
JAVA代码
package com.zhangcomy;
import java.sql.*;
import java.util.Scanner;
public class UserChangePsw {
private static final String URL = "jdbc:mysql://localhost:3306/mims";
private static final String USERNAME = "root";
private static final String PASSWORD = "123456";
public static void main(String[] args) throws SQLException {
Connection conn = null;
PreparedStatement ps = null;
Scanner sc = new Scanner(System.in);
System.out.println("请输入用户名:");
String Yname = sc.next();
System.out.println("请输入新密码:");
String newPassword = sc.next();
try {
// 连接数据库
conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
// 创建PreparedStatement对象
ps = conn.prepareStatement("update t_user set password=? where username=?");
// 设置参数
ps.setString(1, newPassword);
ps.setString(2, Yname);
// 执行更新语句
int count = ps.executeUpdate();
if(count > 0){
System.out.println("你新修改了密码,你的新密码为:" + newPassword);
}else{
System.out.println("密码修改失败!");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 关闭连接,释放资源
if (ps != null) {
ps.close();
}
if (conn != null) {
conn.close();
}
}
}
}
科室医生管理
数据库
科室管理和医生管理功能,包括对科室和医生信息的增加、删除和修改操作。可以通过命令行菜单的形式来提供相应的选项,通过执行SQL语句实现查询或修改数据库中的信息。
所以,这个功能相关的数据库表中的字段有两个,医生的姓名和所属的部门
JAVA代码
这个功能类里面包含三个子功能,子功能为总功能的内部类
package com.zhangcomy;
import java.sql.*;
import java.util.Scanner;
public class Doctormanage {
public void manage() throws SQLException {
System.out.println("添加医生信息:1");
System.out.println("删除医生信息:2");
System.out.println("更新医生部门:3");
Scanner sc=new Scanner(System.in);
int num1=sc.nextInt();
if(num1==1){
Add a=new Add();
a.AddDoctor();
} else if (num1==2) {
Delete d=new Delete();
d.DeleteDoctor();
} else if (num1==3) {
Update u=new Update();
u.UpdateDoctor();
}
}
public static class Add{
private static final String URL = "jdbc:mysql://localhost:3306/mims";
private static final String USERNAME = "root";
private static final String PASSWORD = "123456";
public void AddDoctor() throws SQLException {
Connection conn = null;
PreparedStatement ps = null;
Scanner sc = new Scanner(System.in);
System.out.println("你想添加哪个医生的信息?说出他的名字");
String Yname = sc.next();
System.out.println("你想把这个医生添加到哪个科室中去?");
String Depatement = sc.next();
try {
// 连接数据库
conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
// 创建PreparedStatement对象
ps = conn.prepareStatement("INSERT INTO doctor VALUE(?,?)");
// 设置参数
ps.setString(1, Depatement);
ps.setString(2, Yname);
// 执行更新语句
int count = ps.executeUpdate();
if(count > 0){
System.out.println("你新添加了一个医生的信息,你添加的医生是:" + Yname);
}else{
System.out.println("信息修改失败!");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 关闭连接,释放资源
if (ps != null) {
ps.close();
}
if (conn != null) {
conn.close();
}
}
}
}
public static class Delete{
private static final String URL = "jdbc:mysql://localhost:3306/mims";
private static final String USERNAME = "root";
private static final String PASSWORD = "123456";
public void DeleteDoctor() throws SQLException {
Connection conn = null;
PreparedStatement ps = null;
Scanner sc = new Scanner(System.in);
System.out.println("你想删除哪个医生的信息?说出他的名字");
String Yname = sc.next();
try {
// 连接数据库
conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
// 创建PreparedStatement对象
ps = conn.prepareStatement("delete from doctor where docname=?");
// 设置参数
ps.setString(1, Yname);
// 执行更新语句
int count = ps.executeUpdate();
if(count > 0){
System.out.println("你删除了一个医生的信息,你添加的医生是:" + Yname);
}else{
System.out.println("信息修改失败!");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 关闭连接,释放资源
if (ps != null) {
ps.close();
}
if (conn != null) {
conn.close();
}
}
}
}
public static class Update {
private static final String URL = "jdbc:mysql://localhost:3306/mims";
private static final String USERNAME = "root";
private static final String PASSWORD = "123456";
public void UpdateDoctor() throws SQLException {
Connection conn = null;
PreparedStatement ps = null;
Scanner sc = new Scanner(System.in);
System.out.println("你想修改哪个医生的部门信息?说出他的名字");
String Yname = sc.next();
System.out.println("你想把这个医生的部门修改为哪一个?");
String depart = sc.next();
try {
// 连接数据库
conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
// 创建PreparedStatement对象
ps = conn.prepareStatement("update doctor set department=?where docname=?");
// 设置参数
ps.setString(1, depart);
ps.setString(2, Yname);
// 执行更新语句
int count = ps.executeUpdate();
if (count > 0) {
System.out.println("你更新了一个医生的信息,你更新的医生是:" + Yname);
} else {
System.out.println("信息修改失败!");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 关闭连接,释放资源
if (ps != null) {
ps.close();
}
if (conn != null) {
conn.close();
}
}
}
}
}
药品信息管理
药品信息管理功能:包括对药品信息的增删改查
## 数据库
USE mims;
SHOW TABLES;
CREATE TABLE drugs(
drugname VARCHAR(20),
price INT,
num INT,
usages VARCHAR(20)
);
/*
drugname 药名
price 药价
num 药,剩余的数量
usages 说明这是治什么的药
*/
INSERT INTO drugs VALUE ('阿尔莫斯',13,99,'感冒');
INSERT INTO drugs VALUE ('洛克萨斯',11,19,'拉稀');
INSERT INTO drugs VALUE ('可义拉斯',34,77,'变美');
INSERT INTO drugs VALUE ('邢倪凯斯',56,87,'头疼');
INSERT INTO drugs VALUE ('爱抚函斯',90,58,'近视');
DROP TABLE drugs;
SELECT * FROM drugs;
挂号
医生治病
医生诊断管理功能,包括了病人姓名、就诊时间、症状描述、医生诊断结果等字段。管理员可以通过命令行方式查找和管理已经就诊的患者信息。
所以表patient中只有name\time\descr\result四个字段
java
package com.zhangcomy;
import java.sql.*;
import java.util.Scanner;
public class Treatment {
public void manage() throws SQLException {
System.out.println("If you want to add patient information, please press 1");
System.out.println("If you want to delete patient information, please press 2");
System.out.println("If you want to modify patient information, please press 3");
System.out.println("If you want to query patient information, please press 4");
Scanner sc=new Scanner(System.in);
int num1=sc.nextInt();
if(num1==1){
Add a=new Add();
a.AddPat();
} else if (num1==2) {
Delete d=new Delete();
d.DeletePat();
} else if (num1==3) {
Update u=new Update();
u.UpdatePat();
} else if (num1==4) {
Select s=new Select();
s.selectPat();
}
}
public static class Add{
private static final String URL = "jdbc:mysql://localhost:3306/mims";
private static final String USERNAME = "root";
private static final String PASSWORD = "123456";
public void AddPat() throws SQLException {
Connection conn = null;
PreparedStatement ps = null;
Scanner sc = new Scanner(System.in);
System.out.println("Patient Name:");
String Name = sc.next();
System.out.println("Treatment Time:");
String Time = sc.next();
System.out.println("Symptom Description:");
String Descr=sc.next();
System.out.println("Treatment Results:");
String Res=sc.next();
try {
// 连接数据库
conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
// 创建PreparedStatement对象
ps = conn.prepareStatement("INSERT INTO patient VALUE(?,?,?,?)");
// 设置参数
ps.setString(1, Name);
ps.setString(2, Time);
ps.setString(3,Descr);
ps.setString(4, Res);
// 执行更新语句
int count = ps.executeUpdate();
if(count > 0){
System.out.println("Operation successful!");
}else{
System.out.println("Operation failed!");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 关闭连接,释放资源
if (ps != null) {
ps.close();
}
if (conn != null) {
conn.close();
}
}
}
}
public static class Delete{
private static final String URL = "jdbc:mysql://localhost:3306/mims";
private static final String USERNAME = "root";
private static final String PASSWORD = "123456";
public void DeletePat() throws SQLException {
Connection conn = null;
PreparedStatement ps = null;
Scanner sc = new Scanner(System.in);
System.out.println("Which patient's information do you want to delete? Please say his name:");
String Yname = sc.next();
try {
// 连接数据库
conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
// 创建PreparedStatement对象
ps = conn.prepareStatement("delete from patient where name=?");
// 设置参数
ps.setString(1, Yname);
// 执行更新语句
int count = ps.executeUpdate();
if(count > 0){
System.out.println("Operation successful!");
}else{
System.out.println("Operation failed!");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 关闭连接,释放资源
if (ps != null) {
ps.close();
}
if (conn != null) {
conn.close();
}
}
}
}
public static class Update {
private static final String URL = "jdbc:mysql://localhost:3306/mims";
private static final String USERNAME = "root";
private static final String PASSWORD = "123456";
public void UpdatePat() throws SQLException {
Connection conn = null;
PreparedStatement ps = null;
Scanner sc = new Scanner(System.in);
System.out.println("重新设置患者信息:");
System.out.println("Patient Name:");
String Name = sc.next();
System.out.println("Treatment Time:");
String Time = sc.next();
System.out.println("Symptom Description:");
String Descr=sc.next();
System.out.println("Treatment Results:");
String Res=sc.next();
try {
// 连接数据库
conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
// 创建PreparedStatement对象
ps = conn.prepareStatement("update patient set time=?,descr=?,result=? where name=?");
// 设置参数
ps.setString(1, Time);
ps.setString(2, Descr);
ps.setString(3,Res);
ps.setString(4,Name);
// 执行更新语句
int count = ps.executeUpdate();
if (count > 0) {
System.out.println("操作成功!");
} else {
System.out.println("操作失败!");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 关闭连接,释放资源
if (ps != null) {
ps.close();
}
if (conn != null) {
conn.close();
}
}
}
}
public static class Select {
private static final String URL = "jdbc:mysql://localhost:3306/mims";
private static final String USERNAME = "root";
private static final String PASSWORD = "123456";
public void selectPat() throws SQLException {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
// 连接数据库
conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
// 创建PreparedStatement对象
ps = conn.prepareStatement("SELECT * FROM patient");
// 执行查询操作
rs = ps.executeQuery();
// 处理查询结果
while (rs.next()) {
String Yname = rs.getString("name"); // 获取药品名列的值
String time = rs.getString("time"); // 获取价格列的值
String desc = rs.getString("descr");
String res = rs.getString("result");
System.out.println(Yname+"\t"+time+"\t"+desc+"\t"+res);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 关闭连接和释放资源
if (rs != null) {
rs.close();
}
if (ps != null) {
ps.close();
}
if (conn != null) {
conn.close();
}
}
}
}
}
缴费功能
数据库操作
USE mims;
SHOW TABLES;
CREATE TABLE payment (
id INT PRIMARY KEY AUTO_INCREMENT,
patient_name VARCHAR(50) NOT NULL,
amount DECIMAL(10, 2) NOT NULL,
payment_date DATE NOT NULL,
operator_name VARCHAR(50) NOT NULL
);
INSERT INTO payment (patient_name, amount, payment_date, operator_name) VALUES ('张三', 100.50, '2023-06-03', '李四');
SELECT * FROM payment;
可以根据医院管理员操作给患者缴费的需求,设计如下的缴费表:
CREATE TABLE payment ( id INT PRIMARY KEY AUTO_INCREMENT, patient_name VARCHAR(50) NOT NULL, amount DECIMAL(10, 2) NOT NULL, payment_date DATE NOT NULL, operator_name VARCHAR(50) NOT NULL );
上述表包含以下字段:
- id:缴费记录的唯一标识符,采用 INT 类型,并设置为主键和自动增量;
- patient_name:患者姓名,采用 VARCHAR(50),不能为空;
- amount:缴费金额,采用 DECIMAL(10, 2),表示最大 10 位数字,小数点后最多留 2 位,不能为空;
- payment_date:缴费日期,采用 DATE 类型,不能为空;
- operator_name:缴费操作员名称,采用 VARCHAR(50),不能为空。
通过这个表,可以记录每次患者缴纳的费用、缴纳日期以及缴费操作员的相关信息,方便日后管理和查询。
主键是指在数据库表中用来唯一标识每行数据的一个或多个字段。它的作用是保证表中每行数据都有唯一的标识符,便于在查询、更新和删除数据时定位和操作目标数据。
自增长是一种常用的主键生成策略,通常用于主键类型为整数的情况下。自增长会自动为新插入数据的主键赋上一个比前一条记录的主键值大 1 的新值。举例来说,在一个自增长主键的表中,当插入第一行数据时,自增长主键可能会为 1;当插入第二行数据时,自增长主键会在第一行主键基础上加 1,即为 2;以此类推。
使用自增长主键可以省去手动计算并配置主键值的步骤,不仅提高了效率,也更加保证了数据的完整性和正确性。在 MySQL 中,我们可以通过设置 AUTO_INCREMENT 特性实现该功能。
以下是向上述缴费表中插入一条记录的示例 SQL 语句:
INSERT INTO payment (patient_name, amount, payment_date, operator_name) VALUES ('张三', 100.50, '2023-06-03', '李四');
这条语句会将一笔名称为“张三”、金额为 100.50、日期为今天(2023 年 6 月 3 日)、操作员名称为“李四”的缴费信息插入到 payment 表中。插入后,该记录会自动获得一个唯一的主键值(假设为 1)。
java操作
费用结算功能,包括了对患者缴费的操作。需要管理员在命令行输入患者ID和缴费金额,之后系统将自动更新患者的费用信息。