zoukankan      html  css  js  c++  java
  • RCP之病人信息系统开发总结(11):DAO模式设计

    写到这里,我意识到这个系统MVC中的C放置在各个V中了,所以C就不介绍了,哈哈哈
    接着总结DAO层,这个系统我采用的应该算是标准的DAO设计模式
    还没有完全写完的dao包
    DAO的结构图
     
    DAO数据访问层的开发:
    1.设计基类DAOBase类
    提供标准的获得和关闭数据库连接的方法
    package com.yinger.patientims.dao; 

    import java.sql.Connection;
    import java.sql.DriverManager;

    /**
     * 数据库操作的基础类,它是其他的DAO类的父类
     * 定义了建立数据库连接和关闭数据库连接的方法
     */

    public class DAOBase {
      private Connection connection;

      // 得到数据库连接
      public Connection getConnection() {
        try {
          Class.forName("com.mysql.jdbc.Driver");
          connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/patientims", "root", "root");
        } catch (Exception e) {
          e.printStackTrace();
        }
        return connection;
      }

      // 关闭数据库连接
      public void closeConnnection() {
        try {
          connection.close();
        } catch (Exception e) {
          e.printStackTrace();
        } finally {
          if (connection != null) {
            connection = null;
          }
        }
      }

    }
     
    2.编写各个Model层对象对应的DAO类
    例如 PatientDAO
    注意一个方法 setOnePatient 方法,这个方法很有用的,其作用是将数据库中取出的一条记录放置到一个Patient对象上,所以该方法
    最好是能够独立出来,以便重复使用!
    package com.yinger.patientims.dao; 

    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.List;

    import com.yinger.patientims.model.Patient;
    import com.yinger.patientims.util.DBUtil;

    public class PatientDAO extends DAOBase {

      // 得到所有住院的病人的信息
      // SELECT
      // p.id,p.name,p.age,p.sex,p.address,p.logtime,p.phone,d.name,b.sickbedno,r.sickroomno
      // FROM t_patient p,t_department d,t_sickbed b,t_sickroom r
      // WHERE p.sickbed_id=b.id and b.sickroom_id=r.id and r.department_id=d.id
      public List<Patient> getPatientInfoList() {
        Patient patient;
        List<Patient> list = new ArrayList<Patient>();
        // 注意:这里有两个name,要使用到别名
        String sql = "SELECT p.id,p.name as pname,p.age,p.sex,p.address,p.logtime,p.phone,d.name as dname,b.sickbedno,r.sickroomno "
            + "FROM t_patient p,t_department d,t_sickbed b,t_sickroom r "
            + "WHERE p.sickbed_id=b.id and b.sickroom_id=r.id and r.department_id=d.id";
        Connection connection = null;
        // 在finally中使用它是它必须要初始化
        // 还有,它一定要放在外面,这样在try外面(finally)才可以被访问到
        // 还有,一定要有finally!关闭数据库连接是很重要的!
        try {
          connection = getConnection();
          PreparedStatement pStatement = connection.prepareStatement(sql);
          ResultSet resultSet = pStatement.executeQuery();
          while (resultSet.next()) {
            patient = setOnePatient(resultSet);
            list.add(patient);
          }
        } catch (Exception e) {
          e.printStackTrace();
        } finally {
          try {
            connection.close();
          } catch (SQLException e) {
            e.printStackTrace();
          }
        }
        return list;
      }

      // 将数据库中的一条patient记录关联到一个Patient对象中
      // 并且它不处理异常,抛出由上层处理
      private Patient setOnePatient(ResultSet resultSet) throws Exception {
        Patient patient = new Patient();
        if (resultSet.getLong("id") != 0) {
          patient.setId(resultSet.getLong("id"));
        }
        if (resultSet.getString("pname") != null) {
          patient.setName(resultSet.getString("pname"));
        }
        if (resultSet.getString("sex") != null) {
          patient.setSex(resultSet.getString("sex"));
        }
        if (resultSet.getString("phone") != null) {
          patient.setPhone(resultSet.getString("phone"));
        }
        if (resultSet.getString("address") != null) {
          patient.setAddress(resultSet.getString("address"));
        }
        if (resultSet.getInt("age") != 0) {
          patient.setAge(resultSet.getInt("age"));
        }
        if (resultSet.getDate("logtime") != null) {
          patient.setLogtime(resultSet.getDate("logtime"));
        }
        if (resultSet.getString("dname") != null) {
          // 注意这一步!这里容易发生空指针异常!在一个Patient对象中Department等属性并没有被初始化!
          // 所以要在类中new出各个对象,对于SickRoom等等同理
          patient.getDepartment().setName(resultSet.getString("dname"));
        }
        if (resultSet.getInt("sickbedno") != 0) {
          patient.getSickbed().setSickBedNo(resultSet.getInt("sickbedno"));
        }
        if (resultSet.getInt("sickroomno") != 0) {
          patient.getSickroom().setSickRoomNo(resultSet.getInt("sickroomno"));
        }
        return patient;
      }

      // 删除病人信息
      public boolean deletePatient(Patient patient) {
        Long id = patient.getId();
        Connection connection = null;
        String sql = "delete from t_patient where id=" + id + "";
        try {
          connection = getConnection();
          PreparedStatement pStatement = connection.prepareStatement(sql);
          int res = pStatement.executeUpdate();
          if (res > 0) {
            return true; // 注意:这里虽然是return了,但是这个方法真正返回之前还是要执行finally
          }
        } catch (Exception e) {
          e.printStackTrace();
        } finally {
          try {
            connection.close();
          } catch (SQLException e) {
            e.printStackTrace();
          }
        }
        return false;
      }

      // 添加病人住院信息
      public boolean insertPatient(Patient patient) {
        Connection connection = null;
        // INSERT INTO
        // t_patient(name,sex,age,phone,logtime,address,sickbed_id) VALUES
        // ('patient"+i+"','女',37,'1533535354','2011-10-10','TianJin',"+id+")
        String sql = "INSERT INTO t_patient(name,sex,age,phone,logtime,address,sickbed_id) VALUES ('" + patient.getName() + "','" + patient.getSex() + "',"
            + patient.getAge() + ",'" + patient.getPhone() + "','" + DBUtil.simpleDateFormat.format(patient.getLogtime()) + "','" + patient.getAddress() + "',"
            + patient.getSickbed().getId() + ")";
        //patient.getLogtime().toLocaleString() 已经不推荐使用了
        //注意:时间是有点特别地,一定要 patient.getLogtime().toLocaleString(),或者是使用 DateFormater进行format一下!
        try {
          connection = getConnection();
          PreparedStatement pStatement = connection.prepareStatement(sql);
          int res = pStatement.executeUpdate();
          if (res > 0) {
            return true; // 注意:这里虽然是return了,但是这个方法真正返回之前还是要执行finally
          }
        } catch (Exception e) {
          e.printStackTrace();
        } finally {
          try {
            connection.close();
          } catch (SQLException e) {
            e.printStackTrace();
          }
        }
        return false;
      }

      // 修改病人住院信息
      public boolean updatePatient(Patient patient) {
        Connection connection = null;
        //UPDATE t_patient as p set p.name='yyh' , p.address='ghalsdhgl' , p.age=24 , p.phone='523659365', p.sex='female'
        // where id=6
        StringBuffer sql = new StringBuffer("UPDATE t_patient as p ");
        sql.append(" set p.name='"+patient.getName()+"' ");
        sql.append(", p.address='"+patient.getAddress()+"' ");
        sql.append(" , p.age="+patient.getAge()+" ");
        sql.append(" , p.phone='"+patient.getPhone()+"' ");
        sql.append(", p.sex='"+patient.getSex()+"' ");
        sql.append(" ,p.sickbed_id= "+patient.getSickbed().getId()+" ");
        sql.append(" where id="+patient.getId());
        try {
          connection = getConnection();
          PreparedStatement pStatement = connection.prepareStatement(sql.toString());
          int res = pStatement.executeUpdate();
          if (res > 0) {
            return true; 
          }
        } catch (Exception e) {
          e.printStackTrace();
        } finally {
          try {
            connection.close();
          } catch (SQLException e) {
            e.printStackTrace();
          }
        }
        return false;
      }

    }
     
     
    再比如:DepartmentDAO类
     
    package com.yinger.patientims.dao; 

    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.List;

    import com.yinger.patientims.model.Department;

    public class DepartmentDAO extends DAOBase{

    //  private List departmentList = new ArrayList();
    //  private Department department;

      // 得到所有的科室
      public List<Department> getDepartmentList(){
        Department department;
        List<Department> list = new ArrayList<Department>();
        Connection connection = null;
        String sql = "select id,name from t_department";
        try {
          connection = getConnection();
          PreparedStatement pStatement = connection.prepareStatement(sql);
          ResultSet resultSet = pStatement.executeQuery();
          while (resultSet.next()) {
            department = setOneDepartment(resultSet);
            list.add(department);
          }
          pStatement.close();
        } catch (Exception e) {
          e.printStackTrace();
        } finally{
          try {
            connection.close();// Quick Fix : Ctrl + 1
          } catch (SQLException e) {
            e.printStackTrace();
          }
        }
        return list;
      }

      // 从数据库中取出一条记录并保存到一个Department中
      private Department setOneDepartment(ResultSet resultSet) throws Exception {
        Department department = new Department();
        if(resultSet.getLong("id")!=0){
          department.setId(resultSet.getLong("id"));
        }
        if(resultSet.getString("name")!=null){
          department.setName(resultSet.getString("name"));
        }
        return department;
      }

    }
     
    3.总结:
    (1)注意DAO类中每个操作的语句结构,一定要捕捉异常进行处理,一定要有finally,并在其中关闭连接
    (2)注意数据库中取出来的数据的类型和Model的该属性的类型
    (3)注意方法的返回值,是否要返回值?
    (4)注意sql语句的构造,如果多次使用字符串的合并建议使用高效率的StringBuilder,还有构造时也要注意是否需要'',这个最好是
    先测试,然后编写代码!
     





  • 相关阅读:
    Vue-cli的安装和使用
    Codeforces Round #182 (Div. 1) B. Yaroslav and Time 最短路
    HDU 4745 Two Rabbits 区间dp_回文序列
    Codeforces Round #284 (Div. 1) C. Array and Operations 二分图最大匹配
    HDU 4734 F(x) 数位dp
    HDU 4389 X mod f(x) 数位dp
    HDU 5900 QSC and Master 区间dp
    Codeforces Round #235 (Div. 2) D. Roman and Numbers 状压dp+数位dp
    HDU 3709 Balanced Number 数位dp
    Codeforces Round #304 (Div. 2) E. Soldier and Traveling 最大流
  • 原文地址:https://www.cnblogs.com/yinger/p/2255660.html
Copyright © 2011-2022 走看看