最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mybatis四種分頁方式小結(jié)

 更新時間:2025年07月25日 09:58:31   作者:譜寫  
本文詳細(xì)介紹MyBatis中四種分頁方式:數(shù)組分頁、SQL分頁、RowBounds分頁及攔截器分頁,具有一定的參考價值,感興趣的可以了解一下

數(shù)組分頁

查詢出全部數(shù)據(jù),然后再list中截取需要的部分。

mybatis接口

List<Student> queryStudentsByArray();

xml配置文件

<select id="queryStudentsByArray" resultMap="studentmapper"> select * from student </select>

service

接口 List<Student> queryStudentsByArray(int currPage, int pageSize); 實現(xiàn)接口 @Override public List<Student> queryStudentsByArray(int currPage, int pageSize) { //查詢?nèi)繑?shù)據(jù) List<Student> students = studentMapper.queryStudentsByArray(); //從第幾條數(shù)據(jù)開始 int firstIndex = (currPage - 1) * pageSize; //到第幾條數(shù)據(jù)結(jié)束 int lastIndex = currPage * pageSize; return students.subList(firstIndex, lastIndex); //直接在list中截取 }接口
List<Student> queryStudentsByArray(int currPage, int pageSize);
實現(xiàn)接口
 @Override
    public List<Student> queryStudentsByArray(int currPage, int pageSize) {
        //查詢?nèi)繑?shù)據(jù)
        List<Student> students = studentMapper.queryStudentsByArray();
        //從第幾條數(shù)據(jù)開始
        int firstIndex = (currPage - 1) * pageSize;
        //到第幾條數(shù)據(jù)結(jié)束
        int lastIndex = currPage * pageSize;
        return students.subList(firstIndex, lastIndex); //直接在list中截取
    }

controller

    @ResponseBody
    @RequestMapping("/student/array/{currPage}/{pageSize}")
    public List<Student> getStudentByArray(@PathVariable("currPage") int currPage, @PathVariable("pageSize") int pageSize) {
        List<Student> student = StuServiceIml.queryStudentsByArray(currPage, pageSize);
        return student;
    }

sql分頁

mybatis接口

List<Student> queryStudentsBySql(Map<String,Object> data);

xml文件

<select id="queryStudentsBySql" parameterType="map" resultMap="studentmapper">
        select * from student limit #{currIndex} , #{pageSize}
</select>

service

接口
List<Student> queryStudentsBySql(int currPage, int pageSize);
實現(xiàn)類
public List<Student> queryStudentsBySql(int currPage, int pageSize) {
        Map<String, Object> data = new HashedMap();
        data.put("currIndex", (currPage-1)*pageSize);
        data.put("pageSize", pageSize);
        return studentMapper.queryStudentsBySql(data);
    }

攔截器分頁

創(chuàng)建攔截器,攔截mybatis接口方法id以ByPage結(jié)束的語句

package com.autumn.interceptor;

import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.executor.parameter.ParameterHandler;
import org.apache.ibatis.executor.resultset.ResultSetHandler;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.*;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.SystemMetaObject;

import java.sql.Connection;
import java.util.Map;
import java.util.Properties;

/**
 * @Intercepts 說明是一個攔截器
 * @Signature 攔截器的簽名
 * type 攔截的類型 四大對象之一( Executor,ResultSetHandler,ParameterHandler,StatementHandler)
 * method 攔截的方法
 * args 參數(shù),高版本需要加個Integer.class參數(shù),不然會報錯
 */
@Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class})})
public class MyPageInterceptor implements Interceptor {

    //每頁顯示的條目數(shù)
    private int pageSize;
    //當(dāng)前現(xiàn)實的頁數(shù)
    private int currPage;
    //數(shù)據(jù)庫類型
    private String dbType;


    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        //獲取StatementHandler,默認(rèn)是RoutingStatementHandler
        StatementHandler statementHandler = (StatementHandler) invocation.getTarget();
        //獲取statementHandler包裝類
        MetaObject MetaObjectHandler = SystemMetaObject.forObject(statementHandler);

        //分離代理對象鏈
        while (MetaObjectHandler.hasGetter("h")) {
            Object obj = MetaObjectHandler.getValue("h");
            MetaObjectHandler = SystemMetaObject.forObject(obj);
        }

        while (MetaObjectHandler.hasGetter("target")) {
            Object obj = MetaObjectHandler.getValue("target");
            MetaObjectHandler = SystemMetaObject.forObject(obj);
        }

        //獲取連接對象
        //Connection connection = (Connection) invocation.getArgs()[0];


        //object.getValue("delegate");  獲取StatementHandler的實現(xiàn)類

        //獲取查詢接口映射的相關(guān)信息
        MappedStatement mappedStatement = (MappedStatement) MetaObjectHandler.getValue("delegate.mappedStatement");
        String mapId = mappedStatement.getId();

        //statementHandler.getBoundSql().getParameterObject();

        //攔截以.ByPage結(jié)尾的請求,分頁功能的統(tǒng)一實現(xiàn)
        if (mapId.matches(".+ByPage$")) {
            //獲取進行數(shù)據(jù)庫操作時管理參數(shù)的handler
            ParameterHandler parameterHandler = (ParameterHandler) MetaObjectHandler.getValue("delegate.parameterHandler");
            //獲取請求時的參數(shù)
            Map<String, Object> paraObject = (Map<String, Object>) parameterHandler.getParameterObject();
            //也可以這樣獲取
            //paraObject = (Map<String, Object>) statementHandler.getBoundSql().getParameterObject();

            //參數(shù)名稱和在service中設(shè)置到map中的名稱一致
            currPage = (int) paraObject.get("currPage");
            pageSize = (int) paraObject.get("pageSize");

            String sql = (String) MetaObjectHandler.getValue("delegate.boundSql.sql");
            //也可以通過statementHandler直接獲取
            //sql = statementHandler.getBoundSql().getSql();

            //構(gòu)建分頁功能的sql語句
            String limitSql;
            sql = sql.trim();
            limitSql = sql + " limit " + (currPage - 1) * pageSize + "," + pageSize;

            //將構(gòu)建完成的分頁sql語句賦值個體'delegate.boundSql.sql',偷天換日
            MetaObjectHandler.setValue("delegate.boundSql.sql", limitSql);
        }
        //調(diào)用原對象的方法,進入責(zé)任鏈的下一級
        return invocation.proceed();
    }


    //獲取代理對象
    @Override
    public Object plugin(Object o) {
        //生成object對象的動態(tài)代理對象
        return Plugin.wrap(o, this);
    }

    //設(shè)置代理對象的參數(shù)
    @Override
    public void setProperties(Properties properties) {
        //如果項目中分頁的pageSize是統(tǒng)一的,也可以在這里統(tǒng)一配置和獲取,這樣就不用每次請求都傳遞pageSize參數(shù)了。參數(shù)是在配置攔截器時配置的。
        String limit1 = properties.getProperty("limit", "10");
        this.pageSize = Integer.valueOf(limit1);
        this.dbType = properties.getProperty("dbType", "mysql");
    }
}

 配置文件SqlMapConfig.xml

<configuration>

    <plugins>
        <plugin interceptor="com.autumn.interceptor.MyPageInterceptor">
            <property name="limit" value="10"/>
            <property name="dbType" value="mysql"/>
        </plugin>
    </plugins>

</configuration>

mybatis配置

<!--接口-->
List<AccountExt> getAllBookByPage(@Param("currPage")Integer pageNo,@Param("pageSize")Integer pageSize);
<!--xml配置文件-->
  <sql id="getAllBooksql" >
    acc.id, acc.cateCode, cate_name, user_id,u.name as user_name, money, remark, time
  </sql>
  <select id="getAllBook" resultType="com.autumn.pojo.AccountExt" >
    select
    <include refid="getAllBooksql" />
    from account as acc
  </select>

service

    public List<AccountExt> getAllBookByPage(String pageNo,String pageSize) {
        return accountMapper.getAllBookByPage(Integer.parseInt(pageNo),Integer.parseInt(pageSize));
    }

controller

    @RequestMapping("/getAllBook")
    @ResponseBody
    public Page getAllBook(String pageNo,String pageSize,HttpServletRequest request,HttpServletResponse response){
        pageNo=pageNo==null?"1":pageNo;   //當(dāng)前頁碼
        pageSize=pageSize==null?"5":pageSize;   //頁面大小
        //獲取當(dāng)前頁數(shù)據(jù)
        List<AccountExt> list = bookService.getAllBookByPage(pageNo,pageSize);
        //獲取總數(shù)據(jù)大小
        int totals = bookService.getAllBook();
        //封裝返回結(jié)果
        Page page = new Page();
        page.setTotal(totals+"");
        page.setRows(list);
        return page;
    }

Page實體類

package com.autumn.pojo;

import java.util.List;

/**
 * Created by Autumn on 2018/6/21.
 */
public class Page {
    private String pageNo = null;
    private String pageSize = null;
    private String total = null;
    private List rows = null;

    public String getTotal() {
        return total;
    }

    public void setTotal(String total) {
        this.total = total;
    }

    public List getRows() {
        return rows;
    }

    public void setRows(List rows) {
        this.rows = rows;
    }

    public String getPageNo() {
        return pageNo;
    }

    public void setPageNo(String pageNo) {
        this.pageNo = pageNo;
    }

    public String getPageSize() {
        return pageSize;
    }

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

}

前端

bootstrap-table接受數(shù)據(jù)格式

{
  "total": 3,
  "rows": [
    {
      "id": 0,
      "name": "Item 0",
      "price": "$0"
    },
    {
      "id": 1,
      "name": "Item 1",
      "price": "$1"
    }
  ]
}

boostrap-table用法

var $table = $('#table');
        $table.bootstrapTable({
        url: "/${appName}/manager/bookController/getAllBook",
        method: 'post',
        contentType: "application/x-www-form-urlencoded",
        dataType: "json",
        pagination: true, //分頁
        sidePagination: "server", //服務(wù)端處理分頁
        pageList: [5, 10, 25],
        pageSize: 5,
        pageNumber:1,
        //toolbar:"#tb",
        singleSelect: false,
        queryParamsType : "limit",
        queryParams: function queryParams(params) {   //設(shè)置查詢參數(shù)
          var param = {
            pageNo: params.offset/params.limit+1,  //offset為數(shù)據(jù)開始索引,轉(zhuǎn)換為顯示當(dāng)前頁
            pageSize: params.limit  //頁面大小
          };
          console.info(params);   //查看參數(shù)是什么
          console.info(param);   //查看自定義的參數(shù)
          return param;
        },
        cache: false,
        //data-locale: "zh-CN", //表格漢化
        //search: true, //顯示搜索框
        columns: [
                {
                    checkbox: true
                },
                {
                    title: '消費類型',
                    field: 'cate_name',
                    valign: 'middle'
                },
                {
                    title: '消費金額',
                    field: 'money',
                    valign: 'middle',
                    formatter:function(value,row,index){
                        if(!isNaN(value)){   //是數(shù)字
                            return value/100;
                        }
                    }
                },
                {
                    title: '備注',
                    field: 'remark',
                    valign: 'middle'
                },
                {
                    title: '消費時間',
                    field: 'time',
                    valign: 'middle'
                },
                {
                    title: '操作',
                    field: '',
                    formatter:function(value,row,index){
                        var f = '<a href="#" rel="external nofollow"  class="btn btn-gmtx-define1" onclick="delBook(\''+ row.id +'\')">刪除</a> ';
                        return f;
                       }
                }
            ]
          });
      });

RowBounds分頁

數(shù)據(jù)量小時,RowBounds不失為一種好辦法。但是數(shù)據(jù)量大時,實現(xiàn)攔截器就很有必要了。

mybatis接口加入RowBounds參數(shù)

public List<UserBean> queryUsersByPage(String userName, RowBounds rowBounds);

service

    @Override
    @Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.SUPPORTS)
    public List<RoleBean> queryRolesByPage(String roleName, int start, int limit) {
        return roleDao.queryRolesByPage(roleName, new RowBounds(start, limit));
    }

到此這篇關(guān)于Mybatis四種分頁方式小結(jié)的文章就介紹到這了,更多相關(guān)Mybatis 分頁內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java?工作流引擎設(shè)計實現(xiàn)解析流程定義文件

    java?工作流引擎設(shè)計實現(xiàn)解析流程定義文件

    這篇文章主要為大家介紹了java?工作流引擎設(shè)計與實現(xiàn)及流程定義文件解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • SpringBoot項目中org.junit.jupiter.api.Test報錯問題及解決

    SpringBoot項目中org.junit.jupiter.api.Test報錯問題及解決

    這篇文章主要介紹了SpringBoot項目中org.junit.jupiter.api.Test報錯問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • 靈活控制任務(wù)執(zhí)行時間的Cron表達式范例

    靈活控制任務(wù)執(zhí)行時間的Cron表達式范例

    這篇文章主要為大家介紹了靈活控制任務(wù)執(zhí)行時間的Cron表達式范例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • Java實現(xiàn)按字典順序查找的booth算法的完整代碼

    Java實現(xiàn)按字典順序查找的booth算法的完整代碼

    在字符串算法領(lǐng)域,最小表示法是一種用于求取一個環(huán)形字符串中字典序最小的排列位置的經(jīng)典問題,本項目將基于Java完整實現(xiàn)Booth算法,幫助讀者深入理解算法原理,學(xué)會在工程中高效地對循環(huán)字符串進行字典序比較,并掌握相關(guān)代碼優(yōu)化和邊界處理技巧,需要的朋友可以參考下
    2025-07-07
  • Java并發(fā)系列之CyclicBarrier源碼分析

    Java并發(fā)系列之CyclicBarrier源碼分析

    這篇文章主要為大家詳細(xì)分析了Java并發(fā)系列之CyclicBarrier源碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • Spring中的@Cacheable緩存注解詳解

    Spring中的@Cacheable緩存注解詳解

    這篇文章主要介紹了Spring中的@Cacheable緩存注解詳解,數(shù)據(jù)庫查找的流程是先要從磁盤拿到數(shù)據(jù),再刷新到內(nèi)存,再返回數(shù)據(jù)。磁盤相比于內(nèi)存來說,速度是很慢的,為了提升性能,就出現(xiàn)了基于內(nèi)存的緩存,需要的朋友可以參考下
    2023-05-05
  • Java通過值查找對應(yīng)的枚舉的實現(xiàn)

    Java通過值查找對應(yīng)的枚舉的實現(xiàn)

    本文主要介紹了Java通過值查找對應(yīng)的枚舉的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-02-02
  • SpringCloud微服務(wù)的調(diào)用與遠(yuǎn)程調(diào)用測試示例

    SpringCloud微服務(wù)的調(diào)用與遠(yuǎn)程調(diào)用測試示例

    這篇文章主要介紹了SpringCloud微服務(wù)的調(diào)用與遠(yuǎn)程調(diào)用測試示例,服務(wù)調(diào)用者-可以暫時認(rèn)為是與用戶交互的角色(因為存在微服務(wù)之間的調(diào)用),可以根據(jù)該用戶的類型將其賦予不同的服務(wù)調(diào)用權(quán)限,通過一次http請求訪問調(diào)用對應(yīng)的微服務(wù)獲取想要的數(shù)據(jù)
    2023-04-04
  • Spring事務(wù)傳播機制最佳實踐

    Spring事務(wù)傳播機制最佳實踐

    Spring的事務(wù)傳播機制為我們提供了優(yōu)雅的解決方案,本文將帶您深入理解這一機制,掌握不同場景下的最佳實踐,感興趣的朋友一起看看吧
    2025-07-07
  • SpringBoot整合screw實現(xiàn)自動生成數(shù)據(jù)庫設(shè)計文檔

    SpringBoot整合screw實現(xiàn)自動生成數(shù)據(jù)庫設(shè)計文檔

    使用navicat工作的話,導(dǎo)出的格式是excel不符合格式,還得自己整理。所以本文將用screw工具包,整合到springboot的項目中便可以自動生成數(shù)據(jù)庫設(shè)計文檔,非常方便,下面就分享一下教程
    2022-11-11

最新評論

依安县| 镇康县| 邵阳市| 淮阳县| 桐乡市| 大田县| 抚顺市| 崇左市| 沁水县| 尚义县| 新河县| 明溪县| 昌乐县| 大邑县| 龙南县| 天气| 驻马店市| 冕宁县| 灵宝市| 山丹县| 安新县| 特克斯县| 连江县| 将乐县| 离岛区| 阿瓦提县| 茂名市| 广宁县| 磐石市| 黑河市| 福建省| 和顺县| 商南县| 新龙县| 丹寨县| 汉中市| 寿宁县| 玛多县| 临城县| 钟祥市| 甘谷县|