Mapstruct使用筆記

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

相關文章
相關標籤/搜索