本文章主要講了兩個技巧,一是在Dao層中基本操作的復用,和Spring配置中的一些代碼復用。
簡明的說一下類的作用:
BaseDao(接口類):
實體中共有的增刪改查操作的接口
BaseHibernateDao(實現類):繼承HibernateDaoSupport,實現BaseDao接口
實現BaseDao類中的基本操作。
UserDao(接口類):繼承BaseDao類
實體中除了基本操作的額外操作,用于擴充功能。
UserHibernateDao(實現類):繼承BaseHibernateDao類,實現UserDao接口
實現UserDao類的操作。
從上面的分析可以看出來,UserDao類是包含有全部的底層操作的接口,而UserHibernateDao類是實現了UserDao
類的全部操作。實現了base類后,實際上是簡化了實體通用的操作,只寫一次就行了。。
在ssh2 結構中,可以利用spring 對UserService 類進行注入UserDao類即可。如Spring的配置文件:
<bean id="daoTemplate" abstract="true">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<bean id="userDao" class="dao.hibernate.UserHibernateDao" parent="daoTemplate"/>
<bean id="userService" class="service.imp.UserService">
<property name="userDao" ref="userDao"/>
<bean id="***Dao" class="dao.hibernate.***HibernateDao" parent="daoTemplate"/>
<bean id="***Service" class="service.imp.UserService">
<property name="***Dao" ref="***Dao"/>

從這個配置文件上又有個 daoTemplate 的bean ,這個bean 是一個抽象類,注入了sessionFactory,如果其他bean類繼承它的話,就可以不用在為它注入sessionFactory了,,這個也是一個技巧,有點像Base類,功能都是實現代碼的復用。。。
下面是上面一些類的演示代碼:
BaseDao
import java.io.Serializable;
import java.util.List;

public interface BaseDao<T,ID extends Serializable>
{
public void save(T entity);
public void delete(T entity);
public void deleteById(Class<T> entityClass,ID id);
public void update(T entity);
public T findById(Class<T> entityClass,ID id);
public List<T> findAll(Class<T> entityClass);
}

BaseHibernateDao
package dao.base;
import java.io.Serializable;
import java.util.List;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

public class BaseHibernateDao<T,ID extends Serializable> extends HibernateDaoSupport implements BaseDao<T,ID>
{
@Override

public void delete(T entity)
{
this.getHibernateTemplate().delete(entity);
}
@Override

public void deleteById(Class<T> entityClass, ID id)
{
delete(this.findById(entityClass, id));
}
@Override

public T findById(Class<T> entityClass, ID id)
{
return (T)this.getHibernateTemplate().get(entityClass, id);
}
@Override

public List<T> findAll(Class<T> entityClass)
{
String name=entityClass.getName();
return this.getHibernateTemplate().find("from"+name);
}
@Override

public void save(T entity)
{
this.getHibernateTemplate().save(entity);
}
@Override

public void update(T entity)
{
this.getHibernateTemplate().update(entity);
}
}


UserDao
package dao;
import dao.base.BaseDao;
import model.User;

public interface UserDao extends BaseDao<User,Integer>
{
User findUserByNameAndPass(String name,String password);
}


UserHibernateDao
package dao.hibernate;
import java.util.List;
import model.User;
import dao.UserDao;
import dao.base.BaseHibernateDao;

public class UserHibernateDao extends BaseHibernateDao<User,Integer> implements UserDao
{
@Override

public User findUserByNameAndPass(String name, String password)
{
// TODO Auto-generated method stub

List<User> us=this.getHibernateTemplate().find("from User user where name=? and password=?",new Object[]
{name,password});
if(us.size()==1)
return us.get(0);
else
return null;
}
}