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();
	}

}
测试:

工程目录包分布:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

上善若水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值