insert(BoardEntity)
update()
delete()
read()
list()
=> PersonDAOImpl과 동일한 매개변수와 리턴타입으로 작업하기
=> insert는 매개변수로 전달된 엔티티 한 개만 삽입
=> PersonDAOImplTest와 동일한 형식으로 테스트하기
=> BoardEntity, BoardDAOImpl

spring.application.name=jpatest
server.port=9000
server.servlet.context-path=/jpatest
#db에 대한 설정
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@127.0.0.1:1521:xe
spring.datasource.username=erp
spring.datasource.password=erp
#jpa에 대한 설정
#???? ??? ???? ?????. drop??? ???? create
#spring.jpa.hibernate.ddl-auto=create
spring.jpa.hibernate.ddl-auto=none
#sysout?? ???? ??? ?? - sql ??
spring.jpa.show-sql=true
#JPA log
logging.level.org.hibernate.sql=debug
logging.level.org.hibernate.type.descripter.sql=trace
#JPA? ??? sql? ??? ??
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.use_sql_comments=true
//JPA가 관리하는 객체 - 테이블과 매핑되는 객체
@Entity
@Table(name="person")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class PersonEntity {
//person테이블의 컬럼을 엔티티의 멤버변수로 정의
//기본키로 설정 - long타입의 시퀀스, UUID
@Id
@GeneratedValue
private Long id;
@Column(name = "pass")
private String password;
private String name;
//처음 데이터가 저장될때 시간을 저장
@CreationTimestamp
private Date createDate;
//update쿼리가 실행될때 현재 날짜와 시간 값을 저장해 마지막 수정시간을 자동으로 저장
@UpdateTimestamp
private Date modifyDate;
private int checkVal;
//오라클의 데이터타입을 BLOB,CLOB을 정의할때 사용
//@Lob으로 정의된 필드가 String이면 자동으로 CLOB타입으로 정의
@Lob
private String info;
//디비테이블에 컬럼으로 포함시키지 않겠다는 의미
@Transient
private String testval;
public PersonEntity(String password, String name, int checkVal, String info) {
this.password = password;
this.name = name;
this.checkVal = checkVal;
this.info = info;
}
public PersonEntity(Long id, String password, String info) {
this.id = id;
this.password = password;
this.info = info;
}
}
public interface PersonDAO {
void insert(PersonEntity dto) ;
PersonEntity read(String id);
void delete(String id);
void update(PersonEntity dto);
List<PersonEntity> list();
}
@Repository
@RequiredArgsConstructor
public class PersonDAOImpl implements PersonDAO{
//JPA내부에서 EntityManager를 이용해서 CRUD작업을 처리
//-> spring data jpa내부에서도 EntityManager를 사용
private final EntityManager entityManager;
@Override
public void insert(PersonEntity dto) {
//
System.out.println("persist메소드 호출 전");
entityManager.persist(dto);
entityManager.persist(dto);
entityManager.persist(new PersonEntity("1234","bts",100,"test"));
entityManager.persist(new PersonEntity("2222","석진",10000,"test"));
System.out.println("=======================================");
System.out.println(dto.getId());
//sql실행
entityManager.flush();
//캐시를 비우는 작업 - 캐시가 날라가므로 저장될 객체가 없어진다.
entityManager.clear();
//db에서 저장된 레코드를 조회하는 작업
//select * from person where id=1
//캐시에 저장되어있는 객체가 있으면 디비에서 조회하지 않고 캐시에서 객체를 꺼내온다
//(그래서 여기서 sql 셀렉트문이 안만들어짐)
PersonEntity data = entityManager.find(PersonEntity.class,dto.getId());
System.out.println(data);
System.out.println(dto==data);
System.out.println("*********************************");
}
@Override
public PersonEntity read(String id) {
return entityManager.find(PersonEntity.class,Long.parseLong(id));
}
@Override
public void delete(String id) {
//조회한 후 삭제
PersonEntity person = entityManager.find(PersonEntity.class,Long.parseLong(id));
System.out.println("=========================삭제전===========================");
System.out.println(person);
System.out.println(person.getId());
entityManager.remove(person);
}
@Override
public void update(PersonEntity dto) {
//조회 후 수정
//수정할 객체를 조회한 후에 수정
PersonEntity person = entityManager.find(PersonEntity.class,dto.getId());
person.setPassword(dto.getPassword());
person.setInfo(dto.getInfo());
}
/*
JPA는 내부에서 객체지향 쿼리를 사용해서 조회
객체지향쿼리 - JPQL
JPQL을 이용하면 이미 셋팅되어있는 테이블에 맞춰서 쿼리가 만들어진다.
복잡한 검색 조건이나 조인이 들어가있는 경우 적용이 가능
select, from, where, group by, having, join 지원 가능
밑엔 select * from Person이말임
*/
@Override
public List<PersonEntity> list() {
List<PersonEntity> list =
entityManager.createQuery("select p from PersonEntity as p",
PersonEntity.class).getResultList();
return list;
}
}
public interface PersonService {
void insert(PersonEntity dto) ;
PersonEntity read(String id);
void delete(String id);
void update(PersonEntity dto);
List<PersonEntity> list();
}
@RequiredArgsConstructor
@Service
public class PersonServiceImpl implements PersonService{
private final PersonDAO dao;
@Override
public void insert(PersonEntity dto) {
dao.insert(dto);
}
@Override
public PersonEntity read(String id) {
return dao.read(id);
}
@Override
public void delete(String id) {
dao.delete(id);
}
@Override
public void update(PersonEntity dto) {
dao.update(dto);
}
@Override
public List<PersonEntity> list() {
return dao.list();
}
}
@SpringBootTest
//하나의 메소드는 같은 트랜잭션으로 처리되어야함
@Transactional
//테스트작업시 롤백
@Rollback(value = false)
class PersonDAOImplTest {
@Autowired
PersonDAO dao;
@Test
@Disabled
public void test(){
//dao의 insert메소드를 테스트
//insert할때 Entity객체를 매개변수로 전달
//EntityManager의 persist메소드 내부에서 Entity객체의 정의된 내용을 보고 자동으로 insert문을 만들어서 저장
System.out.println("--------------------");
dao.insert(new PersonEntity("1234","bts",100, "기타"));
System.out.println("--------------------");
}
@Test
@Disabled
public void readTest(){
PersonEntity person = dao.read("3");
System.out.println(person);
}
@Test
@Disabled
public void deleteTest(){
dao.delete("3");
}
@Test
@Disabled
public void updateTest(){
dao.update(new PersonEntity(1L,"7777","자유~~~"));
}
@Test
public void listTest(){
System.out.println(dao.list());
}
}
본 포스팅은 멀티캠퍼스의 멀티잇 백엔드 개발(Java)의 교육을 수강하고 작성되었습니다.