java 泛型的应用--s2si框架中的应用

java泛型对我来说是一个很熟悉的概念了,虽然理解不是太深刻。以前用的多的是在java基本类型中加入泛型处理,用起来比较方便。

例如:HashMap<Student stu> map = new HashMap<Student stu> ();

最近用到struts2+spring+ibatis框架的时候,现有的框架自己感觉很糟糕,就想自己搭一个属于自己的框架。对于spring自己觉得了解的并不深入,要用到spring的依赖注入,在dao层就要每个dao都最好有一个接口和实现,就像hibernate生成里面的(看了网上的一个leave,用到的是ssh框架)的例子。想要这些实体dao和daoimpl都有一个基类,能够在基类种实现所有业务类的公用数据库操作方法,这样统一管理,代质量更加高一些。开始是想用接口和基类实现的,结果不能达到想要的效果,继承接口的接口的实现类必须要实现接口和它的父接口的所有方法,这样达不到方法的重用。

看了leave的实现,用到了泛型接口和泛型基类,很好的实现了这一设想。

实现的结构如下:

接口BaseDao:

package org.forever.leave.dao.base;

import java.io.Serializable;
import java.util.List;


public interface BaseDao<T> {
 
 
 public void save(T entity);
 
 public void update(T entity);
 
 public void delete(T entity);
 
 public T find(Serializable id);
 
 public List<T> findAll();
 
}
基类BaseDaoImpl:

package org.forever.leave.dao.base;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;

import javax.annotation.Resource;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.orm.hibernate3.HibernateTemplate;

public class BaseDaoImpl<T> implements BaseDao<T> {
 
 protected static Log log = LogFactory.getLog(BaseDaoImpl.class);
 private final String entityName;
 
 @Resource protected HibernateTemplate hibernateTemplate;
 
 @SuppressWarnings("unchecked")
 public BaseDaoImpl() {
  
  Type type = this.getClass().getGenericSuperclass();
  if (!(type instanceof ParameterizedType)) {
   throw new RuntimeException("没有传递类型参数T");
  }

  ParameterizedType pt = (ParameterizedType) type;
  this.entityName = ((Class<T>) pt.getActualTypeArguments()[0]).getName();
 }
 

 

 public void delete(T entity) {
  
  
 }

 

 public void save(T entity) {
  hibernateTemplate.save(entityName,entity);
  
 }

 public void update(T entity) {
  
  
 }


 protected Object findUniqueResult(String hql, Object... value) {
  List<?> list =  hibernateTemplate.find(hql,value);
  if(list.size()==0) return null;
  return list.get(0);
 }


 @SuppressWarnings("unchecked")
 @Override
 public T find(Serializable id) {
  return (T) hibernateTemplate.get(entityName, id);
 }

 


 @SuppressWarnings("unchecked")
 @Override
 public List<T> findAll() {
  return hibernateTemplate.find("FROM " + entityName);
 }
 
 
}
实例接口UserDao :

package org.forever.leave.dao;

import org.forever.leave.dao.base.BaseDao;
import org.forever.leave.entities.User;

public interface UserDao extends BaseDao<User>{

 
 
}
实例类UserDao Impl:

package org.forever.leave.dao.impl;

import org.forever.leave.dao.UserDao;
import org.forever.leave.dao.base.BaseDaoImpl;
import org.forever.leave.entities.User;
import org.springframework.stereotype.Repository;

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

 public UserDaoImpl(){}
 
}

这样,就能够在基类种实现所有业务类的公用数据库操作方法,在具体的实现类中只要加入特有的方法就行了,大大提高了代码的质量和重用性。

测试一下test类:

package org.forever.leave.test;

import org.forever.leave.dao.impl.UserDaoImpl;

 


public class Test {
 /**
  * @param args
  */
 public static void main(String[] args) {
 UserDaoImpl dao = new UserDaoImpl();
 dao.delete(entity);//注意这里的delete方法传入的就是一个User参数的Entity.而这个方法实体是在BaseDaoImpl中实现的。
 }

}
这里讲到了java泛型的一个使用,也是一个在搭建基于spring的框架的一个方法。看到一篇讲泛型的不错的文章:

http://blog.csdn.net/explorers/archive/2005/08/15/454837.aspx 大家分享学习。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值