트레이닝

37. Spring (아이템,상품 등록)

Romenest 2021. 10. 6. 16:29

1. 아이템 엔티티 생성 Item

package com.example.entity;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

import org.hibernate.annotations.CreationTimestamp;

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;

@Entity
@Getter
@Setter
@NoArgsConstructor
@ToString
@Table(name = "ITEM")
@SequenceGenerator(name = "SEQ_ITEM_NO", sequenceName = "SEQ_ITEM_NO", allocationSize = 1, initialValue = 1)
public class Item {

    @Id
    @Column(name = "NO")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_ITEM_NO")
    private Long no;

    @Column(name = "NAME")
    private String name;

    @Column(name = "CONTENT")
    private String content;

    @Column(name = "PRICE")
    private Long price;

    @Column(name = "QUANTITY")
    private Long quantity;

    @CreationTimestamp
    @Column(name = "REGDATE")
    private Date regdate;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "SELLER_ID")
    private Member member;
}

2. 아이템 저장소 생성 ItemRepository

package com.example.repository;

import java.util.List;

import com.example.entity.Item;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

//spring boot, mybatis (저장소가 쿼리문 을 이용함), oracle, restful
@Repository
public interface ItemRepository extends JpaRepository<Item, Long> {

    // SELECT 검색명 FROM 테이블명
    // findAll()
    @Query(value = "SELECT * FROM Item", nativeQuery = true)
    public List<Item> querySelectItems();

    // SELECT 검색명 FROM 테이블명 WHERE 조건
    // findByNo()
    @Query(value = "SELECT * FROM Item WHERE NO=:no", nativeQuery = true)
    public Item querySelectItemWhere(@Param("no") Long no);
}

3. 아이템 서비스 생성 ItemServiceImpl

package com.example.service;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;

import com.example.entity.Item;
import com.example.repository.ItemRepository;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class ItemServiceImpl {

    @Autowired
    ItemRepository iRepository;

    @Autowired
    EntityManagerFactory emf;

    public List<Item> selectItemList() {
        // iRepository.findAll();
        return iRepository.querySelectItems();
    }

    public Item selectItemOne(long no) {
        // iRepository.findById(id).orElse(null);
        return iRepository.querySelectItemWhere(no);
    }

    public void insertBatch(List<Item> list) {
        iRepository.saveAll(list);

    }

    public void insertBatch1(List<Item> list) {
        EntityManager em = emf.createEntityManager();
        em.getTransaction().begin(); // 트렌젝션 시작
        for (Item item : list) {
            em.persist(item);
        }
        em.getTransaction().commit(); // commit(적용) or rollback(되돌리기) 선택
    }

    // Hibernate : insert into item(content,seller_id,name,price,quantity)

    // DML SQL문 (추가 , 삭제 , 수정 , 조회) CRUD
    // INSERT INTO 테이블명(컬럼명) VALUES(추가할값)
    // DELETE FROM 테이블명 WHERE 조건
    // UPDATE 테이블명 SET 컬럼명= 변경값 , 컬럼명=변경값 WHERE 조건
    // SELECT * FROM 테이블명

    public void insertBatch2(List<Item> list) {
        EntityManager em = emf.createEntityManager();
        em.getTransaction().begin();

        // Item 은 엔티티의 클래스명
        // INSERT INTO 테이블명(컬럼명) VALUES(추가할값)
        String sql = " INSERT INTO Item(NO, NAME, CONTENT, " + " PRICE, QUANTITY, REGDATE, SELLER_ID) "
                + " VALUES(SEQ_ITEM_NO.NEXTVAL, :name, " + " :content, :price, :quantity, "
                + " CURRENT_TIMESTAMP, :member) ";

        for (Item item : list) {
            em.createNativeQuery(sql).setParameter("name", item.getName()).setParameter("content", item.getContent())
                    .setParameter("price", item.getPrice()).setParameter("quantity", item.getQuantity())
                    .setParameter("member", item.getMember().getEmail()).executeUpdate();
        }
        em.getTransaction().commit();
    }

    public void updateBatch(List<Item> list) {
        EntityManager em = emf.createEntityManager();
        em.getTransaction().begin();

        // Item 은 엔티티의 클래스명
        // UPDATE 테이블명 SET 컬럼명= 변경값 , 컬럼명=변경값 WHERE 조건
        String sql = "UPDATE Item SET NAME=:name,CONTENT=:content, PRICE=:price, QUANTITY=:quantity WHERE NO=:no AND SELLER_ID=:member";

        for (Item item : list) {
            em.createNativeQuery(sql).setParameter("name", item.getName()).setParameter("content", item.getContent())
                    .setParameter("price", item.getPrice()).setParameter("quantity", item.getQuantity())
                    .setParameter("no", item.getNo()).setParameter("member", item.getMember().getEmail())
                    .executeUpdate();
        }
        em.getTransaction().commit();
    }

    public void deleteBatch(List<Item> list) {
        EntityManager em = emf.createEntityManager();
        em.getTransaction().begin();

        // Item 은 엔티티의 클래스명
        // DELETE FROM 테이블명 WHERE 조건
        String sql = "DELETE FROM Item WHERE NO=:no AND SELLER_ID=:member";

        for (Item item : list) {
            em.createNativeQuery(sql).setParameter("no", item.getNo())
                    .setParameter("member", item.getMember().getEmail()).executeUpdate();
        }
        em.getTransaction().commit();
    }
}

- sql, query문을 이용함