有些时候我们在定义一个类去实现泛型接口时,我们并不确定这个类将要实现哪种类型的类,这时我们就不能确定接口中的泛型,那么接口中的泛型尚未确认,这时就要求这个类也必须定义泛型,而且泛型名称要一致。
代码背景
Spring MVC 框架下:
三个相似模块实现功能,通过接口定义和继承的方式动态传入相应的查询体Qo和数据体Do。
比如:
A类人员的导入、导出、查询等
B类...
C类...
...
每种类别的人由于属性不同定义了不同的数据对象和数据表格TA、TB、TC
一、接口定义
通用方法接口
package cn.showclear.www.service.base;
import cn.showclear.www.common.exception.BusinessException;
import cn.showclear.www.pojo.base.PrisonMemberQo;
import com.github.pagehelper.PageInfo;
import org.springframework.web.multipart.MultipartFile;
/**
* 人员数据服务
* @author YF-XIACHAOYANG
* @date 2018/2/6 14:21
*/
public interface DataReportService<T1,T2> {
/**
* 查询人员信息
* @param memberQo
* @return
*/
PageInfo<T1> query(final T2 memberQo);
/**
* 保存人员信息
* @param memberDo
*/
void save(T1 memberDo) throws BusinessException;
/**
* 删除人员
* @param id
*/
void delete(Integer id);
/**
* 更新人员
* @param memberDo
*/
void update(T1 memberDo);
/**
* 加载人员信息
* @param id
* @return
*/
T1 load(Integer id);
/**
* 导出
* @param memberQo
* @return
*/
String export(T2 memberQo) throws BusinessException;
/**
* 人员导入
* @param file
* @return
*/
Integer upload(MultipartFile file);
}
业务接口定义
package cn.showclear.www.service.base;
/**
* 人员数据服务定义集合
* 此处区分接口实例而不使用多态自动切换是因为Spring容器在使用Autowised注入时不能同名,一个sevice对应一个impl实例
* @author YF-XIACHAOYANG
* @date 2018/2/8 15:25
*/
public interface DataReprotServices {
interface DrugDataReportService<T1,T2> extends DataReportService<T1,T2>{};
interface PrisonDataReportService<T1,T2> extends DataReportService<T1,T2>{};
interface CommCorrDataReportService<T1,T2> extends DataReportService<T1,T2>{};
}
二、接口实现
使用泛型传入对应使用的对象,以其中一类为例:
package cn.showclear.www.service.base.impl;
import cn.com.scooper.common.util.StringUtils;
import cn.showclear.www.common.constant.ExportConstants;
import cn.showclear.www.common.constant.SCConstants;
import cn.showclear.www.common.exception.BusinessException;
import cn.showclear.www.dao.base.CodeMapper;
import cn.showclear.www.dao.base.PrisonMemberMapper;
import cn.showclear.www.pojo.base.CodeDo;
import cn.showclear.www.pojo.base.ExcelHeadBean;
import cn.showclear.www.pojo.base.PrisonMemberQo;
import cn.showclear.www.pojo.base.PrisonMemberDo;
import cn.showclear.www.service.base.DataReprotServices;
import cn.showclear.www.utils.ExportExcel;
import cn.showclear.www.utils.POIUtils;
import cn.showclear.www.utils.PropertyConfig;
import cn.showclear.www.utils.TimeUtils;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.Time;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* 服刑人员数据服务
*
* @author YF-XIACHAOYANG
* @date 2018/2/6 14:22
*/
@Service
public class PrisonDataServiceImpl implements DataReprotServices.PrisonDataReportService<PrisonMemberDo, PrisonMemberQo> {
private static final Logger log = LoggerFactory.getLogger(PrisonDataServiceImpl.class);
private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
@Resource
private PrisonMemberMapper prisonMemberMapper;
@Resource
private CodeMapper codeMapper;
@Autowired
private PropertyConfig propertyConfig;
private static Map<String, String> codeMap = new ConcurrentHashMap<String, String>();
static {
initCodeMap();
}
/**
* 初始化codeMap > 数字解析为汉字
*/
private static void initCodeMap() {
codeMap.put("sex", "性别");
codeMap.put("paperType", "证件类型");
codeMap.put("degreeType", "文化程度");
codeMap.put("politicalStatusOld", "政治面貌");
codeMap.put("maritalStatus", "婚姻状况");
codeMap.put("punishmentKind", "刑种");
}
/**
* 查询服刑人员信息
*
* @param memberQo
* @return
*/
@Override
public PageInfo<PrisonMemberDo> query(PrisonMemberQo memberQo) {
if (memberQo.getCurrentPage() == null) {
memberQo.setCurrentPage(SCConstants.DEFUALT_PAGE_NUM);
}
if (memberQo.getPageSize() == null) {
memberQo.setPageSize(SCConstants.DEFUALT_PAGE_SIZE);
}
PageHelper.startPage(memberQo.getCurrentPage(), memberQo.getPageSize());
final List<PrisonMemberDo> prisonMemberDoList = prisonMemberMapper.query(memberQo);
final PageInfo<PrisonMemberDo> pages = new PageInfo<PrisonMemberDo>(prisonMemberDoList);
return pages;
}
/**
* 保存服刑人员信息
*
* @param memberDo
*/
@Override
public void save(PrisonMemberDo memberDo) throws BusinessException {
memberDo.setUpdatetime(new Date());
if(prisonMemberMapper.selectSameCode(memberDo.getCode()) != null){
throw new BusinessException("服刑人员编码重复!");
}
prisonMemberMapper.insertSelective(memberDo);
}
/**
* 删除服刑人员
*
* @param id
*/
@Override
public void delete(Integer id) {
prisonMemberMapper.deleteByPrimaryKey(id);
}
/**
* 更新人员
*
* @param memberDo
*/
@Override
public void update(PrisonMemberDo memberDo) {
prisonMemberMapper.updateByPrimaryKeySelective(memberDo);
}
/**
* 加载服刑人员信息
*
* @param id
* @return
*/
@Override
public PrisonMemberDo load(Integer id) {
return prisonMemberMapper.load(id);
}
/**
* 导出
*
* @param memberQo
* @return
*/
@Override
public String export(PrisonMemberQo memberQo) throws BusinessException {
final List<PrisonMemberDo> prisonMemberDoList = prisonMemberMapper.query(memberQo);
final List<List<String>> exportList = getExportList(prisonMemberDoList);
final String folderPath = propertyConfig.get("export.url", "/icooper/appdata/hbsf/export/");
final String fileName = ExportConstants.FILE_NAME_PRISON_MEM + ExportConstants.UNDER_LINE + TimeUtils.currTime1()
+ SCConstants.FMT_XLS;
final String filePath = folderPath + fileName;
final ExportExcel ex = new ExportExcel(ExportConstants.TITLE_PRISON_MEM, ExportConstants.HEADER_PRISON_MEM, exportList,
folderPath, fileName);
try {
ex.export();
} catch (final Exception e) {
log.error("服刑人员导出失败", e);
throw new BusinessException("服刑人员导出失败");
}
return filePath;
}
/**
* 人员导入
*
* @param file
* @return
*/
@Override
public Integer upload(MultipartFile file) {
Sheet sheet = null;
try {
sheet = POIUtils.parseSheet(file, 0);
} catch (final java.io.IOException e) {
e.printStackTrace();
}
int num = 0;
for (int i = 3; i <= sheet.getLastRowNum(); i++) {
final Row row = sheet.getRow(i);
if (null != row && row.getCell(0) != null && StringUtils.notEmpty(row.getCell(0).toString())) {
num = parserExcel(row, num);
}
}
return num;
}
...
//Todo
}
三、Controller层调用
package cn.showclear.www.controller.data;
import cn.com.scooper.common.resp.APIRespJson;
import cn.com.scooper.common.resp.ResultCode;
import cn.showclear.www.controller.BaseController;
import cn.showclear.www.pojo.base.*;
import cn.showclear.www.service.base.DataReprotServices.*;
import cn.showclear.www.utils.POIUtils;
import com.github.pagehelper.PageInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
/**
* 综合业务 - 数据上报
* @author YF-XIACHAOYANG
* @date 2018/2/6 14:17
*/
@Controller("CriminalDataController")
@RequestMapping("/data/")
public class CriminalDataController extends BaseController {
private static final Logger log = LoggerFactory.getLogger(CriminalDataController.class);
@Autowired
private PrisonDataReportService prisonDataReportService;
@Autowired
private DrugDataReportService drugDataReportService;
@Autowired
private CommCorrDataReportService commCorrDataReportService;
/**
* 查询服刑人员信息
* @param prisonMemberQo
* @return
*/
@RequestMapping("prison/mem/queryPrisonList")
@ResponseBody
public APIRespJson queryPrisonList(@ModelAttribute PrisonMemberQo prisonMemberQo) {
APIRespJson apiRespJson = null;
try {
PageInfo<PrisonMemberDo> page = prisonDataReportService.query(prisonMemberQo);
apiRespJson = new APIRespJson(ResultCode.SUCC).setData(page);
} catch (Exception e) {
log.error("", e);
apiRespJson = new APIRespJson(ResultCode.FAIL).setMessage("服刑人员信息获取失败");
}
return apiRespJson;
}
...