实验四:简单的医院挂号系统(DAO)

一、实验目的与要求

1.根据病人在门诊挂号的场景进行数据库设计,至少应包含医生、病人、门诊科室、挂号记录。业务流程如图1,登陆暂不实现。

2.了解DAO设计范式,为各个类分别设计DAO。

3.在测试类中调用DAO方法模拟挂号业务并向数据库中写入挂号记录。

4.在测试类中按从数据库中查询挂号记录并展示挂号记录。

二、实验设计

1.文件结构

tip:lib文件夹同样需要自行新建并且粘贴jar文件

我们首先在src目录下新建三个文件夹,分别为model  dao和F文件夹

分别用于 储存类代码  储存数据库执行语句代码 和 储存交互操作代码

2.数据库表的建立与类的初始化

因为java是面向对象的语言,这就决定了其非常适合用于处理数据库操作

数据库的每一张表代表着一个对象,而对象的属性就是表的列名。

而java每一个类代表着一个对象,而对象的属性就是类的属性

 让我们结合AR图来决定数据库里需要哪些元素。

病人:病人id(主键)   病人姓名   病人挂号科室名字

医生:医生id(主键)  医生负责科室名字

科室:科室id(主键)  科室名字   科室描述   科室类型

记录:记录id(主键)  负责医生id  挂号病人id  挂号科室名字   挂号时间

在数据库初始化后,在model包里新建不同的类以用来储存

此处类均省略getter和setter方法,只展示构造函数

(1)Dept类

(2)Doc类

 (3)Pat类

(4)Record类

3.Dao的编写

由于dao的增删改查需要根据数据库的操作,增加或者减少不同的属性,在此只展示核心

(1)连接数据库函数

public static Connection getConnection(){
    Connection conn=null;
    try{
        Class.forName("com.mysql.jdbc.Driver");
        conn=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/kunkun","root","123456");
        return conn;
    } catch (Exception e){
        e.printStackTrace();
    }
    return conn;
}
public static void release(PreparedStatement pstmt,Connection conn){
    release(null,pstmt,conn);
}
public static void release(ResultSet rs,PreparedStatement pstmt,Connection conn){
    try{
        if(rs!=null){
            rs.close();
        }
        if(pstmt!=null){
            pstmt.close();
        }
        if(conn!=null)
        {
            conn.close();
        }
    }catch (SQLException e){
        e.printStackTrace();
    }
}

 (2)增删改查

重点!!!由于连接数据库进行增删改查操作占用一定内存,我们希望(连接数据库,操作,退出操作)这三者只在需要进行数据库操作时才进行,而不是一开始就连接上,所以举个例子

这是一个查询函数

 解读一下,当我们引用这个函数的时候,我们给他一个科室类的变量,他会在科室表中查找这个变量的name属性,如果,name属性有对应的值,则将flag置为true,并作为返回值,这样我们就知道这样的一个科室名字是合理存在的。

其他函数类似

4.main函数的编写

main函数是实现流程的主要,其中一些操作我们可以集合到函数,最后在main函数中引用即可

public class Main {
    static Scanner reader = new Scanner(System.in);
    public static void main(String[] args) {
        Delete();
        Set();
        boolean flag=true;
        while(flag){
            System.out.print("欢迎来到坤坤的医院,请输入你的身份(病人/医生)" + "\n");
            String a = reader.next();
            if (Objects.equals(a, "医生")) {
                ControlDoc();
                System.out.print("您已经完成了您的工作" + "\n");
            }else if (Objects.equals(a, "病人")) {
                DengLu();
            }
            System.out.print("退出请按a"+"  "+"重新登录请按任意键");
            String b = reader.next();
            if(Objects.equals(b,"a")){
                flag=false;
            }
        }
    }
}

(1)进入main函数

Delete();
Set();

初始化,将病房信息引入数据库里

其他代码略写

(2)进入主要操作平台

while(flag){
    System.out.print("欢迎来到坤坤的医院,请输入你的身份(病人/医生)" + "\n");
    String a = reader.next();
    if (Objects.equals(a, "医生")) {
        ControlDoc();
        System.out.print("您已经完成了您的工作" + "\n");
    }else if (Objects.equals(a, "病人")) {
        GuaHao();
    }
    System.out.print("退出请按a"+"  "+"重新登录请按任意键");
    String b = reader.next();
    if(Objects.equals(b,"a")){
        flag=false;
    }
}
a.病人

如果是病人,则引入挂号界面——跳转DengLu函数

输入姓名则进入类似病人主页界面,病人通过输入不同数字选择不同操作

public static void GuaHao() {
        Integer b=PatDao.selectKey3();
        System.out.print("这是您新挂号的ID:"+(b+1));
        System.out.print("请输入您的姓名"+"\n");
        String a1 = reader.next();
        Pat pat=new Pat(b+1,a1);
        PatDao.insert(pat);
        ControlPat(b+1);
    }
    public static void ControlPat(Integer a){
        boolean flag=true;
        while(flag){
            System.out.print("请选择操作"+"\n"+"1.挂号"+"\n"+"2.查看挂号记录"+"\n"+"3.退出"+"\n");
            String t=reader.next();
            switch (t){
                case "1":{
                    List<Dept> deptList= DeptDao.selectAll();
                    for(Dept dept : deptList) {
                        System.out.printf("科室名字为" + dept.getName() + " 科室描述为" + dept.getDes() + " 科室类型为" + dept.getType()+"\n");
                    }
                    System.out.print("请输入需要挂号的科室名字");
                    String c=reader.next();
                    Dept dept=new Dept();
                    dept.setName(c);
                    boolean k=DeptDao.selectIs(dept);
                    if(!k){
                        System.out.print("挂号的科室名字有误!");
                        break;
                    }
                    Doc doc=new Doc();
                    doc.setRoomName(c);
                    Integer id= DocDao.selectDocId(doc);
                    Pat pat=new Pat(a,null,c);
                    Integer o=1;
                    Integer m= RecordDao.selectKey1();
                    if(m!=null){
                        o=m;
                    }
                    Date date=new Date();
                    SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    String strDate= sdf.format(date);
                    Record record=new Record(o,id,a,c,strDate);
                    RecordDao.insert(record);
                    PatDao.update(pat);
                    break;
                }
                case "2":{
                    Record record=new Record(a);
                    List<Record> list=RecordDao.select(record);
                    System.out.println("这是您所有的就诊记录,如需报销可保留此发票"+"\n");
                    for(Record record1 : list) {
                        System.out.printf("就诊记录id为" + record1.getId() + " 病人id为" + record1.getPat_id() + " 就诊科室名字为" + record1.getRoom_name() + " 就诊日期为" +
                                record1.getDate() + "\n");
                    }break;
                }
                case "3":{
                    flag=false;
                    break;
                }
            }
        }
    }

键入完成后,病人就能完成一次挂号操作,并重新返回平台,如果需要可以继续挂号。

或者查看自己的挂号记录

b.医生

public class DealDoc {
    static Scanner reader = new Scanner(System.in);

    public static void ControlDoc() {
        boolean flag=true;
        System.out.print("请输入你的id"+"\n");
        Integer b = reader.nextInt();
        Doc doc1 = new Doc(b);
        boolean e = DocDao.selectYes(doc1);
        if(!e){
            flag=false;
        }
        String g=DocDao.selectRoomName(doc1);
        while(flag){
            System.out.print("请选择操作"+"\n"+"1.显示病人列表"+"\n"+"2.对指定时间进行查询统计"+"\n"+"3.退出"+"\n");
            String t=reader.next();
            switch (t){
                case "1":{
                    Doc doc=new Doc(b,g);
                    List<Pat> list1=PatDao.DocSelect(doc);
                    System.out.println("以下为您负责科室的病人名单"+"\n");
                    for(Pat pat3 : list1){
                        System.out.printf("病人id为"+pat3.getId()+"\n"+"病人姓名为"+pat3.getName()+"\n"+"病人科室名字为"+pat3.getRoom_name()+"\n");
                    }
                    break;
                }
                case "2":{
                    List<Record> list=RecordDao.selectKey2();
                    List<Record> list1=RecordDao.selectKey3();
                    for(Record record : list){
                        System.out.printf("白天病例id为"+record.getId()+"\n"+"病人id为"+record.getPat_id()+"\n"+"病人科室名字为"+record.getRoom_name()+"\n");
                    }
                    for(Record record : list1){
                        System.out.printf("非白天病例id为"+record.getId()+"\n"+"病人id为"+record.getPat_id()+"\n"+"病人科室名字为"+record.getRoom_name()+"\n");
                    }
                    break;
                }
                case "3":{
                    flag=false;
                    break;
                }
            }
        }
    }
}

(3)输入a退出,其他任意则会重新登录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值