mybatis实战教程之七实现mybatis分页

上传人:沈*** 文档编号:74524985 上传时间:2022-04-14 格式:DOC 页数:10 大小:141KB
收藏 版权申诉 举报 下载
mybatis实战教程之七实现mybatis分页_第1页
第1页 / 共10页
mybatis实战教程之七实现mybatis分页_第2页
第2页 / 共10页
mybatis实战教程之七实现mybatis分页_第3页
第3页 / 共10页
资源描述:

《mybatis实战教程之七实现mybatis分页》由会员分享,可在线阅读,更多相关《mybatis实战教程之七实现mybatis分页(10页珍藏版)》请在装配图网上搜索。

1、mybatis实战教程(mybatis in action)之七:实现mybatis分页(源码下载)上一篇文章里已经讲到了mybatis与spring MVC的集成,并且做了一个列表展示,显示出所有article 列表,但没有用到分页,在实际的项目中,分页是肯定需要的。而且是物理分页,不是内存分页。对于物理分页方案,不同的数据库,有不同的实现方法,对于mysql 来说 就是利用 limit offset,pagesize 方式来实现的。oracle 是通过rownum 来实现的,如果你熟悉相关数据库的操作,是一样的很好扩展,本文以mysql 为例子来讲述.先看一下效果图(源代码在文章最后提供下

2、载):实现mybatis 物理分页,一个最简单的方式是,是在你的mapper的SQL语句中直接写类似如下方式 :程序代码 select user.id,user.userName,user.userAddress,article.id aid,article.title,article.content from user,article where user.id=article.userid and user.id=#id limit #offset,#pagesize 请注意这里的 parameterType 是你传入的参数类,或者map ,里面包含了offset,pagesize ,和其

3、他你需要的参数,用这种方式,肯定可以实现分页。这是简单的一种方式。但更通用的一种方式是用 mybatis 插件的方式. 参考了网上的很多资料 ,mybatis plugin 方面的资料。写自己的插件.程序代码package com.yihaomen.util;import java.lang.reflect.Field;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.util.List;i

4、mport java.util.Map;import java.util.Properties;import javax.xml.bind.PropertyException;import org.apache.ibatis.builder.xml.dynamic.ForEachSqlNode;import org.apache.ibatis.executor.ErrorContext;import org.apache.ibatis.executor.Executor;import org.apache.ibatis.executor.ExecutorException;import org

5、.apache.ibatis.executor.statement.BaseStatementHandler;import org.apache.ibatis.executor.statement.RoutingStatementHandler;import org.apache.ibatis.executor.statement.StatementHandler;import org.apache.ibatis.mapping.BoundSql;import org.apache.ibatis.mapping.MappedStatement;import org.apache.ibatis.

6、mapping.ParameterMapping;import org.apache.ibatis.mapping.ParameterMode;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

7、.ibatis.reflection.MetaObject;import org.apache.ibatis.reflection.property.PropertyTokenizer;import org.apache.ibatis.session.Configuration;import org.apache.ibatis.session.ResultHandler;import org.apache.ibatis.session.RowBounds;import org.apache.ibatis.type.TypeHandler;import org.apache.ibatis.typ

8、e.TypeHandlerRegistry;Intercepts( Signature(type = StatementHandler.class, method = prepare, args = Connection.class ) )public class PagePlugin implements Interceptor private static String dialect = ; private static String pageSqlId = ; SuppressWarnings(unchecked) public Object intercept(Invocation

9、ivk) throws Throwable if (ivk.getTarget() instanceof RoutingStatementHandler) RoutingStatementHandler statementHandler = (RoutingStatementHandler) ivk .getTarget(); BaseStatementHandler delegate = (BaseStatementHandler) ReflectHelper .getValueByFieldName(statementHandler, delegate); MappedStatement

10、mappedStatement = (MappedStatement) ReflectHelper .getValueByFieldName(delegate, mappedStatement); if (mappedStatement.getId().matches(pageSqlId) BoundSql boundSql = delegate.getBoundSql(); Object parameterObject = boundSql.getParameterObject(); if (parameterObject = null) throw new NullPointerExcep

11、tion(parameterObject error); else Connection connection = (Connection) ivk.getArgs()0; String sql = boundSql.getSql(); String countSql = select count(0) from ( + sql + ) myCount; System.out.println(总数sql 语句:+countSql); PreparedStatement countStmt = connection .prepareStatement(countSql); BoundSql co

12、untBS = new BoundSql( mappedStatement.getConfiguration(), countSql, boundSql.getParameterMappings(), parameterObject); setParameters(countStmt, mappedStatement, countBS, parameterObject); ResultSet rs = countStmt.executeQuery(); int count = 0; if (rs.next() count = rs.getInt(1); rs.close(); countStm

13、t.close(); PageInfo page = null; if (parameterObject instanceof PageInfo) page = (PageInfo) parameterObject; page.setTotalResult(count); else if(parameterObject instanceof Map) Map map = (Map)parameterObject; page = (PageInfo)map.get(page); if(page = null) page = new PageInfo(); page.setTotalResult(

14、count); else Field pageField = ReflectHelper.getFieldByFieldName( parameterObject, page); if (pageField != null) page = (PageInfo) ReflectHelper.getValueByFieldName( parameterObject, page); if (page = null) page = new PageInfo(); page.setTotalResult(count); ReflectHelper.setValueByFieldName(paramete

15、rObject, page, page); else throw new NoSuchFieldException(parameterObject .getClass().getName(); String pageSql = generatePageSql(sql, page); System.out.println(page sql:+pageSql); ReflectHelper.setValueByFieldName(boundSql, sql, pageSql); return ivk.proceed(); private void setParameters(PreparedSta

16、tement ps, MappedStatement mappedStatement, BoundSql boundSql, Object parameterObject) throws SQLException ErrorContext.instance().activity(setting parameters) .object(mappedStatement.getParameterMap().getId(); List parameterMappings = boundSql .getParameterMappings(); if (parameterMappings != null)

17、 Configuration configuration = mappedStatement.getConfiguration(); TypeHandlerRegistry typeHandlerRegistry = configuration .getTypeHandlerRegistry(); MetaObject metaObject = parameterObject = null ? null : configuration.newMetaObject(parameterObject); for (int i = 0; i parameterMappings.size(); i+)

18、ParameterMapping parameterMapping = parameterMappings.get(i); if (parameterMapping.getMode() != ParameterMode.OUT) Object value; String propertyName = parameterMapping.getProperty(); PropertyTokenizer prop = new PropertyTokenizer(propertyName); if (parameterObject = null) value = null; else if (type

19、HandlerRegistry .hasTypeHandler(parameterObject.getClass() value = parameterObject; else if (boundSql.hasAdditionalParameter(propertyName) value = boundSql.getAdditionalParameter(propertyName); else if (propertyName .startsWith(ForEachSqlNode.ITEM_PREFIX) & boundSql.hasAdditionalParameter(prop.getNa

20、me() value = boundSql.getAdditionalParameter(prop.getName(); if (value != null) value = configuration.newMetaObject(value) .getValue( propertyName.substring(prop .getName().length(); else value = metaObject = null ? null : metaObject .getValue(propertyName); TypeHandler typeHandler = parameterMappin

21、g.getTypeHandler(); if (typeHandler = null) throw new ExecutorException( There was no TypeHandler found for parameter + propertyName + of statement + mappedStatement.getId(); typeHandler.setParameter(ps, i + 1, value, parameterMapping.getJdbcType(); private String generatePageSql(String sql, PageInf

22、o page) if (page != null & (dialect !=null | !dialect.equals() StringBuffer pageSql = new StringBuffer(); if (mysql.equals(dialect) pageSql.append(sql); pageSql.append( limit + page.getCurrentResult() + , + page.getShowCount(); else if (oracle.equals(dialect) pageSql.append(select * from (select tmp

23、_tb.*,ROWNUM row_id from (); pageSql.append(sql); pageSql.append() tmp_tb where ROWNUM); pageSql.append(page.getCurrentResult(); return pageSql.toString(); else return sql; public Object plugin(Object arg0) / TODO Auto-generated method stub return Plugin.wrap(arg0, this); public void setProperties(P

24、roperties p) dialect = p.getProperty(dialect); if (dialect =null | dialect.equals() try throw new PropertyException(dialect property is not found!); catch (PropertyException e) / TODO Auto-generated catch block e.printStackTrace(); pageSqlId = p.getProperty(pageSqlId); if (dialect =null | dialect.eq

25、uals() try throw new PropertyException(pageSqlId property is not found!); catch (PropertyException e) / TODO Auto-generated catch block e.printStackTrace(); 此插件有两个辅助类:PageInfo,ReflectHelper,你可以下载源代码参考。写了插件之后,当然需要在 mybatis 的配置文件Configuration.xml 里配置这个插件程序代码 请注意,这个插件定义了一个规则,也就是在mapper中sql语句的id 必须包含Lis

26、tPage才能被拦截。否则将不会分页处理.插件写好了,现在就可以在 spring mvc 中的controller 层中写一个方法来测试这个分页:程序代码RequestMapping(/pagelist) public ModelAndView pageList(HttpServletRequest request,HttpServletResponse response) int currentPage = request.getParameter(page)=null?1:Integer.parseInt(request.getParameter(page); int pageSize =

27、 3; if (currentPage=0) currentPage =1; int currentResult = (currentPage-1) * pageSize; System.out.println(request.getRequestURI(); System.out.println(request.getQueryString(); PageInfo page = new PageInfo(); page.setShowCount(pageSize); page.setCurrentResult(currentResult); List articles=iUserOperat

28、ion.selectArticleListPage(page,1); System.out.println(page); int totalCount = page.getTotalResult(); int lastPage=0; if (totalCount % pageSize=0) lastPage = totalCount % pageSize; else lastPage =1+ totalCount / pageSize; if (currentPage=lastPage) currentPage =lastPage; String pageStr = ; pageStr=String.format(上一页 下一页, request.getRequestURI()+?page=+(currentPage-1),request.getRequestURI()+?page=+(currentPage+1) ); /制定视图,也就是list.jsp ModelAndView mav=new ModelAndView(list); mav.addObject(articles,articles); mav.addObject(pageStr,pageStr); return mav; 然后运行程序,进入分页页面,你就可以看到结果了:

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!