JavaRush /Java Blog /Random-TK /Bahar gorkunç däl, DTO gatlagy

Bahar gorkunç däl, DTO gatlagy

Toparda çap edildi
Makala sikliniň mazmuny Bahar hakda gürleşmäge dowam edýäris. Bu gün şu ýerde okap biljekdigiňize düşünmek üçin DTO nagşyny seljereris. DTO-nyň iň kyn zady, näme üçin zerurdygyna düşünmekdir. Gök önümler hakda çaklamaga başlalyň we şol bir wagtyň özünde käbir kod ýazalyň, belki ýolda bir zat has düşnükli bolar. Bahar-boot taslamasyny dörediň, h2 we Lombok birikdiriň . Paketler dörediň: guramalar, ammarlar, hyzmatlar, gap-gaçlar. Edaralarda önüm önümini dörediň:
package ru.java.rush.entities;

import lombok.Data;
import lombok.experimental.Accessors;
import org.hibernate.annotations.GenericGenerator;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Accessors(chain = true)
@Entity
@Data
public class ProductEntity {

    @Id
    @Column
    @GenericGenerator(name = "generator", strategy = "increment")
    @GeneratedValue(generator = "generator")
    Integer id;

    @Column
    String name;

    @Column
    Integer purchasePrice;//закупочная цена

}
“ProducRepository”, “ProducService” synplaryny we “ItiiateUtil” synpyny durmuşa geçiriň ( öňki makala meňzeş ). Kartoşkany lomaý bahadan 20 rubl, käşir bolsa 14 rubldan satyn aldyk diýeliň. Satyn alnan önümleri ammarda ýerleşdireris. Maglumatlar bazasyna aşakdaky ýazgylary goşalyň: [Id = 1, ady = “Kartoşka”, satyn alyş bahasy = 20 ] munuň üçin ony owadan gaplalyň we bahany ýokarlandyrarys. .Agny, hapa we özüne çekiji gök önümler üýşüp ýygnandy, ýöne kaşaň segmentden arassa premium wegetarian önümler bolar. Razy, bu indi köp satyn alan önümimiz (obýekt) bolmaz. Täze önüm üçin, dto paketini döredeliň we onda ProductDto synpy
package ru.java.rush.dto;

import lombok.Data;

@Data
public class ProductDto {
    Integer id;
    String name;
    Integer purchasePrice;
    String  packaging;//упаковка
    Integer salePrice;//цена реализации
}
“ProductDto” -da “ProductEntity” -iň iki üýtgeýjisi bar: “gaplamak” we “satuw bahasy”. Dto obýekti subýekt bilen birmeňzeş üýtgeýjileri öz içine alyp biler ýa-da olaryň az ýa-da az bolmagy mümkin. Bir obýekti beýlekisine öwürmek kartalaşdyrmak meselesidigini ýadymyzdan çykarmaýarys. Gurallar bukjasynda MappingUtils synpyny dörederis
package ru.java.rush.utils;

import org.springframework.stereotype.Service;
import ru.java.rush.dto.ProductDto;
import ru.java.rush.entities.ProductEntity;

@Service
public class MappingUtils {
//из entity в dto
    public ProductDto mapToProductDto(ProductEntity entity){
        ProductDto dto = new ProductDto();
        dto.setId(entity.getId());
        dto.setName(entity.getName());
        dto.setPurchasePrice(entity.getPurchasePrice());
        return dto;
    }
//из dto в entity
    public ProductEntity mapToProductEntity(ProductDto dto){
        ProductEntity entity = new ProductEntity();
        entity.setId(dto.getId());
        entity.setName(dto.getName());
        entity.setPurchasePrice(dto.getPurchasePrice());
        return entity;
    }
}
Diňe bir obýektden meýdanlary başga bir obýektden meňzeş meýdanlar bilen doldurýarys. “ProductService” synpynda bir önümi ýa-da önümleriň sanawyny gözlemek usullaryny durmuşa geçirýäris, ýöne ondan ozal ýokarda ýazylan usuly ulanyp guramany dto öwürýäris.
private final ProductRepository productRepository;
private final MappingUtils mappingUtils;


//для листа продуктов мы использовали стрим
public List<ProductDto> findAll() {
    return productRepository.findAll().stream() //создали из листа стирим
            .map(mappingUtils::mapToProductDto) //оператором из streamAPI map, использовали для каждого element метод mapToProductDto из класса MappingUtils
.collect(Collectors.toList()); //превратor стрим обратно в коллекцию, а точнее в лист
}

//для одиночного продукта обошлись проще
public ProductDto findById(Integer id) {
    return mappingUtils.mapToProductDto( //в метод mapToProductDto
            productRepository.findById(id) //поместor результат поиска по id
                    .orElse(new ProductEntity()) //если ни чего не нашли, то вернем пустой entity
    );
}
Indi bu gök önümleri ekrana goýsak näme bolar? Göreli. Munuň üçin ItiiateUtil-de aşakdaky kody ýazyň we işlediň.
System.out.println("\nВитрина магазина");
for (ProductDto dto : productService.findAll()) {
    System.out.println(dto);
}
Çykyş: Dükany görkezmek ProductDto (id = 1, ady = Kartoşka, satyn alyş bahasy = 20, gaplamak = null, salePrice = null) ProductDto (id = 2, name = Käşir, satyn alyş bahasy = 14, gaplamak = null, salePrice = null) Dogry! Hiç kim beýle gök önümleri satyn almaz: hapa, gaplanan däl we satuw bahasy belli däl. Iş logikasynyň wagty geldi. “ProductService” synpynda durmuşa geçirýäris. Ilki bilen bu klasa birnäçe üýtgeýji goşalyň:
private final Integer margin = 5;//это наша накрутка на цену
private final String packaging = "Упаковано в лучшем виде";//так будет выглядеть упаковка
Her bir hereket üçin: gaplamak we baha bellemek, şol bir synpda aýratyn usul dörederis:
// упаковываем товар
public void pack(List<ProductDto> list) {
    list.forEach(productDto ->
            productDto.setPackaging(packaging)
    );
}

// делаем деньги
public void makeMoney(List<ProductDto> list) {
    list.forEach(productDto ->
            productDto.setSalePrice(productDto.getPurchasePrice() * margin)
    );
}
ItiiateUtil-a gaýdyp, ekrandaky ekrany aşakdaky kod bilen çalyşýarys
List<ProductDto> productDtos = productService.findAll();

productService.pack(productDtos);
productService.makeMoney(productDtos);

System.out.println("\nВитрина магазина");
for (ProductDto dto : productDtos)) {
    System.out.println(dto);
}
Geçirýäris: Dükany görkezmek ProductDto (id = 1, ady = Kartoşka, satyn alyş bahasy = 20, gaplamak = Iň oňat görnüşde gaplanan, satuw bahasy = 100) ProductDto (id = 2, name = käşir, satyn alyş bahasy = 14, gaplamak = gaplanan Iň oňat görnüşde, salePrice = 70) Önüm owadan gaplanýar, bahasy bar, ýöne penjiräniň bir ýerinde köp mukdarda satyn alan bahaňyzy we başga bir idini gördüňizmi? Aboveokarda ýazylan kody faýl bilen üýtgedýäris:
List<ProductDto> productDtos = productService.findAll();

productService.pack(productDtos);
productService.makeMoney(productDtos);

System.out.println("\nВитрина магазина");
for (ProductDto dto : productDtos) {
    System.out.println(String.format(
            "Купите: %s , по цене:  %d", dto.getName(), dto.getSalePrice()
    ));
}
“InitiateUtils” synpy şeýle görünmeli:
@Service
@RequiredArgsConstructor
public class InitiateUtils implements CommandLineRunner {

    private final ProductService productService;

    @Override
    public void run(String... args) throws Exception {

        List<ProductEntity> products = new ArrayList<>(
                Arrays.asList(
                        new ProductEntity()
                                .setName("Картофель")
                                .setPurchasePrice(20),
                        new ProductEntity()
                                .setName("Морковь")
                                .setPurchasePrice(14)
                ));

        productService.saveAll(products);

        List<ProductDto> productDtos = productService.findAll();

        productService.pack(productDtos);
        productService.makeMoney(productDtos);

        System.out.println("\nВитрина магазина");
        for (ProductDto dto : productDtos) {
            System.out.println(String.format(
                    "Купите: %s , по цене:  %d", dto.getName(), dto.getSalePrice()
            ));
        }
    }
}
Başlalyň: Dükanyň penjiresini satyn alyň: Kartoşka, bahasy: 100 Satyn alyň: Käşir, bahasy: 70 Başga bir zat! Indi dto bir topar goşmaça koddan başga-da gowy zatlar getirdi diýip pikir edýäris: 1. Maglumatlar bazasyndaky zatlary üýtgetmän iş logikasyny ýerine ýetirip bileris (aýdalyň, gaplamak we satuw bahasy barada meýdanlarymyz bolmaly däl) bu tablisa). Kartoş, hatda baha belligi bilen gaplamazdanam gowy saklanar, hatda ol ýerde gaty köp. 2. Bu setirde <ProductDto> productDtos = productService.findAll () sanawy biznes logikasynyň çäginde işlemek üçin amatly obýektleriň keşini döretdik. Käbir harytlary dükanyň yzky otagyna goýsak. 3. Bu bize iki sany iş ýerine ýetirmäge mümkinçilik berdi: gaplamak we bellemek, ýöne maglumatlar bazasyna diňe bir gezek haýyş etdik (maglumat bazasyna talaplar ýerine ýetiriş taýdan gaty kyn). Önümi gaplap, baha belligini goýup we ekrana goýup bilersiňiz - her gezek ammar otagyna ylgamakdan, kem-kemden peýdaly otagdan alyp bilersiňiz. “Näme üçin beýle kyn?” Diýen soraga adamlar jogap tapmaga synanyşýarlar, okaň . Indiki makala
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION