querydsl , jdbcTemplate

반응형

 

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

 

[springBoot] Datasource와 Jdbc Template

DataSource는 커넥션을 관리하는 주체이다.

velog.io

 

jdbcTemplate queryForList, queryForObject... good!

https://mkyong.com/spring/spring-jdbctemplate-querying-examples/

 

Spring JdbcTemplate Querying Examples - Mkyong.com

- Spring JdbcTemplate Querying Examples

mkyong.com

 

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://intrepidgeeks.com/tutorial/call-the-spring-jdbc-template-stored-procedure-and-return-the-list-target

https://stackoverflow.com/questions/9361538/spring-jdbc-template-for-calling-stored-procedures

 

 

DB2 stored procedure

https://heodolf.tistory.com/67

 

 

 

 

 

 

 

 

 

 

반응형

댓글

Designed by JB FACTORY