中职学生JAVAweb练手简化的医院管理系统

医院管理系统

源码:https://pan.baidu.com/s/1wV8Sz_lpR5WSIHH2u0cG8w 提取码:6q9n
数据库文件:https://pan.baidu.com/s/16EfM41xYniXELWRT-ZANcg 提取码:dhm5
这里用javaweb进行数据库的增删改查操作,只是一个极其简单的程序,之所以叫医院管理系统,因为名字是老师定的,核心跟学生管理系统等一样。数据库连接也没用到连接池,网页前端的制作也没有编写,这里只是后端代码实现简单的增删改查功能。建议javaweb初学者学习。
思路

首先拿到这样的题目,应该先思考需要实现哪些功能,先不急着敲代码。对于管理系统,增删改查是肯定要的,医院系统,需要把医院医生信息和病人信息分隔开避免混淆。然后再做一下界面就满足老师的要求了。
1、数据库的建立

创建医院医生信息表和病人信息表,由于只是需要一些增删改查功能,我建的表很简单,医生表(用户名和密码),病人表(姓名和床位)。(没有设置主键,只有字段,简易展示一下)
数据库
创建各个包

这个看个人习惯,有点人喜欢先写前端代码再写后端,有的人喜欢先写后端数据库代码,再编写前端,我这里是从数据库开始编写的(后者),先创了多个包和一个.properties
包名
说明一下每个包的作用

    .bean:存放一些实体类
    .dao:存放数据访问的接口
    .dao.impl:数据访问接口的实现类
    .service:业务逻辑接口
    .servlet.impl:业务逻辑的接口实现类
    .servlet:web层代码
    .util:存放工具类
    .properties: 数据库连接文件

如果你是一个新手,你看到这可能会一头雾水,当然在厉害的程序员看来,这只是很基本的开发模式而已。为什么要用这个开发模式呢,这个开发模式就是简易的MVC开发模式。

    MVC模式的优点:降低各个模块之间的耦合,能够增强程序的可维护性和可扩展性,提高了模型的复用性。
    MVC模式的缺点:增加了程序源码的复杂性。

利用分层的思想将不同的模块内容分开,可以方便软件开发人员分工协作,提高开发效率。
编写实体类

分别编写病人和医生的实体类
病人

public class Patient {
   private String name;
   private String num;
   public Patient() {
      super();
      // TODO Auto-generated constructor stub
   }
   public Patient(String name, String num) {
      super();
      this.name = name;
      this.num = num;
   }
   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
   public String getNum() {
      return num;
   }
   public void setNum(String num) {
      this.num = num;
   }
   
}

医生

public class User {

   private String name;
   private String password;
   public User() {
      super();
      // TODO Auto-generated constructor stub
   }
   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
   public String getPassword() {
      return password;
   }
   public void setPassword(String password) {
      this.password = password;
   }
   public User( String name, String password) {
      super();
      this.name = name;
      this.password = password;
   }
}


没什么好解释的,跟数据库的字段对应就可以了
数据库的连接

JDBC规范在jdk中的
java.sql.;
javax.sql.;
这两个包下面,不过这里面都是接口,要想使用JDBC的话,需要下载相关的数据库驱动jar包,这里咱们使用的是MySQL数据库,所以需要下载MySQL的数据库驱动:网盘地址。
JDBC的四个核心接口:

    DriverManager:用于注册驱动并创建符合该驱动的数据库的连接。
    Connection: 表示与数据库创建的连接对象,即一个connection对应着一个会话,相当于在mysql workbench中打开了一个连接。
    Statement: 操作数据库sql语句的对象,有个两个实现类:Statement和PreparedStatement(常用)。
    ResultSet: 从数据库中查询的结果集。

基本上通过使用上面4个接口就能使用java实现对数据库的增删改查了。

为了提高可维护性,可以将这些经常变换内容写到一个配置文件中,这里创建一个名为db.properties的文件:

driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/hospital
username=root
password=123456


3306是Mysql的默认端口,hospital是数据库的名字
username是数据库的用户名,一般为root
password是数据库的密码,输入你的密码就可以了
创建数据库连接工具类

创建一个DBUtil的工具类,在这个类中注册驱动和获取连接:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ResourceBundle;

public class DButil {
   private static String driverClass;
   private static String url;
   private static String username;
   private static String password;
   static {
      ResourceBundle rb = ResourceBundle.getBundle("db");
      driverClass = rb.getString("driverClass");
      url = rb.getString("url");
      username = rb.getString("username");
      password = rb.getString("password");
      try {
         Class.forName(driverClass);
      } catch (ClassNotFoundException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }
   }

   public static Connection getConnection() throws SQLException {
      return DriverManager.getConnection(url, username, password);
   }
}

  
JDBC常用接口简单介绍一下

    DriverManager:该类的主要作用就是创建连接(不同的数据库,在forName中的参数写法不同)
    Statement:该接口的作用是操作sql语句,并返回相应结果的对象
    ResultSet:该接口的作用主要用来封装结果集。
    数据库的就不多说了,如果实在看不懂或者有问题,可以自行百度多看看大佬的文章。

编写Dao

主要实现的功能都写在这里,方便我们日后代码的调试.
医院管理员:

public interface UserDao {
   //医院管理员注册
   public void addUser(User user) throws Exception;
   
   //医生管理员登录
   public User findUserByNameAndPassword(User user) throws Exception;
}



病人:

public interface PatientDao {
   //查看病人
   public Map< Integer,Patient> Look() throws Exception;
   
   //添加病人
   public void addPatient(Patient patient)throws Exception;
   
   //删除病人
   public void deletePatient(Patient patient)throws Exception;
   
   //通过床号判断是否有人
   public int findId(Patient patient)throws Exception;
}

 

注释写的很明白了,这里两个都是接口。接下来写实现类。
.dao.impl实现类的编写

病人:

public class PatientDaoImpl implements PatientDao {
    //查看病人
   //@Override
   public Map< Integer,Patient> Look() {
      Connection conn = null;
      PreparedStatement ps = null;
      ResultSet rs = null;
      Map<Integer,Patient> map=new HashMap<>();
      Patient patient = null;
      int a = 1;
      String sql="select * from patient";
      try {
         conn = DButil.getConnection();
         ps=conn.prepareStatement(sql);
         rs=ps.executeQuery();
         while(rs.next()) {
            patient = new Patient();
            patient.setName(rs.getString(1));
            patient.setNum(rs.getString(2));
            map.put(a, patient);
            a++;
         }
      } catch (SQLException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }
      return map;
   }

   //添加病人
   //@Override
   public void addPatient(Patient patient)  {
      // TODO Auto-generated method stub
      Connection conn = null;
      PreparedStatement ps =null;
      String sql=" insert patient(`name`,`id`) value (?,?); ";
      try {
         conn=DButil.getConnection();
         ps=conn.prepareStatement(sql);
         ps.setString(1, patient.getName());
         ps.setString(2, patient.getNum());
         ps.executeUpdate();
      } catch (SQLException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }
   }

   @Override
   public void deletePatient(Patient patient) {
      Connection conn=null;
      PreparedStatement ps =null;
      String sql = "delete from patient where name =?";
      try {
         conn=DButil.getConnection();
         ps=conn.prepareStatement(sql);
         ps.setString(1, patient.getName());
         ps.executeUpdate();
      } catch (SQLException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }
      
   }

   @Override
   public int findId(Patient patient) throws Exception {
      Connection conn = null;
      PreparedStatement ps = null;
      ResultSet rs = null;
      int a = 0;
      String sql = "select name, id from patient where id=?";
      conn = DButil.getConnection();
      ps = conn.prepareStatement(sql);
      ps.setString(1, patient.getNum());
      rs = ps.executeQuery();
      if(rs.next()) {
         a=1;
      }
      return a;
   }

   

医生:

//注册医院管理员
   @Override
   public void addUser(User user) {
      // TODO Auto-generated method stub
      Connection conn=null;
      PreparedStatement ps =null;
      String sql="insert h_user(`name`,`password`) value (?,?)";
      try {
         conn=DButil.getConnection();
         ps=conn.prepareStatement(sql);
         ps.setString(1, user.getName());
         ps.setString(2, user.getPassword());
         ps.executeUpdate();
      } catch (SQLException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }
   }
   //医院管理员登录
   @Override
   public User findUserByNameAndPassword(User user) throws Exception {
       Connection conn = null;
       PreparedStatement ps = null;
       ResultSet rs = null;
       User u = null;
       try {
           conn = DButil.getConnection();
           ps = conn.prepareStatement("select * from h_user where name=? and password=?");
           ps.setString(1, user.getName());
           ps.setString(2, user.getPassword());

           rs = ps.executeQuery();
           if(rs.next()){
               u = new User();
               u.setName(rs.getString(1));
               u.setPassword(rs.getString(2));
           }
       } catch (Exception e) {
           e.printStackTrace();
       }
       return u;
   }

  

看起来代码挺多的,其实都是些差不多的重复性代码。拿查看病人为例,步骤如下:

    创建Connection对象、PreparedStatement对象、ResultSet对象。
    创建Map<Integer,Patient>用来接收返回的数据
    编写原生SQL:“select * from patient”
    创建连接:conn = DButil.getConnection();
    用PreparedStatement对象执行SQL语句
    然后用ResultSet对象接收结果。
    用while语句循环,把结果放到我们的Map中。返回Map

再比如添加病人这段:

    创建Connection对象、PreparedStatement对象
    编写原生SQL:insert patient(name,id) value (?,?)由于这里的查询条件需要我们网页输入的信息来判断,约束条件有?代替。
    PreparedStatement对象的executeUpdate()方法来更新数据库。

其他的不说了,差不多的代码,就SQL语句不同,返回的值不同而已。
逻辑层代码

医生:

public interface UserService {
   //医院管理员注册
   public void addUser(User user)throws Exception;
   
   //医院管理员登录
   public User findUserByNameAndPassword(User user) throws Exception;
}

  

病人:

public interface PatientService {
   //查看病人
   public Map<Integer,Patient> Look() throws Exception;
   
   //添加病人
   public void addPatient(Patient patient) throws Exception;
   
   //删除病人
   public void deletePatient(Patient patient) throws Exception;

   //查找床号
   public int findId(Patient patient)throws Exception;
}

   

这里的代码和Dao里的代码完全一样。就不说了。
逻辑层实现类

医生:

public class UserServiceImpl implements UserService {
   UserDao u = new UserDaoImpl();
   //医院管理员登录
   @Override
   public void addUser(User user) throws Exception {
      // TODO Auto-generated method stub
      u.addUser(user);
   }
   @Override
   public User findUserByNameAndPassword(User user) throws Exception {
       return u.findUserByNameAndPassword(user);
   }
}

  

病人:

public class PatientServiceImpl implements PatientService {

   PatientDao pd = new PatientDaoImpl();
   @Override
   public Map<Integer,Patient> Look() throws Exception {
      return pd.Look();
   }
   //添加病人
   @Override
   public void addPatient(Patient patient) throws Exception {
      // TODO Auto-generated method stub
      pd.addPatient(patient);
   }
   @Override
   public void deletePatient(Patient patient) throws Exception {
      // TODO Auto-generated method stub
      pd.deletePatient(patient);
   }
   @Override
   public int findId(Patient patient) throws Exception {
      return pd.findId(patient);
   }

}

   

这里的实现类相信你应该能看明白,因为就创建了之前数据层的接口实现类的实例,然后调用其方法而已。有一点要注意:因为是接口,所以接口在实例化的时候跟类不一样:

UserDao u = new UserDaoImpl();

    1

PatientDao pd = new PatientDaoImpl();

    1

Servlet类的编写

为了方便观看学习研究,我把增删改查做了4个servlet,来分别实现其功能。
由于前段代码过于简陋就不贴了,无非就几个表单。
医院管理员注册

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      request.setCharacterEncoding("UTF-8");
      response.setContentType("text/html;charset=UTF-8");
      User u = new User();
      u.setName(request.getParameter("username"));
      u.setPassword(request.getParameter("password"));
      UserService us = new UserServiceImpl();
      PatientService ps = new PatientServiceImpl();
      try {
         us.addUser(u);
         request.getSession().setAttribute("user", u);
         Map<Integer,Patient> map = ps.Look();
          request.getServletContext().setAttribute("map",map);
            request.getRequestDispatcher("/login_success.jsp").forward(request, response);
      } catch (Exception e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }

    

重写doGet方法,由于还没有写字符编码过滤器,先确定编码,然后用一个User对象接受表单数据。实现业务逻辑层代码的实例:

UserService us = new UserServiceImpl();
PatientService ps = new PatientServiceImpl();

    1
    2

用us的addUser()方法,把注册的医生放到数据库中
用ps的Look()方法,把目前的病人信息展示给这名医生。
最后返回jsp显示到页面上。
医院管理员登录

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       request.setCharacterEncoding("UTF-8");
           response.setContentType("text/html;charset=UTF-8");
           User user = new User();
           user.setName(request.getParameter("name"));
           user.setPassword(request.getParameter("password"));

           UserService us = new UserServiceImpl();

           try {
               User u = us.findUserByNameAndPassword(user);

               //分发转向
               if(u!=null){
                   //如果登录成功,就把user对象放到session对象中
                   request.getSession().setAttribute("user", u);
                   PatientService ps = new PatientServiceImpl();
                 Map<Integer,Patient> map = ps.Look();
                 request.getServletContext().setAttribute("map",map);
                   request.getRequestDispatcher("/login_success.jsp").forward(request, response);
               }else{
                   request.setAttribute("msg", "用户名或密码不正确!");
                   request.getRequestDispatcher("/login.jsp").forward(request, response);
               }
           } catch (Exception e) {
               e.printStackTrace();
           }
       }

   

刚刚是注册,现在是登录,前面基本差不多,不过需要findUserByNameAndPassword()方法先判断一下该用户是否已经注册过

    如果没有,页面会返回,提示登录失败。
    如果有,登录成功,再把病人信息调出来显示

添加病人

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      request.setCharacterEncoding("UTF-8");
      response.setContentType("text/html;charset=UTF-8");
      Patient patient = new Patient();
      patient.setName(request.getParameter("patientname"));
      patient.setNum(request.getParameter("num"));
      PatientService ps = new PatientServiceImpl();
      try {
         if(ps.findId(patient)==0) {             
            ps.addPatient(patient);
            Map<Integer,Patient> map = ps.Look();
            request.getServletContext().setAttribute("map",map);
            request.getRequestDispatcher("/login_success.jsp").forward(request, response);
         }else {
            request.setAttribute("addFalsepatient",patient );
            request.getRequestDispatcher("/Addfalse.jsp").forward(request, response);
         }
      } catch (Exception e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }
   }

   
接受表单数据后,需要先去数据库中查询,是否存在这位病人,根据床号是否空余给病人安排床号。添加成功后重新调用PatientService的Look()方法,刷新病人信息反馈给医生
删除病人

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      request.setCharacterEncoding("UTF-8");
      response.setContentType("text/html;charset=UTF-8");
      Patient patient = new Patient();
      patient.setName(request.getParameter("deleteName"));
      PatientService ps = new PatientServiceImpl();
      try {
         ps.deletePatient(patient);
         Map<Integer,Patient> map = ps.Look();
          request.getServletContext().setAttribute("map",map);
            request.getRequestDispatcher("/login_success.jsp").forward(request, response);
      } catch (Exception e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }
   }

   

如果你看懂了前面几个,这个你肯定不难看出其原理。这个删除功能就留给你思考吧。
总结

这样简单的项目就写完了。当然只适合给没有多少基础的javaweb初学者参考。因为这里的代码都是很简易的版本,实际应用比这个要复杂的多的多。但是完整的敲完这些代码也能让我们更好的体会到MVC这种开发模式。对分层思想有更好的体悟。
一些问题

    当请求request中携带了用户提交的数据时,需要将这些数据封装到JavaBean中,像之前写法需要一一赋值,倘若request携带了非常多的表单数据,此时的赋值操作就显得比较繁琐了,那有没有好的解决方法呢?这里可以使用apache的commons-beanutils搞定这个问题。
    密码在储存过程中换需要加密过程。
    在项目中还需要加入权限代码的编写,和过滤器的使用。

猜你喜欢

转载自blog.csdn.net/qq_27248989/article/details/84969545