栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

自己动手写的mybatis分页插件(极其简单好用)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

自己动手写的mybatis分页插件(极其简单好用)

刚开始项目,需要用到mybatis分页,网上看了很多插件,其实实现原理基本都大同小异,但是大部分都只给了代码,注释不全,所以参考了很多篇文章(每篇文章偷一点代码,评出来自己的,半抄袭),才自己模仿着写出了一个适合自己项目的分页插件,话不多说,直接上代码,相比大部分文章,注释算很完整了

最重要的拦截器

package com.dnkx.interceptor; 
import java.sql.*; 
import java.util.HashMap; 
import java.util.Properties; 
import org.apache.ibatis.executor.resultset.ResultSetHandler; 
import org.apache.ibatis.executor.statement.StatementHandler; 
import org.apache.ibatis.mapping.BoundSql; 
import org.apache.ibatis.mapping.MappedStatement; 
import org.apache.ibatis.plugin.Interceptor; 
import org.apache.ibatis.plugin.Intercepts; 
import org.apache.ibatis.plugin.Invocation; 
import org.apache.ibatis.plugin.Plugin; 
import org.apache.ibatis.plugin.Signature; 
import org.apache.ibatis.reflection.metaObject; 
import org.apache.ibatis.reflection.SystemmetaObject; 
import com.dnkx.pojo.Page; 
 
@Intercepts({ 
@Signature(type=StatementHandler.class,method="prepare",args={Connection.class}), 
@Signature(type = ResultSetHandler.class, method = "handleResultSets", args = {Statement.class}) 
}) 
public class PageInterceptor implements Interceptor{ 
//拦截分页关键字 
private static final String SELECt_ID="page"; 
//插件运行的代码,它将代替原有的方法,要重写最重要的intercept了 
@Override 
public Object intercept(Invocation invocation) throws Throwable { 
if (invocation.getTarget() instanceof StatementHandler) { 
//这里我们有一个设定 如果查询方法含有Page 就进行分页 其他方法无视 
//所以就要获取方法名 
StatementHandler statementHandler=(StatementHandler)invocation.getTarget(); 
metaObject metaObject=SystemmetaObject.forObject(statementHandler); 
MappedStatement mappedStatement=(MappedStatement)metaObject.getValue("delegate.mappedStatement"); 
String selectId=mappedStatement.getId(); 
String methorName=selectId.substring(selectId.lastIndexOf(".")+1).toLowerCase(); 
//然后判断下 如果含有Page 就获取sql 
if(methorName.contains(SELECT_ID)){ 
BoundSql boundSql=(BoundSql)metaObject.getValue("delegate.boundSql"); 
//分页参数作为参数对象parameterObject的一个属性 
String sql=boundSql.getSql(); 
System.out.println("获取到的sql:"+sql); 
HashMap map=(HashMap)(boundSql.getParameterObject()); 
//Page page=(Page)(boundSql.getParameterObject()); 
Page page=(Page)map.get("page"); 
// 重写sql 
String countSql=concatCountSql(sql); 
String pageSql=concatPageSql(sql,page); 
// System.out.println("重写的 count sql :"+countSql); 
System.out.println("重写的 select sql :"+pageSql); 
Connection connection = (Connection) invocation.getArgs()[0]; 
PreparedStatement countStmt = null; 
ResultSet rs = null; 
int totalCount = 0; 
try { 
countStmt = connection.prepareStatement(countSql); 
rs = countStmt.executeQuery(); 
if (rs.next()) { 
totalCount = rs.getInt(1); 
} 
} catch (SQLException e) { 
System.out.println("Ignore this exception"+e); 
} finally { 
try { 
rs.close(); 
countStmt.close(); 
} catch (SQLException e) { 
System.out.println("Ignore this exception"+ e); 
} 
} 
metaObject.setValue("delegate.boundSql.sql", pageSql); 
//绑定count 
page.setNumCount(totalCount); 
} 
} 
return invocation.proceed(); 
} 
// 拦截类型StatementHandler,重写plugin方法 
@Override 
public Object plugin(Object target) { 
if (target instanceof StatementHandler) { 
return Plugin.wrap(target, this); 
}else { 
return target; 
} 
} 
@Override 
public void setProperties(Properties properties) { 
} 
//改造sql 
public String concatCountSql(String sql){ 
//StringBuffer sb=new StringBuffer("select count(*) from "); 
 
StringBuffer sb=new StringBuffer(); 
sql=sql.toLowerCase(); 
if(sql.lastIndexOf("order")>0){ 
sql=sql.substring(0,sql.indexOf("order")); 
} 
sb.append("select count(*) from ("+sql+") tmp"); 
return sb.toString(); 
} 
public String concatPageSql(String sql,Page page){ 
StringBuffer sb=new StringBuffer(); 
sb.append(sql); 
sb.append(" limit ").append(page.getPageBegin()).append(" , ").append(page.getPageSize()); 
return sb.toString(); 
} 
} 
分页对象Page类
[java] view plain copy
package com.dnkx.pojo; 
import java.util.HashMap; 
import java.util.Map; 
 
public class Page { 
//----------分页----------- 
private int pageSize;//每页显示条数 
private int pageCurrentPage;//第几页 
private int pageBegin;//开始位置 
private int numCount;//总条数 
private int pageTotal;//总条数 
private String orderField = "";//控制排序页面显示的 
private String orderDirection = ""; 
public Page(){ 
} 
public Page(int pageSize, int pageCurrentPage) { 
super(); 
this.pageSize = pageSize; 
this.pageCurrentPage = pageCurrentPage; 
} 
public Page(Map map){ 
if(map.get("pageNum")!=null){ 
this.setPageCurrentPage(this.pageCurrentPage = Integer.parseInt(map.get("pageNum")));//要查询的页数 
}else{ 
this.setPageCurrentPage(1);//设置初始值 
} 
if(map.get("numPerPage")!=null){ 
this.setPageSize(Integer.parseInt(map.get("numPerPage")));//每页显示条数 
}else{ 
this.setPageSize(5);//设置初始值 
} 
if(map.get("orderField")!=null){ 
this.setOrderField(map.get("orderField")); 
} 
if(map.get("orderDirection")!=null){ 
this.setOrderDirection(map.get("orderDirection")); 
} 
} 
public int getPageCurrentPage() { 
return pageCurrentPage; 
} 
public void setPageCurrentPage(int pageCurrentPage) { 
this.pageCurrentPage = pageCurrentPage; 
} 
public int getNumCount() { 
return numCount; 
} 
public void setNumCount(int numCount) { 
this.numCount = numCount; 
} 
public int getPageTotal() { 
return (numCount%pageSize>0)?(numCount/pageSize+1):(numCount/pageSize); 
} 
public void setPageTotal(int pageTotal) { 
this.pageTotal = pageTotal; 
} 
public int getPageSize() { 
return pageSize; 
} 
public void setPageSize(int pageSize) { 
this.pageSize = pageSize; 
} 
public int getPageBegin() { 
return pageSize*(pageCurrentPage-1); 
} 
public void setPageBegin(int pageBegin) { 
this.pageBegin = pageBegin; 
} 
public String getOrderField() { 
return orderField; 
} 
public void setOrderField(String orderField) { 
this.orderField = orderField; 
} 
public String getOrderDirection() { 
return orderDirection; 
} 
public void setOrderDirection(String orderDirection) { 
this.orderDirection = orderDirection; 
} 
public static Page getPage(int pageSize, int pageCurrentPage){ 
return new Page(pageSize,pageCurrentPage); 
} 
public static Page getPage(Map map){ 
return new Page(map); 
} 
}

Controller里面调用方式

public String list(HttpServletRequest request) { 
long a=System.currentTimeMillis(); 
HashMap map=GetRequestMap.getMap(request);//自己封装的方法,取request的参数 
Page page= Page.getPage(map);//初始化page 
map.put("page", page);//把page对象放入参数集合(这个map是mybatis要用到的,包含查询条件,排序,分页等) 
//控制排序页面显示的 
map.put(map.get("orderField")+"", map.get("orderDirection")); 
List list=employeeService.getListPage(map); 
request.setAttribute("emlist", list); 
request.setAttribute("page", page); 
request.setAttribute("map", map); 
//取page相关属性 
page.getNumCount();//总条数 
page.getPageTotal();//总页数 
long b=System.currentTimeMillis(); 
System.out.println("---------耗时:"+(b-a)+"ms"); 
return "basic/employee_list"; 
}

最后,spring里面配置插件

 
 
 
 
 
 
 
 
 

好了,到此结束,本文仅供参考!也期待大神提意见

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/148639.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号