querydsl , jdbcTemplate
- SPRING & JAVA
- 2022. 9. 27.
querydsl
https://velog.io/@shlee327/Querydsl-기본문법-학습하기
https://madplay.github.io/post/introduction-to-querydsl
https://tecoble.techcourse.co.kr/post/2021-08-08-basic-querydsl/
https://akdl911215.tistory.com/307
https://ttl-blog.tistory.com/150
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import java.util.List;
public interface PostsRepository extends JpaRepository<Posts, Long> {
@Query("select p from Post p join fetch p.user u "
+ "where u in "
+ "(select t from Follow f inner join f.target t on f.source = :user) "
+ "or u = :user "
+ "order by p .createdAt desc")
List<Post> findAllAssociatedPostsByUser(@Param("user") User user, Pageable pageable);
@Query("SELECT p FROM Posts p ORDER BY p.id DESC")
List<Posts> findAllDesc();
}
Spring Data JPA 가 기본적으로 제공해주는 CRUD 메서드 및 쿼리 메서드 기능을 사용하더라도 원하는 조건의 데이터를 가져오기 위해서는 JPQL 을 작성하게 된다. 간단한 로직을 작성하는데는 문제 없으나 복잡한 로직의 경우 개행이 포함된 쿼리 문자열이 매우 길어질 수 있다. JPQL 문자열에 오타 혹은 문법적인 오류가 존재하는 경우 정적 쿼리라면 앱 로딩 시점에 이를 발견할 수 있지만 그 외에는 런타임 시점에서 에러가 발생한다. 이러한 문제를 어느정도 해소할 수 있는 것이 QueryDSL 이다.
@Query 속성 중에 nativeQuery 속성을 true 로 설정하지 않으면 Default 값으로 JPQL 문법이 동작한다.
JPQL 문법은 JPA 에서 사용되는 언어이며 쿼리 구문과 유사하나 Table 이 아닌 Entity 를 기준으로 데이터를 조회한다는 것이 다른다. 하지만 만약 쿼리 문법이 더 익숙하다면 nativeQuery 속성을 통해 직접 쿼리를 작성할 수 있다.
Spring Boot 에서 spring.datasource.url 등의 프로퍼티 값이 JPA 의 datasource 로 기본적으로 사용되지만 Configuration, Bean 을 통해 여러 datasource 를 만들고 사용할 수 있다.
https://howtodoinjava.com/spring-boot2/datasource-configuration/
https://howtodoinjava.com/spring-boot2/jpa-hibernate-hikaricp-config/
https://www.baeldung.com/spring-boot-configure-data-source-programmatic
https://mkyong.com/spring-boot/spring-boot-jdbc-mysql-hikaricp-example/
https://www.baeldung.com/spring-boot-hikari
Good!!
https://velog.io/@suran-kim/springBoot
jdbcTemplate queryForList, queryForObject... good!
https://mkyong.com/spring/spring-jdbctemplate-querying-examples/
import org.springframework.jdbc.core.RowMapper;
import java.sql.ResultSet;
import java.sql.SQLException;
public class CustomerRowMapper implements RowMapper<Customer> {
@Override
public Customer mapRow(ResultSet rs, int rowNum) throws SQLException {
Customer customer = new Customer();
customer.setID(rs.getLong("ID"));
customer.setName(rs.getString("NAME"));
customer.setAge(rs.getInt("AGE"));
customer.setCreatedDate(rs.getTimestamp("created_date").toLocalDateTime());
return customer;
}
}
import org.springframework.jdbc.core.JdbcTemplate;
@Autowired
private JdbcTemplate jdbcTemplate;
public Customer findByCustomerId(Long id) {
String sql = "SELECT * FROM CUSTOMER WHERE ID = ?";
return jdbcTemplate.queryForObject(sql, new Object[]{id}, new CustomerRowMapper());
}
public List<Customer> findAll() {
String sql = "SELECT * FROM CUSTOMER";
List<Customer> customers = jdbcTemplate.query(
sql,
new CustomerRowMapper());
return customers;
}
public List<Customer> findAll() {
String sql = "SELECT * FROM CUSTOMER";
List<Customer> customers = jdbcTemplate.query(
sql,
new BeanPropertyRowMapper(Customer.class));
return customers;
}
public List<Customer> findAll() {
String sql = "SELECT * FROM CUSTOMER";
return jdbcTemplate.query(
sql,
(rs, rowNum) ->
new Customer(
rs.getLong("id"),
rs.getString("name"),
rs.getInt("age"),
rs.getTimestamp("created_date").toLocalDateTime()
)
);
}
public List<Customer> findAll() {
String sql = "SELECT * FROM CUSTOMER";
List<Customer> customers = new ArrayList<>();
List<Map<String, Object>> rows = jdbcTemplate.queryForList(sql);
for (Map row : rows) {
Customer obj = new Customer();
obj.setID(((Integer) row.get("ID")).longValue());
obj.setName((String) row.get("NAME"));
// Spring returns BigDecimal, need convert
obj.setAge(((BigDecimal) row.get("AGE")).intValue());
obj.setCreatedDate(((Timestamp) row.get("CREATED_DATE")).toLocalDateTime());
customers.add(obj);
}
return customers;
}
jdbcTemplate stored procedure
https://stackoverflow.com/questions/9361538/spring-jdbc-template-for-calling-stored-procedures
DB2 stored procedure
https://heodolf.tistory.com/67
'SPRING & JAVA' 카테고리의 다른 글
feign vs restTemplate vs webClient (0) | 2022.09.04 |
---|---|
전자정부프레임워크 (0) | 2021.04.03 |
자바의 스프링을 사용한 플랫폼에서 국제화 i18n / fmt:message vs spring:message (0) | 2021.02.19 |
jsp jstl 요약 (0) | 2021.02.19 |
intellij utf-8 encoding 설정 (0) | 2020.11.01 |