springboot sql不用limit語句實現分頁查詢,很方便!!!

1、涉及內容:

①springboot

②java分頁查詢

③bootstrap前端框架 表單

FreeMarker的<#if><#else>、<#list>標籤使用

1.1建表:

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) NOT NULL,
  `password` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8;

 1.2、我的springboot目錄:

 

1.3、maven依賴:

對於springboot框架 以及FreeMarker模板等

 

 <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <!--
        <version>2.0.2.RELEASE</version>
         -->
        <version>1.5.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.7</java.version>
    </properties>

<dependencies>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-legacy</artifactId>
        <version>1.1.0.RELEASE</version>
    </dependency>
    <!--
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-freemarker</artifactId>
    </dependency>

    <!-- Spring Boot log4j依賴 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-log4j</artifactId>
        <version>1.3.8.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>c3p0</groupId>
        <artifactId>c3p0</artifactId>
        <version>0.9.0</version>
    </dependency>

    <dependency>
        <groupId>commons-dbutils</groupId>
        <artifactId>commons-dbutils</artifactId>
        <version>1.7</version>
    </dependency>

    <dependency>
        <groupId>com.sinocontact</groupId>
        <artifactId>sinocontact-dbutils</artifactId>
        <version>0.0.1</version>
    </dependency>

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.21</version>
    </dependency>

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.15</version>
    </dependency>


    <dependency>
        <groupId>com.aliyun.oss</groupId>
        <artifactId>aliyun-sdk-oss</artifactId>
        <version>2.8.2</version>
    </dependency>


    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.5</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.session</groupId>
        <artifactId>spring-session-data-redis</artifactId>
    </dependency>
    <!-- https://mvnrepository.com/artifact/javax.mail/mail -->
    <dependency>
        <groupId>javax.mail</groupId>
        <artifactId>mail</artifactId>
        <version>1.4.7</version>
    </dependency>


    <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>3.17</version>
    </dependency>

    <!--barcode4j-->
    <dependency>
        <groupId>net.sf.barcode4j</groupId>
        <artifactId>barcode4j-light</artifactId>
        <version>2.0</version>
    </dependency>

    <dependency>
        <!-- jsoup HTML parser library @ https://jsoup.org/ -->
        <groupId>org.jsoup</groupId>
        <artifactId>jsoup</artifactId>
        <version>1.11.3</version>
    </dependency>

    <dependency>
        <groupId>com.sinocontact</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.9.1</version>
    </dependency>


    <dependency>
        <groupId>com.sinocontact</groupId>
        <artifactId>aspose-words</artifactId>
        <version>14.9.0</version>
    </dependency>


</dependencies>


    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

 2、實現效果:

3、具體實現:

 

3.1、User實體類:

package com.lemon.pojo;

public class User {

    private Integer id;
    private String username;
    private String password;

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

3.2、UserDao

springboot可以整合mybatis、hobernate等,用於數據庫查詢(熟練那個就用哪個)

package com.lemon.dao;

import com.lemon.pojo.User;
import com.lemon.utils.Page;
import com.lemon.utils.PageUtils;
import com.sinocontact.dbutils.DBControl;
import org.apache.log4j.Logger;
import org.omg.PortableInterceptor.INACTIVE;


import java.util.List;

public class UserDao {

    private static final Logger logger = Logger.getLogger(UserDao.class);

    //查詢所有用戶
    public Page queryAllUser(Integer pageNo){

        String sql = "select * from user";
        try {

            List<User> userList = DBControl.getMainDbOperator().queryBeanList(sql, User.class);

            Page page = PageUtils.doPage(userList, pageNo);

            return page;
        }catch (Exception e){
            logger.error("查詢user錯誤:",e);
        }

        return null;
    }

}

 3.3、userService:

package com.lemon.service;

import com.lemon.dao.UserDao;
import com.lemon.pojo.User;
import com.lemon.utils.Page;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserService {
    private static final Logger logger = Logger.getLogger(UserService.class);

    private UserDao userDao = new UserDao();

    //查詢所有用戶
    public Page queryAllUser(String pageNo){

        Integer realPageNo = getRealPageNo(pageNo);

        Page page = userDao.queryAllUser(realPageNo);




        return page;
    }

    /**
     * 真實頁碼
     * @author lemon
     * @since 2019/10/28 0028
     */
    private Integer getRealPageNo(String pageNo) {
        Integer realPageNo = 1;

        try {
            if (!StringUtils.isEmpty(pageNo)) {
                realPageNo = Integer.parseInt(pageNo);
            }
        }catch (Exception e){
            logger.error("真實頁碼轉換錯誤",e);
        }

        return realPageNo;
    }

}

 3.4、Page.java

分頁實體類

package com.lemon.utils;

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

import org.apache.log4j.Logger;



/**
 * 分頁實體類
 * 頁碼從第一頁開始。
 * @author lemon
 * @since 2019/10/28 0028
 */
public class Page {
    private static final Logger logger = Logger.getLogger(Page.class);

    //返回的一頁數據
    private List list = new ArrayList();

    //符合條件的總記錄數
    private Integer totalElements = 0;

    //符合條件的總頁數
    private Integer totalPages = 0;

    //一頁多少條記錄
    private Integer pageSize = 3;

    //當前頁碼
    private Integer currentPageNo = 1;

    //上一頁的頁碼(如果爲0,表示不同顯示或不可點擊)
    private Integer prevPageNo = 0;

    //下一頁的頁碼(如果爲0,表示不用顯示或不可點擊)
    private Integer nextPageNo = 0;

    //可點擊的頁碼列表(其中頁碼爲零表示不可點擊)
    private List<Integer> pageNoList = new ArrayList<>();

    @Override
    public String toString() {
        return "Page{" +
                "list=" + list +
                ", Page一頁數據輸出:totalElement=" + totalElements +
                ", totalPages=" + totalPages +
                ", pageSize=" + pageSize +
                ", currentPageNo=" + currentPageNo +
                ", prevPageNo=" + prevPageNo +
                ", nextPageNo=" + nextPageNo +
                ", pageNoList=" + pageNoList +
                '}';
    }

    public Integer getTotalElements() {
        return totalElements;
    }

    public void setTotalElements(Integer totalElements) {
        this.totalElements = totalElements;
    }

    public static Logger getLogger() {
        return logger;
    }

    public List getList() {
        return list;
    }

    public void setList(List list) {
        this.list = list;
    }


    public Integer getTotalPages() {
        return totalPages;
    }

    public void setTotalPages(Integer totalPages) {
        this.totalPages = totalPages;
    }

    public Integer getPageSize() {
        return pageSize;
    }

    public void setPageSize(Integer pageSize) {
        this.pageSize = pageSize;
    }

    public Integer getCurrentPageNo() {
        return currentPageNo;
    }

    public void setCurrentPageNo(Integer currentPageNo) {
        this.currentPageNo = currentPageNo;
    }

    public Integer getPrevPageNo() {
        return prevPageNo;
    }

    public void setPrevPageNo(Integer prevPageNo) {
        this.prevPageNo = prevPageNo;
    }

    public Integer getNextPageNo() {
        return nextPageNo;
    }

    public void setNextPageNo(Integer nextPageNo) {
        this.nextPageNo = nextPageNo;
    }

    public List<Integer> getPageNoList() {
        return pageNoList;
    }

    public void setPageNoList(List<Integer> pageNoList) {
        this.pageNoList = pageNoList;
    }
}

 3.5、PageUtils.java

分頁工具類

package com.lemon.utils;

import org.apache.log4j.Logger;

import java.util.ArrayList;
import java.util.List;
/**
 * 分頁工具類
 * @author: lemon
 * @since: 2019/10/29 0029
 */
public class PageUtils {

    private static final Logger logger = Logger.getLogger(PageUtils.class);

    //一頁最多顯示多少條記錄
    private static final Integer pageSize = 3;

    //頁碼最多顯示多少個
    private static final Integer maxCountPageNo = 3;

    /**
     * 進行指定頁數據獲取
     * @author lemon
     * @since 2019/10/28 0028
     */
    public static Page doPage(List elementList, Integer pageNo){
        Page page = new Page();

        //設置一頁多少條記錄
        page.setPageSize(pageSize);
        //數據爲空 則返回Page默認設置
        if(elementList == null || elementList.size() == 0){
            return page;
        }
        //設置總的頁碼數
        Integer totalPages = getTotalPageNo(elementList);
        page.setTotalPages(totalPages);

        //設置總的記錄數
        page.setTotalElements(elementList.size());

        //設置當前的頁碼
        Integer realPageNo = getCurrentPageNo(pageNo,totalPages);
        page.setCurrentPageNo(pageNo);

        //設置上一頁的頁碼
        Integer prevPageNo = getPrevPageNo(pageNo);
        page.setPrevPageNo(prevPageNo);

        //設置下一頁的頁碼
        Integer nextPageNo = getNextPageNo(pageNo,totalPages);
        page.setNextPageNo(nextPageNo);

        //得到可點擊的list
        List<Integer> pageNoList = getPageNoList(pageNo, totalPages);
        page.setPageNoList(pageNoList);

        //得到指定頁的一頁數據
        List currentPageElementList = getCurrentPageElementList(elementList, pageNo);
        page.setList(currentPageElementList);

        return page;
    }




    /**
     * 獲得總頁碼數
     * @author lemon
     * @since 2019/10/28 0028
     */
    private static Integer getTotalPageNo(List elementList) {
        //計算總頁數
        int totalPages = elementList.size()/pageSize;

        if((elementList.size()/pageSize) != 0){
            totalPages = totalPages + 1;
        }

        return totalPages;
    }

    /**
     * 得到當前正確頁碼
     * @author lemon
     * @since 2019/10/28 0028
     */
    private static Integer getCurrentPageNo(Integer pageNo, Integer totalPages) {

        if(pageNo < 1){ // 頁碼小於1 則設爲第一頁
            pageNo = 1;
        }
        if(pageNo > totalPages){ // 頁碼大於最大頁 則設爲最後一頁
            pageNo = totalPages;
        }

        return pageNo;
    }

    /**
     * 得到當前頁面的上一頁
     * @author lemon
     * @since 2019/10/28 0028
     */
    private static Integer getPrevPageNo(Integer pagaNo){
        Integer pervPageNo = pagaNo - 1;

        if(pervPageNo < 0){
            pervPageNo = 0;
        }

        return pervPageNo;
    }

    /**
     * 得到當前頁面的上一頁
     * @author lemon
     * @since 2019/10/28 0028
     */
    private static Integer getNextPageNo(Integer pagaNo, Integer totalPage){
        Integer nextPageNo = pagaNo + 1;

        if(nextPageNo < 2){
            nextPageNo = 2;
        }

        if(nextPageNo > totalPage){ //超過總頁碼,設置爲0 , 表示沒有下一頁
            nextPageNo = 0;
        }
        return nextPageNo;
        }

    /**
     * 得到可點擊頁碼
     * @param pageNo 當前頁碼
     * @param totalPages 總的頁碼
     * @author lemon
     * @since 2019/10/28 0028
     */
    private static List<Integer> getPageNoList(Integer pageNo, Integer totalPages) {
        List<Integer> pageNoList = new ArrayList<>();

        //只有一頁的情況
        if(totalPages < 2){
            pageNoList.add(1);
            return pageNoList;
        }

        //總頁碼數小於最大顯示頁碼數
        if(totalPages < maxCountPageNo){
            for (int i = 1; i <= totalPages; i++) {
                pageNoList.add(i);
            }
            return pageNoList;
        }

        //當前頁數小於等於最大顯示頁數
        if(pageNo <= maxCountPageNo){
            for (int i = 1; i <= pageSize; i++) {
                pageNoList.add(i);
            }
            return pageNoList;
        }

        //當前頁數大於最大顯示頁數
        if(pageNo > maxCountPageNo){
            for (int i = 0; i < 3; i++) {
                pageNoList.add(pageNo - pageSize + i + 1);

                if (i == pageSize){
                    break;
                }
            }
            return pageNoList;
        }

        return pageNoList;
    }


    /**
     * 得到指定頁的一頁數據
     * @param elementList
     * @param pageNo
     * @return List
     * @author lemon
     * @since 2019/10/28 0028
     */
    private static List getCurrentPageElementList(List elementList, Integer pageNo) {
        ArrayList onePageElementList = new ArrayList();

        int startIndex = (pageNo - 1) * pageSize;
        for(int i = startIndex; i < elementList.size(); i++){//從指定頁的記錄數開始取,如果不滿一頁的數據,則全部取得
            Object ob = elementList.get(i);
            onePageElementList.add(ob);
            if(onePageElementList.size() >= pageSize) {//如果取慢一頁數據 則不再取
                break;
            }
        }
        return onePageElementList;
    }




}

 3.6、list.html

頁面顯示(這裏使用FreeMarker語句 if list等)

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Bootstrap 實例 - 基本的表格</title>
    <link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css">
    <script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>
    <script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>

<div class="container .col-xs-6">
    <table class="table table-hover">
        <thead>
        <tr class="info">
            <th class="col-md-2">ID</th>
            <th class="col-md-3">用戶名</th>
            <th class="col-md-4">密碼</th>
        </tr>
        </thead>
        <tbody>
        <#list page.list as user>
        <tr>
            <td>${user.id}</td>
            <td>${user.username}</td>
            <td>${user.password}</td>
        </tr>
        </#list>
        </tbody>
    </table>

    <viv >
        <div class="col-md-offset-9">
            <#if page.totalPages gt 1 >
            <div>
                <ul class="pagination">


                    <#if page.prevPageNo gt 0>
                    <li><a href="/list?pageNo=${page.prevPageNo}">&laquo;</a></li>
                    <#else>
                    <li class="disabled"><a href="#">&laquo;</a></li>
                     </#if>


                <#list page.pageNoList as pageNo>
                     <#if page.currentPageNo == pageNo>
                <li class="active"><a href="/list?pageNo=${pageNo}">${pageNo}</a></li>
                <#else>
                <li><a href="/list?pageNo=${pageNo}">${pageNo}</a></li>
            </#if>
            </#list>




            <#if page.nextPageNo gt 0>
                <li><a href="/list?pageNo=${page.nextPageNo}">&raquo;</a></li>
                <#else>
                 <li class="disabled"><a href="#">&raquo;</a></li>
                </#if>
                </ul>
            </div>
            </#if>

            <div>
                每頁${page.pageSize}條 共${page.totalElements}條 共${page.totalPages}頁
            </div>
        </div>
    </viv>
</div>
</body>
</html>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章