JavaRush /Blog Jawa /Random-JV /Spring ora medeni, lapisan DTO
Павел
tingkat

Spring ora medeni, lapisan DTO

Diterbitake ing grup
ISI SIKLUS ARTIKEL Kita terus ngomong babagan Spring. Dina iki kita bakal njelasno pola DTO, kanggo pangerten sampeyan bisa maca kene . Sing paling angel babagan DTO yaiku ngerteni kenapa dibutuhake. Ayo miwiti spekulasi babagan sayuran, lan ing wektu sing padha, tulis kode, bisa uga ana sing luwih jelas. Nggawe proyek spring-boot , nyambung h2 lan Lombok . Nggawe paket: entitas, repositori, layanan, utils. Ing entitas, gawe entitas Produk:
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;//закупочная цена

}
Ngleksanakake ProducRepository, kelas ProducService lan kelas ItiiateUtil ( padha karo artikel sadurunge ). Ayo kita tuku kentang kanthi rega grosir 20 rubel saben kg, lan wortel 14 rubel saben kg. Kita bakal nyelehake produk sing dituku ing panyimpenan. Ayo ditambahake cathetan ing ngisor iki menyang database: [Id = 1, jeneng = "Kentang", purchasePrice = 20] [Id = 2, name = "Wortel", purchasePrice = 14] Minangka spekulan sing prayoga, kita kudu ngedol barang-barang kita kanthi bathi, kanggo iki, ayo bungkus kanthi apik lan kita bakal nambah rega. Yaiku, kita duwe sayuran sing reged lan ora apik sing ditumpuk, nanging bakal ana produk vegan premium sing resik saka segmen mewah. Setuju, iki ora bakal dadi produk (obyek) sing padha sing dituku kanthi akeh. Kanggo produk anyar, nggawe paket dto lan ing kelas ProductDto
package ru.java.rush.dto;

import lombok.Data;

@Data
public class ProductDto {
    Integer id;
    String name;
    Integer purchasePrice;
    String  packaging;//упаковка
    Integer salePrice;//цена реализации
}
ProductDto duwe rong variabel sing ProductEntity ora: "kemasan" lan "rega sade". Obyek dto bisa ngemot variabel sing padha karo entitas, utawa bisa uga ana luwih utawa kurang. Kita elinga yen ngowahi obyek siji menyang obyek liyane yaiku masalah pemetaan. Ing paket utils kita bakal nggawe kelas MappingUtils
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;
    }
}
Kita mung ngisi kolom saka siji obyek kanthi kolom sing padha saka obyek liyane. Ing kelas ProductService, kita ngleksanakake cara kanggo nggoleki produk siji utawa dhaptar produk, nanging sadurunge kita ngowahi entitas menyang dto nggunakake metode sing ditulis ing ndhuwur.
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
    );
}
Apa bakal kelakon yen saiki kita sijine sayuran iki ing tampilan? Ayo ndeleng. Kanggo nindakake iki, nulis kode ing ngisor iki ing ItiiateUtil lan mbukak.
System.out.println("\nВитрина магазина");
for (ProductDto dto : productService.findAll()) {
    System.out.println(dto);
}
Output yaiku: Tampilan toko ProductDto(id=1, jeneng=Kentang, purchasePrice=20, packaging=null, salePrice=null) ProductDto(id=2, name=Wortel, purchasePrice=14, packaging=null, salePrice=null) Inggih, aku ora! Ora ana sing bakal tuku sayuran kaya ngono: reged, ora dibungkus, lan rega adol ora dingerteni. Iku wektu kanggo logika bisnis. Kita ngleksanakake ing kelas ProductService. Ayo tambahake sawetara variabel menyang kelas iki:
private final Integer margin = 5;//это наша накрутка на цену
private final String packaging = "Упаковано в лучшем виде";//так будет выглядеть упаковка
Kanggo saben tumindak: kemasan lan markup rega, kita bakal nggawe cara sing kapisah ing kelas sing padha:
// упаковываем товар
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)
    );
}
Kita bali menyang ItiiateUtil lan ngganti tampilan ing tampilan karo kode ing ngisor iki
List<ProductDto> productDtos = productService.findAll();

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

System.out.println("\nВитрина магазина");
for (ProductDto dto : productDtos)) {
    System.out.println(dto);
}
Kita nindakake: Toko tampilan ProductDto(id=1, jeneng=Kentang, tukuPrice=20, packaging=Dikemas ing cara sing paling apik, salePrice=100) ProductDto(id=2, jeneng=Wortel, tukuPrice=14, packaging=Dikemas kanthi cara sing paling apik, salePrice=70) Produk kasebut dikemas kanthi apik, ana regane, nanging sampeyan wis ndeleng ing endi wae ing jendela nampilake rega sing sampeyan tuku kanthi akeh lan sawetara id liyane. Kita ngowahi kode sing ditulis ing ndhuwur nganggo file:
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()
    ));
}
class InitiateUtils kudu katon kaya iki:
@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()
            ));
        }
    }
}
Ayo diluncurake: Jendhela toko Tuku: Kentang, rega: 100 Tuku: Wortel, rega: 70 Liyane! Saiki kita mikir sing dto nggawa iku apik, kajaba Bunch saka kode tambahan: 1. Kita bisa nindakake logika bisnis tanpa ngganti obyek ing database (ayo ngomong, uga, kita ora perlu duwe kothak bab packaging lan rega sales ing tabel iki). Kentang bakal tahan kanthi apik ing panyimpenan sanajan tanpa kemasan kanthi label rega, malah ora perlu. 2. Ing baris iki List<ProductDto> productDtos = productService.findAll () kita digawe cache saka obyek sing trep kanggo bisa karo ing logika bisnis. Iki yen kita sijine sawetara barang ing kamar mburi toko. 3. Iki ngidini kita nindakake rong tumindak bisnis: kemasan lan markup, nanging kita njaluk panjaluk database mung sapisan (pitakon menyang database cukup angel babagan kinerja). Sampeyan bisa ngemas produk kasebut, menehi label rega lan dilebokake ing layar - mboko sithik njupuk saka ruangan sarana, tinimbang mlaku-mlaku saben menyang ruangan panyimpenan. Kanggo pitakonan: "Yagene angel banget?", Wong uga nyoba golek jawaban, maca . Artikel sabanjure
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION