JavaWeb Dao層架構設計

Java Web Dao層設計

UML設計圖

Dao層設計

實體類

package cn.zzuli.oa.domain;

public class Role {

}
package cn.zzuli.oa.domain;

public class User {

    private Long id;
    private String username;

    public User() {
        super();
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

}

BaseDao接口

package cn.zzuli.oa.base;

import java.util.List;

public interface BaseDao<T> {
    
    /**
     * 保存實體
     * @param entity
     */
    void save(T entity);
    
    /**
     * 刪除實體
     * @param id
     */
    void delete(Long id);
    
    /**
     * 更新實體
     * @param entity
     */
    void update(T entity);
    
    /**
     * 
     * @param id
     * @return
     */
    T getById(Long id);
    
    /**
     * 查詢實體
     * @param ids id的集合
     * @return
     */
    List<T> listByIds(Long[] ids);
    
    /**
     * 查詢所有
     * @return
     */
    List<T> listAll();
    
}

BaseDaoImpl代碼,實現(xiàn)BaseDao接口

package cn.zzuli.oa.base.impl;

import java.lang.reflect.ParameterizedType;
import java.util.Collections;
import java.util.List;

import javax.annotation.Resource;

import org.hibernate.Session;
import org.hibernate.SessionFactory;

import cn.zzuli.oa.base.BaseDao;

@SuppressWarnings("unchecked")
public abstract class BaseDaoImpl<T> implements BaseDao<T> {

    @Resource
    private SessionFactory sessionFactory;

    protected Class<T> clazz;
    
    public BaseDaoImpl() {
        //通過反射得到T的真實類型
        ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();//獲取這個父類的泛型類型
        this.clazz = (Class<T>) pt.getActualTypeArguments()[0]; //獲取第一個泛型T的類型
        
        System.out.println("clazz = " + clazz.getName());
    }
    

    @Override
    public void save(T entity) {
        getSession().save(entity);
    }

    @Override
    public void delete(Long id) {
        Object obj = getSession().get(clazz, id);
        getSession().delete(obj);
    }

    @Override
    public void update(T entity) {
        getSession().update(entity);
    }

    @Override
    public T getById(Long id) {
        return (T) getSession().get(clazz, id);
    }

    @Override
    public List<T> listByIds(Long[] ids) {
        if (ids == null || ids.length == 0) {
            return Collections.EMPTY_LIST;
        }
        return getSession().createQuery("FROM " + clazz.getSimpleName() + " WHERE id IN(:ids)")
                .setParameterList("ids", ids).list();
    }

    @Override
    public List<T> listAll() {
        return getSession().createQuery("FROM " + clazz.getSimpleName()).list();
    }

    /**
     * 獲取當前可用的Session
     * 
     * @return 當前可用的Session
     */
    protected Session getSession() {
        return sessionFactory.getCurrentSession();
    }

}

RoleDao接口,繼承BaseDao

package cn.zzuli.oa.dao;

import cn.zzuli.oa.base.BaseDao;
import cn.zzuli.oa.domain.Role;

public interface RoleDao extends BaseDao<Role> {

}

UserDao接口,繼承BaseDao

UserDao實現(xiàn)類UserDaoImpl可以實現(xiàn)的自己的功能代碼

package cn.zzuli.oa.dao;

import cn.zzuli.oa.base.BaseDao;
import cn.zzuli.oa.domain.User;

public interface UserDao extends BaseDao<User>{
    
}

RoleDaoImpl代碼,繼承BaseDaoImpl抡句,實現(xiàn)RoleDao

package cn.zzuli.oa.dao.impl;

import org.springframework.stereotype.Repository;

import cn.zzuli.oa.base.impl.BaseDaoImpl;
import cn.zzuli.oa.dao.RoleDao;
import cn.zzuli.oa.domain.Role;

@Repository
public class RoleDaoImpl extends BaseDaoImpl<Role> implements RoleDao {

}

UserDaoImpl代碼,繼承BaseDaoImpl杠愧,實現(xiàn)UserDao

package cn.zzuli.oa.dao.impl;

import org.springframework.stereotype.Repository;

import cn.zzuli.oa.base.impl.BaseDaoImpl;
import cn.zzuli.oa.dao.UserDao;
import cn.zzuli.oa.domain.User;

@Repository
public class UserDaoImpl extends BaseDaoImpl<User> implements UserDao{

}

測試類

package cn.zzuli.oa.base;

import org.junit.Test;

import cn.zzuli.oa.dao.RoleDao;
import cn.zzuli.oa.dao.UserDao;
import cn.zzuli.oa.dao.impl.RoleDaoImpl;
import cn.zzuli.oa.dao.impl.UserDaoImpl;
import cn.zzuli.oa.domain.Role;
import cn.zzuli.oa.domain.User;

public class BaseDaoTest {

    @Test
    public void testGetById() {
        UserDao userDao = new UserDaoImpl();
        RoleDao roleDao = new RoleDaoImpl();
        
    }

}

實現(xiàn)效果

實現(xiàn)效果

此處輸出的正是BaseDao實現(xiàn)類BaseDaoImple中構造方法獲取的泛型的類型待榔,

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子锐锣,更是在濱河造成了極大的恐慌腌闯,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件雕憔,死亡現(xiàn)場離奇詭異姿骏,居然都是意外死亡,警方通過查閱死者的電腦和手機斤彼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門分瘦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人琉苇,你說我怎么就攤上這事嘲玫。” “怎么了并扇?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵去团,是天一觀的道長。 經常有香客問我拜马,道長渗勘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任俩莽,我火速辦了婚禮旺坠,結果婚禮上,老公的妹妹穿的比我還像新娘扮超。我一直安慰自己取刃,他們只是感情好,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布出刷。 她就那樣靜靜地躺著璧疗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪馁龟。 梳的紋絲不亂的頭發(fā)上崩侠,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天,我揣著相機與錄音坷檩,去河邊找鬼却音。 笑死,一個胖子當著我的面吹牛矢炼,可吹牛的內容都是我干的系瓢。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼句灌,長吁一口氣:“原來是場噩夢啊……” “哼夷陋!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤骗绕,失蹤者是張志新(化名)和其女友劉穎藐窄,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體爹谭,經...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡枷邪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了诺凡。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡践惑,死狀恐怖腹泌,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情尔觉,我是刑警寧澤凉袱,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站侦铜,受9級特大地震影響专甩,放射性物質發(fā)生泄漏。R本人自食惡果不足惜钉稍,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一涤躲、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧贡未,春花似錦种樱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至消恍,卻和暖如春岂昭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背狠怨。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工约啊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人取董。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓棍苹,卻偏偏與公主長得像,于是被迫代替她去往敵國和親茵汰。 傳聞我的和親對象是個殘疾皇子枢里,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內容