汎用ベースのBaseDao、BaseServiceの拡張版


ステップ1:インタフェースBaseDaoの作成
public interface BaseDao>
{
	boolean save(T u);
	
	boolean deleteById(ID id);
	
	boolean update(T u);
	
	T getById(ID id);
	
	List getAll();
}

ステップ2:基本実装クラスBaseDaoImplの作成
@SuppressWarnings("all")
public abstract class BaseDaoImpl> 
	implements BaseDao
{
	@Resource(name = "sqlSessionFactory")
	protected SqlSessionFactory sqlSessionFactory;

	/**        */
	private Class curDao;
	
	public BaseDaoImpl()
	{
	    ParameterizedType pt = (ParameterizedType)getClass().getGenericSuperclass();	   
	    this.curDao = ((Class)pt.getActualTypeArguments()[2]);
	}
	@Override
	public boolean save(T u)
	{
		return getMapper().save(u);
	}
	@Override
	public boolean deleteById(ID id)
	{
		return getMapper().deleteById(id);
	}
	@Override
	public boolean update(T u)
	{
		return getMapper().update(u);
	}
	@Override
	public T getById(ID id)
	{
		return getMapper().getById(id);
	}
	@Override
	public List getAll()
	{
		return getMapper().getAll();
	}
	protected SqlSession getSession()
	{
		return sqlSessionFactory.openSession();
	}
	protected I getMapper()
	{
		return getSession().getMapper(curDao);
	}
}

注意:AbstraactEntityは、汎用エンティティの抽象親です.たとえば、汎用フィールドを定義できます.
public abstract class AbstractEntity implements Serializable
{
	private static final long serialVersionUID = 66532814011080848L;
	
	private Long id;
	//    
	private Date createDate;
	//    
	private Date modifyDate;

	public Long getId()
	{
		return id;
	}

	public void setId(Long id)
	{
		this.id = id;
	}

	public Date getCreateDate()
	{
		return createDate;
	}

	public void setCreateDate(Date createDate)
	{
		this.createDate = createDate;
	}

	public Date getModifyDate()
	{
		return modifyDate;
	}

	public void setModifyDate(Date modifyDate)
	{
		this.modifyDate = modifyDate;
	}
}

ステップ3:BaseServiceの作成
public interface BaseService>
{
	boolean save(T u);
	
	boolean deleteById(ID id);
	
	boolean update(T u);
	
	T getById(ID id);
	
	List getAll();
}

ステップ4:BaseServiceImplの作成
@Transactional
public abstract class BaseServiceImpl>
	implements BaseService
{
	/**   DAO */
	private BaseDao baseDao;
	
	@Override
	public boolean save(T u)
	{
		if (u != null && u.getCreateDate() == null)
		{
			u.setCreateDate(new Date());
		}
		if (u != null && u.getModifyDate() == null)
		{
			u.setModifyDate(new Date());
		}
		return baseDao.save(u);
	}
	@Override
	public boolean deleteById(ID id)
	{
		return baseDao.deleteById(id);
	}
	@Override
	public boolean update(T u)
	{
		if (u != null && u.getModifyDate() != null)
		{
			u.setModifyDate(new Date());
		}
		return baseDao.update(u);
	}
	@Override
	public T getById(ID id)
	{
		return baseDao.getById(id);
	}
	@Override
	public List getAll()
	{
		return baseDao.getAll();
	}
	public void setBaseDao(BaseDao baseDao)
	{
		this.baseDao = baseDao;
	}
}