本文章主要讲了两个技巧,一是在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;
}
}