通常來說,在一個專案中我們會使用到多個dao,比如在一個資訊管理系統中,有 UserDao/ MessageDao等;
每個 dao 都有相同的 CRUD 程式碼,每個 dao 去寫也是可以的,但是程式碼量會偏多,程式碼結構不夠好,顯得比較臃腫;實際上可以通過泛型來抽取出一個 BaseDao,這個 BaseDao 包含了各個 dao 的增刪改查程式碼,建立新的 dao 時繼承BaseDao,就可以減少很多重複的程式碼,提高工作效率,優化程式碼結構!

下面我們先寫一個普通的Dao,然後抽取出BaseDao,看Dao前後程式碼變化。

1.抽取前的 dao 介面程式碼

package com.storm.user.dao;

import com.storm.user.entity.User;
import org.springframework.stereotype.Repository;
import java.io.Serializable;
import java.util.List;

@Repository
public interface UserDao {

    public int insert(User user);// 儲存

    public int delete(User user);// 刪除使用者

    public int update(Serializable id);// 更新使用者

    public User findById(Serializable id);// 根據主鍵查詢使用者

    public List<User> getList();// 檢視所有

}

2.建立 BaseDao 介面
這個介面不需要改動太多,只需要把基本的增刪改查程式碼改成泛型

package com.storm.base.dao;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * DAO基礎操作模板
 *
 * @param <E> 泛型
 * @param <PK> 主鍵
 *
 * @author zzz
 * @date 2018-01-19
 */
public interface BaseDao<E,PK extends Serializable> {

    /**
     * 新增操作
     *
     * @param entity 實體物件
     * @return
     */
    int insert(E entity);

    /**
     * 刪除操作
     *
     * @param id 主鍵
     * @return
     */
    int delete(Serializable id);

    /**
     * 修改操作
     *
     * @param entity 實體物件
     * @return
     */
    int update(E entity);

    /**
     * 獲取符合條件的單條資料
     *
     * @param param 實體物件
     * @return
     */
    E findById(Serializable id);

    /**
     * 獲取符合條件引數的所有資料
     *
     * @param param 實體物件
     * @return
     */
    List<E> getList();

}

3.修改抽取前的 dao 介面

package com.storm.user.dao;

import com.storm.base.dao.BaseDao;
import com.storm.user.entity.User;
import org.springframework.stereotype.Repository;
import java.util.List;

@Repository
public interface UserDao extends BaseDao<User,Long> {

    //A.把原來的通用的 CRUD 方法抽取到 BaseDao<E,PK extends Serializable>
    //B.繼承 BaseDao<E,PK extends Serializable>
    //C.所有基本的增刪改查都交給baseDao來處理.如果沒有新的業務,dao層程式碼基本是空
    //D.以後有新增的業務,只需要加新增的業務程式碼。整個UserDao 就沒有多少程式碼了。

    public List<User> selectUserByUserName();

}

<完>

.