본문 바로가기
ORM

myBatis Java에서 Consumer 이용한 페이징 쿼리 처리

by 수앙 2022. 9. 17.

Java에서 페이징 쿼리 호출해서 사용할 시

보통 for문 안에서 page 값 계산해서 쿼리 호출 후 결과로 로직 처리하고

다시 page 값 계산해서 쿼리 호출 후 결과로 로직 처리하고

이런 반복되는 부분을 Consumer로 처리해보았다.

 

- 페이징 유틸 소스

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;

import org.mybatis.spring.SqlSessionTemplate;

import lombok.Builder;

@Builder
public class PagingUtil<T> {

    private int pageSize;
    
    private SqlSessionTemplate sqlSessionTemplate;
    
    private String statement;
    
    private Map<String, Object> paramMap;
    
    private void notNull(Object object, String message) {
        if (object == null) {
            throw new IllegalArgumentException(message);
        }
    }
    
    public void forEach(Consumer<T> action) {
        notNull(sqlSessionTemplate, "sqlSessionTemplate is required.");
        notNull(statement, "statement is required.");
        
        int page = 0;
        
        if (pageSize == 0) {
            pageSize = 100;
        }
        
        if (paramMap == null) {
            paramMap = new HashMap<>();
        }
        
        while (true) {
            paramMap.put("limit", page * pageSize);
            paramMap.put("offset", pageSize);
            List<T> list = sqlSessionTemplate.selectList(statement, paramMap);
            
            if (list.isEmpty()) {
                break;
            }

            for (T t : list) {
                action.accept(t);
            }
            
            page++;
        }
    }
    
}

 

- 페이징 유틸 소스 호출 부분

    public static void main(String[] args) throws Exception {
        Driver driver = <Driver>;
        String url = "<url>";
        String username = "<username>";
        String password = "<password>";
        SimpleDriverDataSource dataSource = new SimpleDriverDataSource(driver, url, username, password);
        
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath:mybatis/mappers/*-sql.xml"));
        sqlSessionFactoryBean.setConfigLocation(resolver.getResource("classpath:mybatis/mybatis-config.xml"));
        SqlSessionTemplate sqlSessionTemplate = new SqlSessionTemplate(sqlSessionFactoryBean.getObject());
        
        PagingUtil.<T>builder()
        .sqlSessionTemplate(sqlSessionTemplate)
        .statement(..)
        .pageSize(3)
        .paramMap(..)
        .build()
        .forEach(t -> {
            // 로직처리
            System.out.println(t);
        });
    }

 

끝.

'ORM' 카테고리의 다른 글

myBatis list/array parameter type 처리  (0) 2018.10.23
myBatis plugin interceptor sql 바인딩 로깅 구현  (0) 2015.09.01
Java + MyBatis  (0) 2011.09.21

댓글