getConnection을 통해 가져오고
prepareStatement에서 sql을 넣는다
RETURN_GENERATED_KEYS id값 리턴??
- set string으로 sql문의 ?부분에 값을 넣는다
executeUpdate ->db 에 실제 쿼리가 날라간다.
RETURN_GENERATED_KEYS에 매칭하여 getGeneratedKeys를 사용하는데 아이디를 반환해줌
사용한 자원들은 모두 반환해야 한다.
조회의 경우executeQuery사용
datasourceutils
jdbc를 만들때 인터페이스 확장외에 아무것도 손대지 않았다(스프링이 제공하는 config제외)
solid 원칙
- 개방 폐쇄의 원칙
확자에는 열려있고 수정에는 닫혀있ek.
통합테스트
스프링과 엮어서 하는 테스트
@springBootTest
@Transactional
springcontainer한테 가져오라고 한다.
테스트를 할때는 필드기반으로 @Autowired를 사용하는게 편리
afterEach의 역할을 transactional해준다.
insert를 해도 comit을 해야 들어간다. 롤백을 하면 db에 데이터가 없어짐
transactional를 test에 달면 테스트를 실행할때 db에 데이터를 insert하고 실행 한 후 롤백을 해준다.
스프링 보다 자바로 돌리는것이 더 빠르다
jdbcTemplate
jdbcTemplate을 만들고 jdbcTemplate(datasource)를 넣는다.
생성자가 하나일때는 @autowired생략가능
jdbcTemplate.query("select * from member where id=?",memberRowMapper());
rowmapper를 만들어야 한다. 원하는 형태의 결과값을 반환
return result.stream().findAny()
findAny: 조건에 일치하는 요소 1개를 리턴합니다
jpa
JPA는 기존의 반복 코드는 물론이고, 기본적인 SQL도 JPA가 직접 만들어서 실행해준다.
JPA를 사용하면, SQL과 데이터 중심의 설계에서 객체 중심의 설계로 패러다임을 전환을 할 수 있다.
@Entity :jpa가 관리한다
@id :기본키
@GeneratedValue : ??
springboot가 자동으로 만들어준 EntityManager로 jpa의 모든 동작
조회 =>
Member member=em.find(Member.class ,id);
return Optional.ofNullable(member);
id와 달리name은 jpql이라는 것을 사용
pk 기반이 아닌것들은 jpql작성 => 스프링 데이터 jpa를 사용하면 jpql사용하지 않아도 됨
findAll()
em.createQuery("select m from Member m",Member.class).getResultList();
Data Jpa
인터페이스에서 인터페이스 받을때는 extends사용
인터페이스를 만들고 extends Jparepository를 하면 자동으로 만들어서 bean에 등록한다.
단순 조회나 crud모두 제공이 된다.
하지만 name같이 모두 다른것은 제공 불가
findByName(String name)을 하면 자동으로 jspl을 만들어준다.
인터페이스 이름으로 개발을 할 수있다.