728x90
쓰이는 단축키(Window)
alt+Enter : 람다식으로 바꿔주는 방법
ctrl+alt+n :인라인 합쳐짐
JDBC Template import 방법
1. build.gradle에서 implementation 'org.springframework.boot:spring-boot-starter-jdbc' 을
추가해준다.
(*)디자인 패턴 중 template method 패턴으로 이렇게 줄일 수 있다고 한다.
2. JDBCTemplateMemberRepository
package welcome.welcomespring.repository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcInsert;
import welcome.welcomespring.domain.Member;
import javax.sql.DataSource;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
public class JdbcTemplateMemberRepository implements MemberRepository{
private final JdbcTemplate jdbcTemplate;
public JdbcTemplateMemberRepository(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
//생성자 하나만 쓰면 autowired 생략가능
@Override
public Member save(Member member) {
SimpleJdbcInsert jdbcInsert = new SimpleJdbcInsert(jdbcTemplate);
jdbcInsert.withTableName("member").usingGeneratedKeyColumns("id");
Map<String, Object> parameters = new HashMap<>();
parameters.put("name", member.getName()); //insert문 만들어짐
Number key = jdbcInsert.executeAndReturnKey(new MapSqlParameterSource(parameters));
member.setId(key.longValue());
return member;
}
@Override
public Optional<Member> findById(Long id) {
List<Member> result = jdbcTemplate.query("select * from member where id= ?", memberRowMapper(), id);
return result.stream().findAny();
}
@Override
public Optional<Member> findByName(String name) {
List<Member> result = jdbcTemplate.query("select * from member where name= ?", memberRowMapper(), name);
return result.stream().findAny();
}
@Override
public List<Member> findAll() {
return jdbcTemplate.query("select * from member", memberRowMapper());
}
private RowMapper<Member> memberRowMapper() {
return (rs, rowNum) -> {
Member member = new Member();
member.setId(rs.getLong("id"));
member.setName(rs.getString("name"));
return member;
};
}
}
실행로직
dataSource 를 넣어준다
@Configuration
public class SpringConfig {
@Bean
public MemberService memberService() {
return new MemberService(memberRepository()); //로직을 호출해서 bean에 등록해준다
// 밑에 메서드 호출
}
@Bean
public MemberRepository memberRepository(){
return new JdbcTemplateMemberRepository(dataSource);
}
}
JPA 란?
JPA는 기존의 반복 코드는 물론이고, 기본적인 SQL도 JPA가 직접 만들어서 실행해준다.
JPA를 사용하면, SQL과 데이터 중심의 설계에서 객체 중심의 설계로 패러다임을 전환을 할 수 있다.
JPA를 사용하면 개발 생산성을 크게 높일 수 있다.
Mybatis와 비교해서 쓰기도 한다.
application.properties에
spring.jpa.show-sql=ture
spring.jpa.hibernate.ddl-auto=none
를 추가한다.
ORM
Member class에 @Entity 어노테이션 추가
@Id(persistence import 추가)
@GeneratedValue로 Identity
@Column 어노테이션으로 컬럼값 추가
package welcome.welcomespring.domain;
import javax.persistence.*;
@Entity
public class Member {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
//DB가 알아서 생성 IDENTITY
private Long id; //시스템상 아이디 식별자
@Column(name= "userName")
private String name;
JpaMemberRepository
import javax.persistence.EntityManager;
import java.util.List;
import java.util.Optional;
public class JpaMemberRepository implements MemberRepository {
private final EntityManager em;
public JpaMemberRepository(EntityManager em) {
this.em = em;
}
@Override
public Member save(Member member) {
em.persist(member);
return member;
}
@Override
public Optional<Member> findById(Long id) {
Member member = em.find(Member.class, id);
return Optional.ofNullable(member);
}
@Override
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();
}
@Override
public List<Member> findAll() {
return em.createQuery("select m from Member m ", Member.class).getResultList();
}
}
findAll부분에 "select m(객체자체) from Member as m"
Service에 @Transactional 어노테이션 추가
```java
@Override
public List<Member> findAll() {
return em.createQuery("select m(객체자체) from Member m (as m )", Member.class).getResultList();
}
//List<Member> reseult = ;
//return result;
```
public class SpringConfig {
private EntityManager em;
@Autowired
public SpringConfig(EntityManager em) {
this.em = em;
}
@Bean
public MemberRepository memberRepository(){
return new JpaMemberRepository();
}
}
REFERENCE
'Spring > Spring' 카테고리의 다른 글
[inflearn / spring 입문(완강)] AOP 개념 (0) | 2022.02.24 |
---|---|
[inflearn / Spring 입문] Spring Data JPA (0) | 2022.02.22 |
[inflearn / Spring 입문] 순수 JDBC와 통합테스트 (0) | 2022.02.18 |
[inflearn / spring 입문] 회원 등록/목록 만들기 (0) | 2022.02.16 |
[inflearn / spring 입문] 자바코드로 직접 스프링 빈 등록하기(*) (0) | 2022.02.15 |