JavaRush /Java blogi /Random-UZ /Bahor qo'rqinchli emas, DTO qatlami

Bahor qo'rqinchli emas, DTO qatlami

Guruhda nashr etilgan
MAQOLA SIKLI MAZMUNI Biz Bahor haqida gapirishda davom etamiz. Bugun biz DTO naqshini tahlil qilamiz, tushunish uchun bu erda o'qishingiz mumkin . DTO haqida eng qiyin narsa bu nima uchun kerakligini tushunishdir. Keling, sabzavot haqida taxmin qilishni boshlaylik va shu bilan birga, kod yozing, ehtimol yo'lda nimadir aniqroq bo'ladi. Bahor-boot loyihasini yarating, h2 va Lombok ni ulang . Paketlarni yarating: ob'ektlar, omborlar, xizmatlar, utillar. Tashkilotlarda Mahsulot ob'ektini yarating:
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 sinflari va ItiiateUtil sinfini ( oldingi maqolaga o'xshash ) amalga oshiring. Aytaylik, biz kartoshkani ulgurji narxda 1 kg 20 rubldan, sabzi esa 14 rubldan sotib oldik. Xarid qilingan mahsulotlarni omborga joylashtiramiz. Keling, ma'lumotlar bazasiga quyidagi yozuvlarni qo'shamiz: [Id =1, nomi= “Kartoshka”, sotib olishPrice = 20] [Id =2, nomi= “Sabzi”, sotib olishPrice = 14] Yaxshi chayqovchilar sifatida biz o'z mahsulotimizni foydali sotishimiz kerak, buning uchun uni chiroyli qilib qadoqlaymiz va narxini oshiramiz. Ya'ni, bizda iflos va yoqimsiz sabzavotlar to'plangan edi, ammo hashamatli segmentdan toza premium vegan mahsulotlari bo'ladi. Qabul qiling, bu endi biz ommaviy ravishda sotib olgan mahsulot (ob'ekt) bo'lmaydi. Yangi mahsulot uchun dto paketini va unda ProductDto sinfini yarataylik
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-da mavjud bo'lmagan ikkita o'zgaruvchi mavjud: "qadoqlash" va "sotish narxi". dto ob'ekti ob'ekt bilan bir xil o'zgaruvchilarni o'z ichiga olishi mumkin yoki ulardan ko'p yoki kamroq bo'lishi mumkin. Biz bir ob'ektni boshqasiga aylantirish xaritalash masalasi ekanligini eslaymiz. Utils paketida biz MappingUtils sinfini yaratamiz
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 shunchaki bitta ob'ektdagi maydonlarni boshqa ob'ektning o'xshash maydonlari bilan to'ldiramiz. ProductService sinfida biz bitta mahsulot yoki mahsulotlar ro'yxatini qidirish usullarini amalga oshiramiz, lekin bundan oldin biz yuqorida yozilgan usul yordamida ob'ektni dto ga aylantiramiz.
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
    );
}
Endi bu sabzavotlarni ekranga qo'ysak nima bo'ladi? Ko'raylikchi. Buning uchun ItiiateUtil-ga quyidagi kodni yozing va uni ishga tushiring.
System.out.println("\nВитрина магазина");
for (ProductDto dto : productService.findAll()) {
    System.out.println(dto);
}
Natija: Doʻkon displeyi MahsulotDto(id=1, nomi=Kartoshka, sotib olishPrice=20, qadoqlash=null, salePrice=null) MahsulotDto(id=2, nomi=Sabzi, sotib olishPrice=14, qadoqlash=null, salePrice=null) Xo'sh, men yo'q! Bunday sabzavotlarni hech kim sotib olmaydi: ular iflos, qadoqlanmagan va sotish narxi noma'lum. Biznes mantiqi vaqti keldi. Biz uni ProductService sinfida amalga oshiramiz. Keling, avval ushbu sinfga bir nechta o'zgaruvchilar qo'shamiz:
private final Integer margin = 5;//это наша накрутка на цену
private final String packaging = "Упаковано в лучшем виде";//так будет выглядеть упаковка
Har bir harakat uchun: qadoqlash va narx belgilash, biz bir xil sinfda alohida usul yaratamiz:
// упаковываем товар
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-ga qaytamiz va displeydagi displeyni quyidagi kod bilan almashtiramiz
List<ProductDto> productDtos = productService.findAll();

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

System.out.println("\nВитрина магазина");
for (ProductDto dto : productDtos)) {
    System.out.println(dto);
}
Biz quyidagilarni amalga oshiramiz: Do'kon displeyi MahsulotDto (id=1, nomi=Kartoshka, sotib olishPrice=20, qadoqlash=Eng yaxshi usulda qadoqlangan, salePrice=100) ProductDto(id=2, nomi=Sabzi, sotib olishPrice=14, qadoqlash=Qadoqlangan) eng yaxshi usulda, sotuvPrice=70) Mahsulot chiroyli qadoqlangan, narxi bor, lekin siz uni ommaviy ravishda sotib olgan narxni va boshqa identifikatorni oynada ko'rganmisiz. Yuqorida yozilgan kodni fayl bilan o'zgartiramiz:
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 sinfi quyidagicha ko'rinishi kerak:
@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()
            ));
        }
    }
}
Keling, ishga tushiramiz: Do'kon oynasi Sotib olish: Kartoshka, narxi: 100 Sotib olish: Sabzi, narxi: 70 Yana bir narsa! Endi biz yaxshi narsalarni olib keldi deb o'ylaymiz, bir qator qo'shimcha kodlardan tashqari: 1. Biz ma'lumotlar bazasidagi ob'ektlarni o'zgartirmasdan biznes mantig'ini amalga oshirishimiz mumkin (aytaylik, bizda qadoqlash va sotish narxi haqida maydonlar bo'lishi shart emas). bu jadval). Kartoshka narx yorlig'i bilan qadoqlanmasdan ham saqlashda yaxshi saqlanadi, ular u erda hatto ortiqcha. 2. Ushbu qatorda List<ProductDto> productDtos = productService.findAll() biz biznes mantig'i doirasida ishlash uchun qulay bo'lgan ob'ektlar keshini yaratdik. Bu, agar biz tovarlarning bir qismini do'konning orqa xonasiga qo'ysak. 3. Bu bizga ikkita biznes harakatini amalga oshirish imkonini berdi: qadoqlash va belgilash, lekin biz ma'lumotlar bazasiga faqat bir marta so'rov qildik (ma'lumotlar bazasiga so'rovlar ishlash nuqtai nazaridan ancha qiyin). Siz mahsulotni qadoqlashingiz, unga narx belgisi qo'yishingiz va uni ko'rgazmaga qo'yishingiz mumkin - uni har safar saqlash xonasiga yugurishdan ko'ra, uni asta-sekin yordamchi xonadan olib ketishingiz mumkin. Savolga: "Nega bu juda qiyin?", odamlar ham javob topishga harakat qilishadi, o'qing . Keyingi maqola
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION