JavaRush /Java Blogu /Random-AZ /Bahar qorxulu deyil, DTO təbəqəsi
Павел
Səviyyə

Bahar qorxulu deyil, DTO təbəqəsi

Qrupda dərc edilmişdir
MƏQALƏ DÖVRÜNÜN MÜNDƏRİCASI Bahar haqqında danışmağa davam edirik. Bu gün biz DTO nümunəsini təhlil edəcəyik, başa düşmək üçün burada oxuya bilərsiniz . DTO ilə bağlı ən çətin şey onun nə üçün lazım olduğunu başa düşməkdir. Tərəvəzlər haqqında fərziyyələr etməyə başlayaq və eyni zamanda bir az kod yazaq, bəlkə də yol boyu nəsə aydınlaşacaq. Yay-boot layihəsi yaradın, h2 Lombok-u birləşdirin . Paketlər yaradın: müəssisələr, depolar, xidmətlər, kommunal xidmətlər. Müəssisələrdə Məhsul obyekti yaradın:
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 siniflərini və ItiiateUtil sinfini həyata keçirin ( əvvəlki məqaləyə oxşar ). Tutaq ki, biz topdansatış qiymətinə kartofun kiloqramını 20 rubla, yerkökü isə 14 rubldan almışıq. Alınan məhsulları anbara yerləşdirəcəyik. Verilənlər bazasına aşağıdakı qeydləri əlavə edək: [İd =1, ad= “Kartof”, alışQiyməti = 20] [İd =2, ad= “Kök”, satınalmaQiyməti = 14] Layiqli möhtəkirlər olaraq, mallarımızı sərfəli şəkildə satmalıyıq, bunun üçün onu gözəl qablaşdıraq və qiyməti artıraq. Yəni bizdə çirkli və cəlbedici olmayan tərəvəzlər yığılmışdı, lakin lüks seqmentdən təmiz premium vegan məhsulları olacaq. Razılaşın, bu, artıq toplu olaraq aldığımız eyni məhsul (obyekt) olmayacaq. Yeni məhsul üçün gəlin dto paketi və onun içərisində ProductDto sinfi yaradaq
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-də olmayan iki dəyişən var: “qablaşdırma” və “satış qiyməti”. dto obyekti obyektlə tam olaraq eyni dəyişənləri ehtiva edə bilər və ya onlardan daha çox və ya daha az ola bilər. Biz xatırlayırıq ki, bir obyekti digərinə çevirmək xəritələmə işidir. Utils paketində biz MappingUtils sinfini yaradacağıq
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;
    }
}
Biz sadəcə olaraq bir obyektin sahələrini digər obyektin oxşar sahələri ilə doldururuq. ProductService sinfində biz tək məhsulu və ya məhsulların siyahısını axtarmaq üçün metodlar tətbiq edirik, lakin bundan əvvəl yuxarıda yazılmış metoddan istifadə edərək obyekti dto-a çeviririk.
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
    );
}
İndi bu tərəvəzləri ekrana qoysaq nə olacaq? Görək. Bunun üçün ItiiateUtil-də aşağıdakı kodu yazın və onu işə salın.
System.out.println("\nВитрина магазина");
for (ProductDto dto : productService.findAll()) {
    System.out.println(dto);
}
Çıxış belədir: Mağaza ekranı ProductDto(id=1, ad=Kartof, alışQiymət=20, qablaşdırma=null, salePrice=null) ProductDto(id=2, ad=Kök, alışQiymət=14, qablaşdırma=null, salePrice=null) Yaxşı, yox! Belə tərəvəzləri heç kim almayacaq: onlar çirklidir, qablaşdırılmayıb, satış qiyməti isə məlum deyil. İş məntiqinin vaxtıdır. Biz onu ProductService sinfində həyata keçiririk. Əvvəlcə bu sinfə bir neçə dəyişən əlavə edək:
private final Integer margin = 5;//это наша накрутка на цену
private final String packaging = "Упаковано в лучшем виде";//так будет выглядеть упаковка
Hər bir fəaliyyət üçün: qablaşdırma və qiymət qeydi, eyni sinifdə ayrıca bir üsul yaradacağıq:
// упаковываем товар
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)
    );
}
Biz ItiiateUtil-ə qayıdırıq və displeydəki ekranı aşağıdakı kodla əvəz edirik
List<ProductDto> productDtos = productService.findAll();

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

System.out.println("\nВитрина магазина");
for (ProductDto dto : productDtos)) {
    System.out.println(dto);
}
Biz həyata keçiririk: Mağaza ekranı ProductDto(id=1, ad=Kartof, alışQiymət=20, qablaşdırma=Ən yaxşı şəkildə qablaşdırılıb, satışQiymət=100) ProductDto(id=2, ad=Kök, alışQiymət=14, qablaşdırma=Qablaşdırılıb) ən yaxşı şəkildə, satışQiymət=70) Məhsul gözəl qablaşdırılıb, qiyməti var, ancaq pəncərənin ekranında bir yerdə görmüsünüz ki, onu toplu olaraq aldığınız qiyməti və başqa bir id. Yuxarıda yazılmış kodu bir faylla dəyişdiririk:
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()
    ));
}
sinif InitiateUtils nəticədə belə görünməlidir:
@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()
            ));
        }
    }
}
Gəlin işə salaq: Mağaza pəncərəsi Alın: Kartof, qiyməti: 100 Alın: Yerkökü, qiyməti: 70 Başqa bir şey! İndi düşünürük ki, bir dəstə əlavə koddan başqa yaxşı şeylər gətirdi: 1. Biz verilənlər bazasındakı obyektləri dəyişmədən biznes məntiqini həyata keçirə bilərik (tutaq ki, yaxşı, bizdə qablaşdırma və satış qiyməti ilə bağlı sahələrin olmasına ehtiyac yoxdur. bu cədvəl). Kartof qiymət etiketi ilə qablaşdırma olmadan da saxlamada yaxşı davam edəcək, orada hətta artıqdır. 2. Bu sətirdə List<ProductDto> productDtos = productService.findAll() biz biznes məntiqi daxilində işləmək üçün əlverişli olan obyektlərin keşini yaratdıq. Bu, malların bir hissəsini mağazanın arxa otağına qoysaq. 3. Bu, bizə iki işgüzar hərəkəti yerinə yetirməyə imkan verdi: qablaşdırma və işarələmə, lakin biz verilənlər bazasına yalnız bir dəfə sorğu göndərdik (verilənlər bazasına sorğular performans baxımından kifayət qədər çətindir). Siz məhsulu qablaşdıra, üzərinə qiymət etiketi yapışdırıb sərgiyə qoya bilərsiniz - onu hər dəfə saxlama otağına qaçmaqdansa, onu tədricən yardım otağından götürərək. “Niyə bu qədər çətindir?” sualına insanlar da cavab tapmağa çalışırlar, oxuyun . Növbəti məqalə
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION