JDBC---數據庫連接增刪改查

 
到這裏,我意識到這個系統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";
 
     String sql="SELECT * FROM  t_table"   //查詢整個表
    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.getName() + "',整形用"+ patient.getAge() + "

        
    //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,還有構造時也要注意是否需要'',這個最好是
先測試,然後編寫代碼!
 
 
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章