Mapstruct 能夠用來處理java實體間的轉換,好比DTO轉DO,DO轉DTO。java
Pom依賴以下app
<dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <version>1.2.0.Final</version> </dependency> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>1.2.0.Final</version> <scope>provided</scope> </dependency>
public class BooleanIntegerMapper { public int asInt(boolean success) { return success ? 1 : 0; } public boolean asBoolean(int success) { return success == 1; } } @Mapper(uses = { BooleanIntegerMapper.class }) public interface FaultyMachineMapper { FaultyMachine doToDTO(FaultyMachineDO FaultyMachineDO); CloudboxFaultyMachineDO dtoToDO(FaultyMachine faultyMachine); List<FaultyMachine> dosToDTOs(Iterable<FaultyMachineDO> faultyMachineDOS); }
Mapstruct會爲FaultyMachineMapper生成實現類FaultyMachineMapperImpl,在工程的target目錄下能夠看到。Spring初始化時會實例化FaultyMachineMapperImpl對象,而且注入到須要使用的地方。ide
public class FaultyMachineMapperImpl implements FaultyMachineMapper { private final BooleanIntegerMapper booleanIntegerMapper = new BooleanIntegerMapper(); public FaultyMachineMapperImpl() { } public FaultyMachine doToDTO(CloudboxFaultyMachineDO cloudboxFaultyMachineDO) { if (cloudboxFaultyMachineDO == null) { return null; } else { FaultyMachine faultyMachine = new FaultyMachine(); faultyMachine.setId(cloudboxFaultyMachineDO.getId()); faultyMachine.setAppName(cloudboxFaultyMachineDO.getAppName()); faultyMachine.setZone(cloudboxFaultyMachineDO.getZone()); faultyMachine.setHardwareTemplate(cloudboxFaultyMachineDO.getHardwareTemplate()); faultyMachine.setContainerIp(cloudboxFaultyMachineDO.getContainerIp()); faultyMachine.setContainerSn(cloudboxFaultyMachineDO.getContainerSn()); faultyMachine.setHostname(cloudboxFaultyMachineDO.getHostname()); faultyMachine.setEventCode(cloudboxFaultyMachineDO.getEventCode()); faultyMachine.setEventId(cloudboxFaultyMachineDO.getEventId()); faultyMachine.setEventType(cloudboxFaultyMachineDO.getEventType()); faultyMachine.setLoseData(this.booleanIntegerMapper.asBoolean(cloudboxFaultyMachineDO.getLoseData())); faultyMachine.setNcIp(cloudboxFaultyMachineDO.getNcIp()); faultyMachine.setNcSn(cloudboxFaultyMachineDO.getNcSn()); faultyMachine.setStatus(cloudboxFaultyMachineDO.getStatus()); faultyMachine.setGmtCreate(cloudboxFaultyMachineDO.getGmtCreate()); faultyMachine.setGmtModified(cloudboxFaultyMachineDO.getGmtModified()); return faultyMachine; } } public CloudboxFaultyMachineDO dtoToDO(FaultyMachine faultyMachine) { if (faultyMachine == null) { return null; } else { CloudboxFaultyMachineDO cloudboxFaultyMachineDO = new CloudboxFaultyMachineDO(); cloudboxFaultyMachineDO.setId(faultyMachine.getId()); cloudboxFaultyMachineDO.setAppName(faultyMachine.getAppName()); cloudboxFaultyMachineDO.setZone(faultyMachine.getZone()); cloudboxFaultyMachineDO.setHardwareTemplate(faultyMachine.getHardwareTemplate()); cloudboxFaultyMachineDO.setContainerIp(faultyMachine.getContainerIp()); cloudboxFaultyMachineDO.setContainerSn(faultyMachine.getContainerSn()); cloudboxFaultyMachineDO.setHostname(faultyMachine.getHostname()); cloudboxFaultyMachineDO.setEventCode(faultyMachine.getEventCode()); cloudboxFaultyMachineDO.setEventId(faultyMachine.getEventId()); cloudboxFaultyMachineDO.setEventType(faultyMachine.getEventType()); cloudboxFaultyMachineDO.setLoseData(this.booleanIntegerMapper.asInt(faultyMachine.isLoseData())); cloudboxFaultyMachineDO.setNcIp(faultyMachine.getNcIp()); cloudboxFaultyMachineDO.setNcSn(faultyMachine.getNcSn()); cloudboxFaultyMachineDO.setGmtCreate(faultyMachine.getGmtCreate()); cloudboxFaultyMachineDO.setGmtModified(faultyMachine.getGmtModified()); cloudboxFaultyMachineDO.setStatus(faultyMachine.getStatus()); return cloudboxFaultyMachineDO; } } public List<FaultyMachine> dosToDTOs(Iterable<CloudboxFaultyMachineDO> cloudboxFaultyMachineDOS) { if (cloudboxFaultyMachineDOS == null) { return null; } else { List<FaultyMachine> list = new ArrayList(); Iterator var3 = cloudboxFaultyMachineDOS.iterator(); while(var3.hasNext()) { CloudboxFaultyMachineDO cloudboxFaultyMachineDO = (CloudboxFaultyMachineDO)var3.next(); list.add(this.doToDTO(cloudboxFaultyMachineDO)); } return list; } } }
代碼中的使用this
public class FaultyMachineRepositoryImpl implements FaultyMachineRepository { private FaultyMachineMapper faultyMachineMapper = Mappers.getMapper(FaultyMachineMapper.class); @Setter private FaultyMachineDAO faultyMachineDAO; @Override public FaultyMachine getById(int id) { FaultyMachineDO faultyMachineDO = faultyMachineDAO.getById(id); FaultyMachine faultyMachine = faultyMachineMapper.doToDTO(faultyMachineDO); return faultyMachine; } @Override public int insertFaultyMachine(FaultyMachine faultyMachine) { FaultyMachineDO faultyMachineDO = faultyMachineMapper.dtoToDO(faultyMachine); return (int)faultyMachineDAO.insertFaultyMachine(faultyMachineDO); } }
若是Java類中有一個字段是boolean類型的,對應DB中類型是tinyint,此時使用BeanUtil在DTO和DO之間copy時會報錯提示參數類型不匹配。code
使用以上的方式就不存在這個問題。xml