一、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;
}