底层方法封装

原创 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);		
	}
}



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

java集合系列二:多种方法进行collection遍历,并封装为公共方法

一:如何使用for循环和迭代器遍历Map集合原文地址(转载) 1、通过key集合访问,对Key敢兴趣,可以访问与key对应的Value值; for(String k:maps.keySet()){ ...
  • u013395878
  • u013395878
  • 2016年07月26日 22:30
  • 2116

底层通知上层的架构实现

最近的项目里,需要实现从网络端接收数据然后通知业务“总管”Mananger,让他来完成一些业务逻辑处理,比如数据库的记录添加,显示到UI等,而这些工作不是总管亲自来做的,会分发给他的下一级员工,比如单...
  • lcc921528642
  • lcc921528642
  • 2015年04月15日 21:35
  • 537

C#.Net底层操作数据库及常用功能封装类

  • 2009年09月14日 13:06
  • 417KB
  • 下载

js自己封装方

//*后台管理页JS函数,Jquery扩展 $.ajaxSetup({     cache: false }); $(function () {     $('.aspNetHidden').hide...
  • shamao1113
  • shamao1113
  • 2015年09月14日 18:06
  • 3368

后台系统增删改公共测试用例

  • 2011年07月27日 09:36
  • 25KB
  • 下载

java实现将结果集封装到List中的方法

这篇文章主要介绍了java实现将结果集封装到List中的方法,涉及java数据库查询及结果集转换的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下 本文实例讲述了java实现将结果集...
  • fu_manxing
  • fu_manxing
  • 2016年08月11日 21:54
  • 2108

js如何创建类(封装)

学过其他面向对象语言的JavaScripter,可能都应用过类,如:class{},等定义的一系列方法, 但是初学者看是学习js的时候,经常会看到这样一句话,那就是JavaScript是面向对象语言...
  • xi_2130
  • xi_2130
  • 2015年12月12日 16:43
  • 8837

浅谈封装一个对象的方法

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

自己封装的几个函数

封装简单的函数
  • wongsiusan
  • wongsiusan
  • 2015年09月21日 16:21
  • 3287

java底层学习

额,马上就要面试了,java的底层肯定是需要了解的。网上找了找java的底层文章,做个记号。java底层主要是类的加载、连接和初始化。 本文主要分为四个方面: (1)java底层概述 (2)ne...
  • randyjiawenjie
  • randyjiawenjie
  • 2011年09月14日 17:24
  • 18107
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:底层方法封装
举报原因:
原因补充:

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