springBoot jdbcTemplate 分页工具实现

springBoot jdbcTemplate 分页工具实现

前言

这段时间使用jpa ,但是觉得jpa单表查询很方便,但多表查询加上分页并且返回自定义对象的时候就觉得很麻烦。所以想到用jdbcTeamplate来实现直接返回dto的效果。

分页对象

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class PageBean<T> {

    private List<T> content;  //内容列表

    private int size ;  //每页大小

    private int elementTotalSize;   //list中元素有多少个

    private int page; //当前页数

    private int totalPage;   //总的页数

    private int totalSize;   //总共的数量
}

jdbc工具类

@Component
public class JdbcUtil {

    @Autowired
    private JdbcTemplate jdbcTemplate;


    /**
     * 返回单个dto
     * @param sql 查询sql
     * @param queryArgs 查询参数
     * @param rowMapper dto mapper
     * @param  dto
     * @return dto
     */
    public <T>T getCustomerDto(String sql, Object[] queryArgs, RowMapper<T> rowMapper) {
        return jdbcTemplate.queryForObject(sql, queryArgs, rowMapper);
    }

    /**
     * 返回dto列表
     * @param sql 查询sql
     * @param queryArgs 查询参数
     * @param rowMapper dto mapper
     * @param  dto
     * @return dto list
     * */
    public <T> List<T> getCustomerDtoList(String sql, Object[] queryArgs, RowMapper<T> rowMapper) {
        return jdbcTemplate.query(sql, queryArgs, rowMapper);
    }

    /**
     * 返回分页对象
     * @param sql 查询sql
     * @param queryArgs 查询参数
     * @param rowMapper dto mapper
     * @param countSql 总量sql
     * @param countArgs 总量参数
     * @param page 当前页
     * @param size 每页大小
     * @param  dto
     * @return 分页对象
     */
    public <T> PageBean<T> getCustomerPageDto(String sql, Object[] queryArgs, RowMapper<T> rowMapper,
                                          String countSql, Object[] countArgs, int page, int size) {

        if (page <= 0){
            throw new RuntimeException("当前页数必须大于1");
        }
        if (size <= 0){
            throw new RuntimeException("每页大小必须大于1");
        }
        //总共数量
        int totalSize = jdbcTemplate.queryForObject(countSql,countArgs,Integer.class);
        if (totalSize == 0){
            return PageBean.<T>builder()
                    .content(new ArrayList<>())
                    .elementTotalSize(0)
                    .page(0)
                    .size(0)
                    .totalPage(0)
                    .totalSize(0)
                    .build();
        }
        //总页数
        int totalPage = totalSize%size == 0 ? totalSize/size : totalSize/size + 1;
        //开始位置
        int offset = (page -1)*size;
        //return item size
        int limit =  size;
        sql = sql +" limit "+ limit +" offset "+offset;
        List<T> content = jdbcTemplate.query(sql,queryArgs,rowMapper);
        return PageBean.<T>builder()
                .content(content)
                .elementTotalSize(content.size())
                .totalSize(totalSize)
                .totalPage(totalPage)
                .page(page)
                .size(size)
                .build();
    }

}

项目地址:gitub项目地址

你可能感兴趣的:(java)