jdbctemple分页实现

package com.lc.jiaotong.framework.core.page;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.lang.NonNull;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;


@Component
@Slf4j
public class PageUtil {

    private final JdbcTemplate jdbcTemplate;
    private final NamedParameterJdbcTemplate namedParameterJdbcTemplate;

    @Autowired
    public PageUtil(JdbcTemplate jdbcTemplate, NamedParameterJdbcTemplate namedParameterJdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
        this.namedParameterJdbcTemplate = namedParameterJdbcTemplate;
    }

    public <T> PageObject<T> queryPageObject(@NonNull String sql,
                                             @Nullable Object[] queryArgs, BeanPropertyRowMapper<T> rowMapper,
                                             int currentPage, int pageSize) {
        if (currentPage <= 0) throw new RuntimeException("当前页数必须大于1");
        if (pageSize <= 0) throw new RuntimeException("每页大小必须大于1");
        int totalSize = 0;
        try {
            Integer _totalSize = jdbcTemplate.queryForObject("select count(*) from (" + sql + " ) total ", Integer.class, queryArgs);
            totalSize = Objects.isNull(_totalSize) ? 0 : _totalSize;
        } catch (DataAccessException e) {
            log.error(e.getLocalizedMessage());
        }

        if (totalSize == 0) {
            return PageObject.<T>builder().currentPage(1).pageSize(pageSize)
                    .queryList(new ArrayList<>()).queryListSize(0).totalPage(0)
                    .totalSize(0).build();
        }
        int totalPage = totalSize % pageSize == 0 ? totalSize / pageSize : totalSize / pageSize + 1;
        int offset = (currentPage - 1) * pageSize;
        sql = sql + " limit " + pageSize + " offset " + offset;
        List<T> queryList = jdbcTemplate.query(sql, rowMapper, queryArgs);
        return PageObject.<T>builder().currentPage(currentPage)
                .pageSize(pageSize).queryList(queryList)
                .queryListSize(queryList.size()).totalPage(totalPage)
                .totalSize(totalSize).build();
    }

    public <T> Object queryPageObject(@NonNull String sql,
                                      SqlParameterSource paramSource,
                                      RowMapper<T> rowMapper,
                                      Integer currentPage,
                                      Integer pageSize) {
        if (ObjectUtils.isEmpty(currentPage) || ObjectUtils.isEmpty(pageSize)) {
            return namedParameterJdbcTemplate.query(sql, paramSource, rowMapper);
        }

        if (currentPage <= 0) throw new RuntimeException("当前页数必须大于1");
        if (pageSize <= 0) throw new RuntimeException("每页大小必须大于1");
        int totalSize = 0;
        try {
            Integer _totalSize = namedParameterJdbcTemplate.queryForObject("select count(*) from (" + sql + " ) total ", paramSource, Integer.class);
            totalSize = Objects.isNull(_totalSize) ? 0 : _totalSize;
        } catch (DataAccessException e) {
            log.error(e.getLocalizedMessage());
        }

        if (totalSize == 0) {
            return PageObject.<T>builder().currentPage(1).pageSize(pageSize)
                    .queryList(new ArrayList<>()).queryListSize(0).totalPage(0)
                    .totalSize(0).build();
        }
        int totalPage = totalSize % pageSize == 0 ? totalSize / pageSize : totalSize / pageSize + 1;
        int offset = (currentPage - 1) * pageSize;
        sql = sql + " limit " + pageSize + " offset " + offset;
        List<T> queryList = namedParameterJdbcTemplate.query(sql, paramSource, rowMapper);
        return PageObject.<T>builder().currentPage(currentPage)
                .pageSize(pageSize).queryList(queryList)
                .queryListSize(queryList.size()).totalPage(totalPage)
                .totalSize(totalSize).build();
    }

    public <T> Object queryPageObjectORC(@NonNull String sql,
                                         SqlParameterSource paramSource,
                                         RowMapper<T> rowMapper,
                                         Integer currentPage,
                                         Integer pageSize) {
        if (ObjectUtils.isEmpty(currentPage) || ObjectUtils.isEmpty(pageSize)) {
            return namedParameterJdbcTemplate.query(sql, paramSource, rowMapper);
        }

        if (currentPage <= 0) throw new RuntimeException("当前页数必须大于1");
        if (pageSize <= 0) throw new RuntimeException("每页大小必须大于1");
        int totalSize = 0;
        try {
            Integer _totalSize = namedParameterJdbcTemplate.queryForObject("select count(*) from (" + sql + " ) total ", paramSource, Integer.class);
            totalSize = Objects.isNull(_totalSize) ? 0 : _totalSize;
        } catch (DataAccessException e) {
            log.error(e.getLocalizedMessage());
        }
        if (totalSize == 0) {
            return PageObject.<T>builder().currentPage(1).pageSize(pageSize)
                    .queryList(new ArrayList<>()).queryListSize(0).totalPage(0)
                    .totalSize(0).build();
        }
        int totalPage = totalSize % pageSize == 0 ? totalSize / pageSize : totalSize / pageSize + 1;
        sql = "SELECT\n" +
                "\t* \n" +
                "FROM\n" +
                "\t( SELECT ROWNUM AS rowno, t.* FROM (" + sql + ") t WHERE ROWNUM <= " + currentPage * pageSize + " ) table_alias \n" +
                "WHERE\n" +
                "\ttable_alias.rowno >= " + ((currentPage - 1) * pageSize + 1);
        List<T> queryList = namedParameterJdbcTemplate.query(sql, paramSource, rowMapper);
        return PageObject.<T>builder().currentPage(currentPage)
                .pageSize(pageSize).queryList(queryList)
                .queryListSize(queryList.size()).totalPage(totalPage)
                .totalSize(totalSize).build();
    }

    public <T> PageObject<T> queryPageObjectORC(@NonNull String sql,
                                             @Nullable Object[] queryArgs, BeanPropertyRowMapper<T> rowMapper,
                                             int currentPage, int pageSize) {
        if (currentPage <= 0) throw new RuntimeException("当前页数必须大于1");
        if (pageSize <= 0) throw new RuntimeException("每页大小必须大于1");
        int totalSize = 0;
        try {
            Integer _totalSize = jdbcTemplate.queryForObject("select count(*) from (" + sql + " ) total ", Integer.class, queryArgs);
            totalSize = Objects.isNull(_totalSize) ? 0 : _totalSize;
        } catch (DataAccessException e) {
            log.error(e.getLocalizedMessage());
        }

        if (totalSize == 0) {
            return PageObject.<T>builder().currentPage(1).pageSize(pageSize)
                    .queryList(new ArrayList<>()).queryListSize(0).totalPage(0)
                    .totalSize(0).build();
        }
        int totalPage = totalSize % pageSize == 0 ? totalSize / pageSize : totalSize / pageSize + 1;
        sql = "SELECT\n" +
                "\t* \n" +
                "FROM\n" +
                "\t( SELECT ROWNUM AS rowno, t.* FROM (" + sql + ") t WHERE ROWNUM <= " + currentPage * pageSize + " ) table_alias \n" +
                "WHERE\n" +
                "\ttable_alias.rowno >= " + ((currentPage - 1) * pageSize + 1);
        List<T> queryList = jdbcTemplate.query(sql, rowMapper, queryArgs);
        return PageObject.<T>builder().currentPage(currentPage)
                .pageSize(pageSize).queryList(queryList)
                .queryListSize(queryList.size()).totalPage(totalPage)
                .totalSize(totalSize).build();
    }
}

sql=原sql

1.mysql:

        int offset = (currentPage - 1) * pageSize;
        sql = sql + " limit " + pageSize + " offset " + offset;

2.oracle:

        sql = "SELECT\n" +
                "\t* \n" +
                "FROM\n" +
                "\t( SELECT ROWNUM AS rowno, t.* FROM (" + sql + ") t WHERE ROWNUM <= " + currentPage * pageSize + " ) table_alias \n" +
                "WHERE\n" +
                "\ttable_alias.rowno >= " + ((currentPage - 1) * pageSize + 1);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!要使用 JdbcTemplate 操作 Blob 类型,可以按照以下步骤进行操作: 1. 首先,创建一个 `DataSource` 对象,用于连接到数据库。可以使用 Spring 的 `DriverManagerDataSource` 或者其他适合您的数据源实现。 2. 然后,创建一个 `JdbcTemplate` 对象,将数据源作为参数传入构造函数。 ```java JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); ``` 3. 接下来,可以使用 `jdbcTemplate` 对象执行 SQL 查询和更新操作。对于 Blob 类型的操作,可以使用 `jdbcTemplate` 的 `execute` 方法,并传入一个 `PreparedStatementCallback` 对象。 ```java jdbcTemplate.execute("INSERT INTO your_table (blob_column) VALUES (?)", new PreparedStatementCallback<Object>() { @Override public Object doInPreparedStatement(PreparedStatement ps) throws SQLException, DataAccessException { // 将 Blob 数据设置到 PreparedStatement 中 Blob blob = createBlobFromData(); // 创建 Blob 对象,可以根据需要自己实现 ps.setBlob(1, blob); ps.executeUpdate(); return null; } }); ``` 在上面的示例中,我们通过 `setBlob` 方法将 Blob 数据设置到 PreparedStatement 中,并执行更新操作。 4. 当需要从数据库中获取 Blob 类型的数据时,可以使用 `jdbcTemplate` 的 `query` 方法,并传入一个 `RowMapper` 对象。 ```java byte[] blobData = jdbcTemplate.query("SELECT blob_column FROM your_table WHERE id = ?", new Object[]{id}, new ResultSetExtractor<byte[]>() { @Override public byte[] extractData(ResultSet rs) throws SQLException, DataAccessException { if (rs.next()) { Blob blob = rs.getBlob("blob_column"); if (blob != null) { return blob.getBytes(1, (int) blob.length()); } } return null; } }); ``` 在上面的示例中,我们通过 `getBlob` 方法获取 Blob 数据,并使用 `getBytes` 方法将其转换为字节数组。 这样,您就可以使用 JdbcTemplate 操作 Blob 类型的数据了。请注意,上述示例中的表名、列名和参数均需要根据您的实际情况进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值