步骤 1 : 好处 步骤 2 : Service层类关系图
1. CategoryService 接口只需要继承BaseService就声明了一套CRUD方法
2. CategoryServiceImpl 实现类只需要继承BaseServiceImpl 就继承了一套CRUD方法 3. 在实现类BaseServiceImpl 不用做dao.methodXXX这样脱裤子放屁的事情,感受不到dao的存在。 可以预见在后续开发过程中,其他的Service接口与实现了也能够享受这样的好处,提升开发速度,加快开发效率,降低犯错几率。 package com.how2java.tmall.service;
public interface CategoryService extends BaseService{
}
package com.how2java.tmall.service.impl;
import org.springframework.stereotype.Service;
import com.how2java.tmall.service.CategoryService;
@Service
public class CategoryServiceImpl extends BaseServiceImpl implements CategoryService {
}
package com.how2java.tmall.service.impl;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Service;
import com.how2java.tmall.service.BaseService;
import com.how2java.tmall.util.Page;
@Service
public class BaseServiceImpl extends ServiceDelegateDAO implements BaseService {
protected Class clazz;
public BaseServiceImpl(){
try{
throw new Exception();
}
catch(Exception e){
StackTraceElement stes[]= e.getStackTrace();
String serviceImpleClassName= stes[1].getClassName();
try {
Class serviceImplClazz= Class.forName(serviceImpleClassName);
String serviceImpleClassSimpleName = serviceImplClazz.getSimpleName();
String pojoSimpleName = serviceImpleClassSimpleName.replaceAll("ServiceImpl", "");
String pojoPackageName = serviceImplClazz.getPackage().getName().replaceAll(".service.impl", ".pojo");
String pojoFullName = pojoPackageName +"."+ pojoSimpleName;
clazz=Class.forName(pojoFullName);
} catch (ClassNotFoundException e1) {
e1.printStackTrace();
}
}
}
@Override
public List list() {
DetachedCriteria dc = DetachedCriteria.forClass(clazz);
dc.addOrder(Order.desc("id"));
return findByCriteria(dc);
}
@Override
public int total() {
String hql = "select count(*) from " + clazz.getName() ;
List<Long> l= find(hql);
if(l.isEmpty())
return 0;
Long result= l.get(0);
return result.intValue();
}
@Override
public List<Object> listByPage(Page page) {
DetachedCriteria dc = DetachedCriteria.forClass(clazz);
dc.addOrder(Order.desc("id"));
return findByCriteria(dc,page.getStart(),page.getCount());
}
@Override
public Integer save(Object object) {
return (Integer) super.save(object);
}
@Override
public Object get(Class clazz, int id) {
return get(clazz, id);
}
@Override
public Object get(int id) {
return get(clazz, id);
}
@Override
public List listByParent(Object parent) {
String parentName= parent.getClass().getSimpleName();
String parentNameWithFirstLetterLower = StringUtils.uncapitalize(parentName);
DetachedCriteria dc = DetachedCriteria.forClass(clazz);
dc.add(Restrictions.eq(parentNameWithFirstLetterLower, parent));
dc.addOrder(Order.desc("id"));
return findByCriteria(dc);
}
@Override
public List list(Object... pairParms) {
// TODO Auto-generated method stub
return null;
}
@Override
public List list(Page page, Object parent) {
// TODO Auto-generated method stub
return null;
}
@Override
public int total(Object parentObject) {
// TODO Auto-generated method stub
return 0;
}
// 因为继承了ServiceDelegateDAO,所以就继承了update和delete方法
// public void update(Object object) {
// update(object);
// }
// public void delete(Object object) {
// delete(object);
// }
}
为了更加清楚地理解Service层的几个类之间的关系,整理了这么一个类图
1. BaseService是接口 2. CategoryService 是接口 3. CategoryService 接口 继承了 BaseService接口 (接口是可以继承接口的) 4. BaseServiceImpl 实现了BaseService接口 5. CategoryServiceImpl 实现了CategoryService接口 6. CategoryServiceImpl 继承了BaseServiceImpl 7. BaseServiceImpl 继承了ServiceDelegateDAO类
HOW2J公众号,关注后实时获知布最新的教程和优惠活动,谢谢。
![]() |