JDBC API이다. 하지만 이 방식으로만 코딩하는 것은 굉장히 오래된 방법으로 어렵고 복잡하다. 따라서 MyBatis와 JPA를 사용하는데 전세계적으로 따질때 JPA를 더 많이 사용하는 추세이다.
JPA는 ORM(Object Relational Mapping)으로 SQL문 없이도 객체가 직접 DB와 연동이 되어 객체지향적이다.
JPA를 사용하면 JPA가 알아서 JDBC API를 사용해서 SQL 문 없이 통신한다.
자바 프로그램이 db와의 통신을 번역해주는 미들웨어라 볼 수 있다.
JPA를 사용하는 이유는 다음과 같다.
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
// 이는 JPA뿐만 아니라 JDBC도 포함한다.
/project_name/src/main/resources/templates/application.properties에 아래를 추가한다.
spring.jpa.show-sql=true // jpa가 변환한 sql문을 확인 가능하게 한다.
spring.jpa.hibernate.ddl-autu=none // 객체를 보고 자동으로 테이블을 만드는 기능이다.
@Entity // JPA가 관리할 entity를 선언해준다.
public class Member{
@ID primary ket를 mapping 한다.
@GeneratedValue(strategy = GenerationType.IDENTITY) // DB가 알아서 생성하게 한다.
private Long id;
@Column(name = "username") // table 상의 column의 이름과 다른 경우 맵핑한다.
private String name;
...
...
}
public class JpaMemberRepository implements MemberRepository {
private final EntityManager em; // properties와 DB와의 정보들이 연결되어 있는 무언가..?
public JpaMemberRepository(EntityManager em) {
this.em = em; // spring boot에서 만들어준 entity manager를 가져온다.
}
public Member save(Member member) {
em.persist(member); // persist 사용시 DB에 member객체를 넣어준다.
Member = member = em.find(Member.class, id) // find(type, key값) 사용시 DB에서 검색 및 반환을 한다.
return Optional.ofNullable(member);
}
}
key 값을 이용하지 않고 DB에서 검색하기 위해서는 SQL문을 작성을 해줘야 한다.
public Optional<Member> findByName(String name) {
List<Member> result = em.createQuery("select m from Member m where m.name = :name", Member.class)
.setParameter("name", name)
.getResultList();
return result.stream().findAny();
}
}
public List<Member> findAll() {
return em.createQuery("select m form Member as m", Member.class)
.getResultList;
} // 객체 자체를 대상으로