底层方法封装

原创 2016年05月31日 20:25:43

      项目开发中面向接口编程,D层进行数据库的操作,一般都是一个接口对应一个实现类。

      但是各个接口中有公共的方法如:增删改查等基本操作。我们把这些基本的操作抽象出来放在公共的接口实现D层代码的简化。

1.原先项目开发 D层结构

UserDao

public interface UserDao{
	void save(User user);
	void delete(long id);
	void update(User user);
	......
}
RoleDao

public interface RoleDao{
	void save(Role role);
	void delete(long id);
	void update(Role role);
	......
}
然后是各自的实现

UserDaoImpl

@Repository
public class UserDaoImpl implements UserDao {
	
	@Override
	public void save(User user) {
		getSession().save(user);	
	}

	@Override
	public void update(User user) {
		getSession().update(user);
		
	}
	@Override
	public void delete(long id) {
		...
	}
}

RoleDaoImpl

@Repository
public class RoleDaoImpl implements RoleDao {
	@Override
	public void save(Role role) {
		getSession().save(role);	
	}

	@Override
	public void update(Role role) {
		getSession().update(role);
		
	}
	@Override
	public void delete(long id) {
		...
	}
}
       D层使用的hibernate,各个接口中的方法基本相同只是操作的实体不同而已 ,我们抽象出公共的接口BaseDao和具体的实现BaseDaoImpl来实现这些公共的方法,然后让每个接口继承BaseDao,显示代码复用和简化。


2.优化后D层结构

具体的代码实现为

BaseDao

//(接口中的方法抽取为公共的 接口BaseDao ,而实现类中的方法也是重复的不能每个dao都在写一遍这6个方法。
//所以我们抽取为功能的实现类BaseDaoImpl,然后让每个具体的类来继承实现类)

public interface BaseDao<T> {

	void save(T entity);
	
	void delete(long id);
	
	void update(T entity);
	
	T getById(long id);
	
	List<T> getByIds(long[] ids);
	
	List<T> findAll();
}

BaseDaoImpl

package cn.tgb.oa.base;

import java.lang.reflect.ParameterizedType;
import java.util.List;
import javax.annotation.Resource;
import org.hibernate.Session;
import org.hibernate.SessionFactory;

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

	
	@Resource
	private SessionFactory sessionFactory;	
	private Class<T> clazz = null; //这是个问题
	
	public BaseDaoImpl(){
		//使用反射技术得到T的真实的类型
		ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass(); //获取当前new的对象的泛型的父类类型
		this.clazz = (Class<T>) pt.getActualTypeArguments()[0];  //获取第一个类型参数的真实类型
		System.out.println("class--->"+clazz);
	}
		
	protected Session getSession(){
		return sessionFactory.getCurrentSession();
	}
	
	@Override
	public void save(T entity) {
		getSession().save(entity);
		
	}

	@Override
	public void delete(long id) {
		Object object = getById(id);
		if(object!= null){
			getSession().delete(object);
		}		
	}

	@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> getByIds(long[] ids) {
		return getSession().createQuery("from " + clazz.getSimpleName() +" where id in (:ids)").setParameter("ids", ids).list();
	}

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

}
现在D层具体的接口:

UserDao

package cn.tgb.oa.dao;

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

public interface UserDao extends BaseDao<User>{

}

RoleDao

package cn.tgb.oa.dao;

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

public interface RoleDao extends BaseDao<Role> {

}
UserDaoImpl

package cn.tgb.oa.dao.Impl;

import org.springframework.stereotype.Repository;
import cn.tgb.oa.base.BaseDaoImpl;
import cn.tgb.oa.dao.UserDao;
import cn.tgb.oa.domain.User;

@Repository
public class UserDaoImpl extends BaseDaoImpl<User> implements UserDao {
	//getSession().save(arg0);父类中有了getSession这个方法,子类就可以直接使用。

}

RoleDaoImpl

package cn.tgb.oa.dao.Impl;

import org.springframework.stereotype.Repository;
import cn.tgb.oa.base.BaseDaoImpl;
import cn.tgb.oa.dao.RoleDao;
import cn.tgb.oa.domain.Role;

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

}

业务层调用的时候就可以直接通过roleDao调用公共的6个方法。当时这个接口特有的方法时可以直接在具体的接口中添加。

@Service
@Transactional
public class roleServiceImpl implements roleService  {

	@Resource
	private RoleDao roleDao;

	@Override
	public void save(Role role) {
		roleDao.save(role);		
	}
}



版权声明:本文不足之处在所难免,敬请各位批评指正,留下宝贵意见。

js常用的几个方法封装

var shelleyObj=(function(){         /**************获取元素*****************/         //根据id获取元素        ...

浅谈封装一个对象的方法

在Java中经常需要对一个对象及其属性进行频繁的操作,如果是大量数据的话很容易将各个属性搞混,因此我们采用封装的方法来调用对象就不容易发生混淆。 封装的具体步骤包括属性私有化,设置公有的get、se...

java底层学习

额,马上就要面试了,java的底层肯定是需要了解的。网上找了找java的底层文章,做个记号。java底层主要是类的加载、连接和初始化。 本文主要分为四个方面: (1)java底层概述 (2)ne...

学习!嵌入式底层驱动工程师学习方法

作者:李Brooks 链接:https://www.zhihu.com/question/22252234/answer/75026117 来源:知乎 著作权归作者所有。商业转载请联系作者获得授...

LinkedList add方法底层实现

LinkedList底层是通过双向链表实现的。 LinkedList 为空构造函数如下:public class LinkedList extends AbstractSequentialL...
  • hahalzb
  • hahalzb
  • 2011年05月12日 16:27
  • 3315

最近项目中用hibernate分页查询的底层方法

hibernate底层查询数据库主要分为   hibernate sql查询和原生sql查询。 DAO方法所在类必须继承HibernateDaoSupport类: hibernate sql查询两...

嵌入式底层软件开发学习系列之五调试方法

嵌入式开发中难免出现这样或那样的问题, 因而软件的调试手段会直接影响到开发的进度, 本节将总结一些常用的调试方法...

安卓JNI--JNI底层C回调Java方法

XML布局
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:底层方法封装
举报原因:
原因补充:

(最多只允许输入30个字)