分頁(yè)展示

一、Sql分頁(yè)

具體實(shí)現(xiàn):

1.接口下定義分頁(yè)的方法

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

2.通過(guò)對(duì)應(yīng)的xml文件獲取所需節(jié)點(diǎn)的所有信息

<select?id="queryStudentsBySql"?parameterType="map"?resultMap="studentmapper">

????????select?*?from?student?limit?#{currIndex}?,?#{pageSize}

</select>

3.編寫(xiě)service層

接口

List?<?Student?>?queryStudentsBySql(int?currPage,?int?pageSize);

實(shí)現(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);

}

二、數(shù)組分頁(yè)

具體實(shí)現(xiàn):

1.接口定義所需方法

List?<?Student?>?queryStudentsByArray();

2.xml中獲取需要節(jié)點(diǎn)

?<select?id="queryStudentsByArray"??resultMap="studentmapper">

????????select?*?from?student

?</select>

3.service層的定義

接口

List?<?Student?>?queryStudentsByArray(int?currPage,?int?pageSize);

實(shí)現(xiàn)接口

@Override

public?List?<?Student?>?queryStudentsByArray(int?currPage,?int?pageSize)

{

????//查詢?nèi)繑?shù)據(jù)

????List?<?Student?>?students?=?studentMapper.queryStudentsByArray();

????//從第幾條數(shù)據(jù)開(kāi)始

????int?firstIndex?=?(currPage?-?1)?*?pageSize;

????//到第幾條數(shù)據(jù)結(jié)束

????int?lastIndex?=?currPage?*?pageSize;

????return?students.subList(firstIndex,?lastIndex);?//直接在list中截取

}

4.編寫(xiě)控制層實(shí)現(xiàn)實(shí)現(xiàn)方法

??@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;

??}

三、攔截器分頁(yè)

具體實(shí)現(xiàn):

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

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?說(shuō)明是一個(gè)攔截器

?*?@Signature?攔截器的簽名

?*?type?攔截的類型?四大對(duì)象之一(?Executor,ResultSetHandler,ParameterHandler,StatementHandler)

?*?method?攔截的方法

?*?args?參數(shù),高版本需要加個(gè)Integer.class參數(shù),不然會(huì)報(bào)錯(cuò)

?*/

@Intercepts(

{

????@Signature(type?=?StatementHandler.class,?method?=?"prepare",?args?=?{

????????Connection.class

????})

})

public?class?MyPageInterceptor?implements?Interceptor

{

????//每頁(yè)顯示的條目數(shù)

????private?int?pageSize;

????//當(dāng)前現(xiàn)實(shí)的頁(yè)數(shù)

????private?int?currPage;

????//數(shù)據(jù)庫(kù)類型

????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);

????????//分離代理對(duì)象鏈

????????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);

????????}

????????//獲取連接對(duì)象

????????//Connection?connection?=?(Connection)?invocation.getArgs()[0];

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

????????//獲取查詢接口映射的相關(guān)信息

????????MappedStatement?mappedStatement?=?(MappedStatement)?MetaObjectHandler.getValue("delegate.mappedStatement");

????????String?mapId?=?mappedStatement.getId();

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

????????//攔截以.ByPage結(jié)尾的請(qǐng)求,分頁(yè)功能的統(tǒng)一實(shí)現(xiàn)

????????if?(mapId.matches(".+ByPage$"))

????????{

????????????//獲取進(jìn)行數(shù)據(jù)庫(kù)操作時(shí)管理參數(shù)的handler

????????????ParameterHandler?parameterHandler?=?(ParameterHandler)?MetaObjectHandler.getValue("delegate.parameterHandler");

????????????//獲取請(qǐng)求時(shí)的參數(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");

????????????//也可以通過(guò)statementHandler直接獲取

????????????//sql?=?statementHandler.getBoundSql().getSql();

????????????//構(gòu)建分頁(yè)功能的sql語(yǔ)句

????????????String?limitSql;

????????????sql?=?sql.trim();

????????????limitSql?=?sql?+?"?limit?"?+?(currPage?-?1)?*?pageSize?+?","?+?pageSize;

????????????//將構(gòu)建完成的分頁(yè)sql語(yǔ)句賦值個(gè)體'delegate.boundSql.sql',偷天換日

????????????MetaObjectHandler.setValue("delegate.boundSql.sql",?limitSql);

????????}

????????//調(diào)用原對(duì)象的方法,進(jìn)入責(zé)任鏈的下一級(jí)

????????return?invocation.proceed();

????}

????//獲取代理對(duì)象

????@Override

????public?Object?plugin(Object?o)

????{

????????//生成object對(duì)象的動(dòng)態(tài)代理對(duì)象

????????return?Plugin.wrap(o,?this);

????}

????//設(shè)置代理對(duì)象的參數(shù)

????@Override

????public?void?setProperties(Properties?properties)

????{

????????//如果項(xiàng)目中分頁(yè)的pageSize是統(tǒng)一的,也可以在這里統(tǒng)一配置和獲取,這樣就不用每次請(qǐng)求都傳遞pageSize參數(shù)了。參數(shù)是在配置攔截器時(shí)配置的。

????????String?limit1?=?properties.getProperty("limit",?"10");

????????this.pageSize?=?Integer.valueOf(limit1);

????????this.dbType?=?properties.getProperty("dbType",?"mysql");

????}

}

2.配置文件SqlMapConfig.xml

<configuration>

????<plugins>

????????<plugin?interceptor="com.autumn.interceptor.MyPageInterceptor">

????????????<property?name="limit"?value="10"/>

????????????<property?name="dbType"?value="mysql"/>

????????</plugin>

????</plugins>

</configuration>

3.配置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>

4.service定義

??public?List?<?AccountExt?>?getAllBookByPage(String?pageNo,?String?pageSize)

????{

????????return?accountMapper.getAllBookByPage(Integer.parseInt(pageNo),?Integer.parseInt(pageSize));

????}

5.編寫(xiě)controller

@RequestMapping("/getAllBook")

@ResponseBody

public?Page?getAllBook(String?pageNo,?String?pageSize,?HttpServletRequest?request,?HttpServletResponse?response)

{

????pageNo?=?pageNo?==?null???"1"?:?pageNo;?//當(dāng)前頁(yè)碼

????pageSize?=?pageSize?==?null???"5"?:?pageSize;?//頁(yè)面大小

????//獲取當(dāng)前頁(yè)數(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;

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容