一、基类抽取
有时候我们为了代码结构更加的简化,能够减少代码的重复率,做到DRY原则,我们通常抽取部分公共代码出来
二、原始代码
public interface IEmployeeDao {
void save(Employee employee);
void update(Employee employee);
void delete(Long t);
Employee get(Long id);
List<Employee> listAll();
}
@Repository("employeeDao")
public class EmployeeDaoImpl implements IEmployeeDao{
@Setter
private SessionFactory sessionFactory;
@Override
public void save(Employee dmployee) {
Session session = sessionFactory.getCurrentSession();
session.save(dmployee);
}
@Override
public void update(Employee dmployee) {
Session session = sessionFactory.getCurrentSession();
session.update(dmployee);
}
@Override
public void delete(Employee dmployee) {
Session session = sessionFactory.getCurrentSession();
session.delete(dmployee);
}
@Override
public Employee get(Long id) {
Session session = sessionFactory.getCurrentSession();
return (Employee) session.get(Employee.class,id);
}
@Override
public List<Employee> listAll() {
Session session = sessionFactory.getCurrentSession();
return session.createCriteria(Employee.class).list();
}
}
三、简单抽取
基类:
/**
* 泛型dao接口:所有dao接口的父类
* @param <T>
*/
public interface IGenericDao<T> {
void save(T t);
void update(T t);
void delete(Long t);
T get(Long id);
List<T> listAll();
}
abstract public class GenericDaoImpl<T> implements IGenericDao<T> {
// 获取真实的字节码类型
public abstract Class<T> getTargetType();
@Setter
private SessionFactory sessionFactory;
@Override
public void save(T t) {
Session session = sessionFactory.getCurrentSession();
session.save(t);
}
@Override
public void update(T t) {
Session session = sessionFactory.getCurrentSession();
session.update(t);
}
@Override
public void delete(Long t) {
Session session = sessionFactory.getCurrentSession();
Object obj = session.get(getTargetType(),t);
session.delete(obj);
}
@Override
public T get(Long id) {
Session session = sessionFactory.getCurrentSession();
return (T) session.get(getTargetType(),id);
}
@Override
public List<T> listAll() {
Session session = sessionFactory.getCurrentSession();
return session.createCriteria(getTargetType()).list();
}
}
具体业务类:
// 此处写非公共部分,针对于不同的业务
public interface IEmployeeDao extends IGenericDao<Employee> {
}
@Repository("employeeDao")
public class EmployeeDaoImpl extends GenericDaoImpl<Employee> implements IEmployeeDao {
@Override
public Class<Employee> getTargetType() {
return Employee.class;
}
}
四、获得泛型实体类的过程示例
API示例
五、抽取结果