OA項目實戰學習(1)


前面我們已經搭建好了開發環境所需要的框架,並將它們整合在了一起。

今天,我們主要完成:日志說明、資源分類,BaseDao與BaseDaoImpl的設計。

日志說明:




測試日志:

資源分類:




BaseDao與BaseDaoImpl的設計:


1,設計 BaseDao 與 BaseDaoImpl
1,設計接口 BaseDao
1,每個實體都應有一個對應的Dao接口,封裝了對這個實體的數據庫操作。例
實體Dao接口實現類
========================================================
User--> UserDao--> UserDaoImpl
Role--> RoleDao--> RoleDaoImpl
Department--> DepartmentDao--> DepartmentDaoImpl
Article--> ArticleDao--> ArticleDaoImpl
...
2,在每個Dao接口中都應有一個基本的增刪改查的方法,
但每個Dao接口中都寫一遍就是重復的代碼,可以把這些方法抽取到一個父接口中,定義為:
public interface BaseDao<T> {
save(entity : T) : void
delete(id : Serializable) : void
update(entity : T) :void
getById(id : Serializable) : T
getByIds(ids : Serializable[]) : List<T>
findAll() : List<T>
}
3,說明:
1,使用泛型的技術,可以在使用時更方便,如:User user = userDao.getById(1L); // 不需要強制轉型
2,getById(id : Long) 與 getByIds(ids : Long[]) 不要合並為一個有可變參數的方法,
因為那個用起來就不方便了,比如要經常使用的根據一個id獲取一個對象時就很不方便:
List<User> list = userDao.getByIds(1L); User user = list.size() > 0 ? list.get(0) : null。
3,以后再有Dao接口就可以繼承這個 BaseDao,以擁有基本的增刪改查方法,如:
UserDao extends BaseDao<User>
RoleDao extends BaseDao<Role>
2,設計實現類 BaseDaoImpl
1,每個Dao的接口還要有相應的實現類才可以,在每個DaoImpl中都要實現Dao接口中定義的所有方法,
當然也包括公共的增刪改查方法(BaseDao中定義的6個基本方法)。
2,每個DaoImpl中都實現一遍公共方法顯示是重復的,所以也可以抽取出來為一個父類BaseDaoImpl,
在BaseDaoImpl中實現了BaseDao接口的所有方法,我們的DaoImpl只需要繼承他就可以不用重復的寫公共方法的實現了。
聲明如下:
public class BaseDaoImpl<T> implements BaseDao<T> {
@Resource private SessionFactory sessionFactory; // 讓Spring注入sessionFactory
private Class<T> clazz; // 要想辦法得到T的Class

public void save(T entity) { }
public void delete(Long id) { }
public void update(T entity) { }
public T getById(Long id) { }
public List<T> getByIds(Long[] ids) { }
public List<T> findAll() { }
}
在實現方法時,獲取Session的代碼為:sessionFactory.getCurrentSession()
3,在獲取clazz時有兩種方法
1,方法一:
1,把clazz聲明成protected修飾符的,這樣子類中就可以訪問了,
2,在每個子類的構造方法中傳遞這個屬性的值,如:
public RoleDaoImpl() { clazz = Role.class; }
public UserDaoImpl() { clazz = User.class; }
2,方法二:使用反射的方式:
1,在BaseDaoImpl的默認構造方法中寫如下代碼就可以了:
ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();
clazz = (Class) pt.getActualTypeArguments()[0];
2,說明:BaseDaoImpl不能直接使用,只能使用他的子類,否則這段代碼就無效了。
代碼實現:
BaseDao.java
package cn.xbmu.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
* @return
*/
List<T> getByIds(Long[] ids);
/**
* 查詢所有
* @return
*/
List<T> findAll();
}

BaseDaoImpl.java
package cn.xbmu.oa.base;

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;
public 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];
System.out.println("clazz="+clazz.getName());
}

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

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

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


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

public List<T> getByIds(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();
}

public List<T> findAll() {
return getSession().createQuery(//
"FROM "+clazz.getSimpleName())//
.list();
}
/**
* 獲取當前可用的session
* @return
*/
protected Session getSession() {
return sessionFactory.getCurrentSession();
}

}
RoleDao.java
package cn.xbmu.oa.dao;

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

public interface RoleDao extends BaseDao<Role>{

}

RoleDaoImpl.java
package cn.xbmu.oa.dao.impl;

import cn.xbmu.oa.base.BaseDaoImpl;
import cn.xbmu.oa.dao.RoleDao;
import cn.xbmu.oa.domain.Role;

public class RoleDaoImpl extends BaseDaoImpl<Role> implements RoleDao{

}

UserDao.java
package cn.xbmu.oa.dao;

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

public interface UserDao extends BaseDao<User>{

}
UserDaoImpl.java
package cn.xbmu.oa.dao.impl;

import cn.xbmu.oa.base.BaseDaoImpl;
import cn.xbmu.oa.dao.UserDao;
import cn.xbmu.oa.domain.User;

public class UserDaoImpl extends BaseDaoImpl<User> implements UserDao{


}
BaseDaoTest.java
package cn.xbmu.oa.base;

import org.junit.Test;

import cn.xbmu.oa.dao.RoleDao;
import cn.xbmu.oa.dao.UserDao;
import cn.xbmu.oa.dao.impl.RoleDaoImpl;
import cn.xbmu.oa.dao.impl.UserDaoImpl;

public class BaseDaoTest {

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

}
測試:

工程目錄包分布:



注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com