2011年1月29日 星期六

【Java Web】DAO 簡介

DAO 主要是讓處理及操作資料庫更為方便,用來封裝資料庫持久層的操作

即可將很多複雜的資料操作語法和業務邏輯分開

探討其思想其實也是一種 ORM 的概念,以下簡介其基本組成

通常會有一個 DAO 的介面以及一個 DAO 的實現類別

以下以一個用戶註冊或登錄的過程做介紹,首先先來看一下 DAO Interface
package fsc.regLog.dao
public interface UserDao
{
    //登入時,如果成功即回傳一個封裝後的 User 物件,
    public User login(String username, String password);
    //註冊
    public void register(User u);
    //檢查 User 是否存在
    public boolean checkUser(User u);
}

通常 DAO Interface 的設計需考量的是這個資料庫表單所有可能的操作

如以上針對 User 可能會有註冊、檢查、登錄、修改等

以下是實現 DAO 操作物件的 javabean

package fsc.regLog.model;
public class User
{
    private int id;
    private String username;
    private String password;

    public User(){}

    //other getter & setter
}

最後則是實現 DAO 介面的類別
package fsc.regLog.dao;
import java.sql.*;
public class UserDaoImpl implements UserDao
{
    public User login(String username, String password)
    {
        String sql = "SELECT * FROM User_Table WHERE username = ? AND password = ?";
        Connection conn = new DataBase().getConnection(); 
        try{
            PreparedStatement pstmt = conn.prepareStatement();
            pstmt.setInt(1, u.getId());
            pstmt.setString(2, u.getUsername());
            pstmt.setString(3, u.getPassword());
            ResultSet result = pstmt.executeUpdate();
            if(result.next())
            {
                 User u = new User();
                 u.setId(result.getInt("id"));
                 u.setUsername(username);
                 u.setPassword(password);
                 return u;
            }
        }catch(java.sql.SQLException e){}
        finally{
            conn.close();
        }
        return null;
    }
    
    public void register(User u)
    {
        String sql = "INSERT INTO User_Table (id, username, password) VALUES (?,?,?)";
        Connection conn = new DataBase().getConnection(); 
        try{
            PreparedStatement pstmt = conn.prepareStatement();
            pstmt.setInt(1, u.getId());
            pstmt.setString(2, u.getUsername());
            pstmt.setString(3, u.getPassword());
            pstmt.executeUpdate();
            
        }catch(java.sql.SQLException e){}
        finally{
            conn.close();
        }
    }
    
    public boolean checkUser(User u)
    {
        String sql = "SELECT * FROM User_Table WHERE username = ?";
        Connection conn = new DataBase().getConnection(); 
        try{
            PreparedStatement pstmt = conn.prepareStatement();
            pstmt.setString(1, u.getUsername());
            ResultSet result = pstmt.executeUpdate();
            if(result.next())  //已存在
            {
                 return true;  
            }
        }catch(java.sql.SQLException e){}
        finally{
            conn.close();
        }
        return false;
    }
}

1 則留言:

  1. 你好!
    我最近才剛學物件導向, 我有一個問題想請教一下.
    我們定義的 Interface, 被一個 Class Implements 後, 裡面的每個 Method 都要重新寫一遍.
    那為什麼我們不要直接寫在 Class 裡面呢?

    回覆刪除