1. 程式人生 > >Java通過JDBC 進行Dao層的封裝

Java通過JDBC 進行Dao層的封裝

前言

前面有一章節,我專門講解了Java通過JDBC 進行MySQL資料庫操作,這主要講解了MySQL資料庫的連線和簡單的操作,但是在真正的java專案中,我們要不斷的和資料庫打交道,為了提高資料庫操作的執行效率和增加程式碼的複用性,將重新封裝一個Dao層,也就是資料訪問層 ,用來訪問資料庫實現資料的持久化。

Dao層設計

Dao層操作通用的步驟:

  • 1.寫SQL語句
  • 2.獲取連線
  • 3.建立stmt
  • 4.執行sql

a)更新
String sql = “delete from admin where id=?””;
String sql = “insert into admin (userName,pwd) values (?,?)”
public void update(String sql, Object[] paramValues);

b)查詢
String sql = “select * from admin”;
String sql = “select * from admin where id=? And pwd =?”;
// 傳入的什麼型別的物件,就封裝為什麼型別
// 要求: 列的名稱,要與指定型別的物件的屬性名稱一樣
Public List query (String sql , Object[] paramValues , Class clazz);
T t; // 物件賦值

  • 5.關閉/異常

編寫BaseDao,自己寫的所有的Dao都繼承此類

/**
 * 通用的dao,自己寫的所有的dao都繼承此類;
 * 此類定義了2個通用的方法:
 *  1. 更新
 *  2. 查詢
 * @author Charlie.chen
 *
 */
public class BaseDao {

    // 初始化引數
    private Connection con;
    private PreparedStatement pstmt;
    private ResultSet rs;


    /**
     * 查詢的通用方法
     * @param sql
     * @param paramsValue
     */
public <T> List<T> query(String sql, Object[] paramsValue,Class<T> clazz){ try { // 返回的集合 List<T> list = new ArrayList<T>(); // 物件 T t = null; // 1. 獲取連線 con = JdbcUtil.getConnection(); // 2. 建立stmt物件 pstmt = con.prepareStatement(sql); // 3. 獲取佔位符引數的個數, 並設定每個引數的值 int count = pstmt.getParameterMetaData().getParameterCount(); if (paramsValue != null && paramsValue.length > 0) { for (int i=0; i<paramsValue.length; i++) { pstmt.setObject(i+1, paramsValue[i]); } } // 4. 執行查詢 rs = pstmt.executeQuery(); // 5. 獲取結果集元資料 ResultSetMetaData rsmd = rs.getMetaData(); // ---> 獲取列的個數 int columnCount = rsmd.getColumnCount(); // 6. 遍歷rs while (rs.next()) { // 要封裝的物件 t = clazz.newInstance(); // 7. 遍歷每一行的每一列, 封裝資料 for (int i=0; i<columnCount; i++) { // 獲取每一列的列名稱 String columnName = rsmd.getColumnName(i + 1); // 獲取每一列的列名稱, 對應的值 Object value = rs.getObject(columnName); // 封裝: 設定到t物件的屬性中 【BeanUtils元件】 BeanUtils.copyProperty(t, columnName, value); } // 把封裝完畢的物件,新增到list集合中 list.add(t); } return list; } catch (Exception e) { throw new RuntimeException(e); } finally { JdbcUtil.closeAll(con, pstmt, rs); } } /** * 更新的通用方法 * @param sql 更新的sql語句(update/insert/delete) * @param paramsValue sql語句中佔位符對應的值(如果沒有佔位符,傳入null) */ public void update(String sql,Object[] paramsValue){ try { // 獲取連線 con = JdbcUtil.getConnection(); // 建立執行命令的stmt物件 pstmt = con.prepareStatement(sql); // 引數元資料: 得到佔位符引數的個數 int count = pstmt.getParameterMetaData().getParameterCount(); // 設定佔位符引數的值 if (paramsValue != null && paramsValue.length > 0) { // 迴圈給引數賦值 for(int i=0;i<count;i++) { pstmt.setObject(i+1, paramsValue[i]); } } // 執行更新 pstmt.executeUpdate(); } catch (Exception e) { throw new RuntimeException(e); } finally { JdbcUtil.closeAll(con, pstmt, null); } }

編寫實際操作的Dao類繼承自BaseDao

public class AdminDao extends BaseDao {

    // 刪除
    public void delete(int id) {
        String sql = "delete from admin where id=?";
        Object[] paramsValue = {id};
        super.update(sql, paramsValue);
    }

    // 插入
    public void insert(Admin admin) {
        String sql = "insert into admin (userName,pwd) values (?,?)";
        Object[] paramsValue = {admin.getUserName(),admin.getPwd()};
        super.update(sql, paramsValue);
    }

    // 查詢全部
    public List<Admin> getAll(){
        String sql = "select * from admin";
        List<Admin> list = super.query(sql, null, Admin.class);
        return list;
    }

    // 根據條件查詢(主鍵)
    public Admin findById(int id){
        String sql = "select * from admin where id=?";
        List<Admin> list = super.query(sql, new Object[]{id}, Admin.class);
        return  (list!=null&&list.size()>0) ? list.get(0) : null;
    }
}

JavaBean類

/**
 * 1. bean類設計
 * @author Charlie.chen
 *
 */
public class Admin {

    private int id;
    private String userName;
    private String pwd;
    private int age;
    private Date birth;


    public Date getBirth() {
        return birth;
    }
    public void setBirth(Date birth) {
        this.birth = birth;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getPwd() {
        return pwd;
    }
    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    @Override
    public String toString() {
        return "Admin [age=" + age + ", birth=" + birth + ", id=" + id
                + ", pwd=" + pwd + ", userName=" + userName + "]";
    }   
}