`
jayung
  • 浏览: 59860 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

mybatis逻辑分页,含分页导航

阅读更多

mybatis是非常优秀的半orm框架,比hibernate更容易控制,性能也很好,但mybatis官方并没提供分页功能,需要自己实现,下面提供一种物理分页的实现思路:

(基于sping、spring mvc、mybatis的整合,将PO)

1. 编写一个Pagination.java的实体类,含有页面显示数、总页数、当前页、开始行、结束行等属性

2. sql里加上分页参数

3. PO对象里加上这个分页对象

4. 在Service里,执行查询前,将分页实例的总记录数set进去,当前页由页面传入,这样就有了三个必备参数:总记录数、每页显示数(可以设一个默认值)、当前页,就可以获取sql查询时开始行、结束行,就实现分页了。

 

优点:

不改动mybatis框架代码,对service的实现类改动很小,只需加入一行代码,对controller改个只需model里add两个attribute,尽量做到低侵入低耦合。分页导航自动生成,可重新设置每页显示数,从不分页改为分页尽可能减少代码的增加工作。

缺点:

暂时只适用于持久化对象和表单视图对象共用,即持久化对象既用于数据库交互,也用于表单数据绑定。

 

下面为实例说明:

1. 在对象里加入一个属性:

	...
	/** 用于分页 */
	private Pagination pagination = new Pagination();

	public Pagination getPagination() {
		return pagination;
	}

	public void setPagination(Pagination pagination) {
		this.pagination = pagination;
	}

此处初始化了,是为了不用判断是否为null,相当于给一个初始值。 

 

2.  在mapper.xml文件中加入分页语句本例以mysql(limit #{offSet}, #{pageSize})为例

 

	<select id="getUserInfoList" parameterType="com.jayung.pagination.domain.UserInfo"
		 resultType="com.jayung.pagination.domain.UserInfo">
		select user_id userId, user_name userName, password password, 
		   age age 
		  from user_info 
		 <trim prefix="where" suffixOverrides="and">
		 	<if test="userId!=null and userId!=''">user_id = #{userId} and </if>
		 	<if test="userName!=null and userName!=''">user_name = #{userName} and </if>
		 	<if test="password!=null and password!=''">password = #{password} and </if>
		 	<if test="age!=null and age!=''">age = #{age} and </if>
		 </trim>
		 limit #{pagination.startRow}, #{pagination.pageSize}
	</select>

 其中limit #{pagination.startRow}, #{pagination.pageSize}是分页的两个参数;

 

 

3. 定义取总记录数的SQL

 

	<select id="getUserInfoListCount" parameterType="com.jayung.pagination.domain.UserInfo"
		 resultType="java.lang.Integer">
		select count(1)
		  from user_info 
		 <trim prefix="where" suffixOverrides="and">
		 	<if test="userId!=null and userId!=''">user_id = #{userId} and </if>
		 	<if test="userName!=null and userName!=''">user_name = #{userName} and </if>
		 	<if test="password!=null and password!=''">password = #{password} and </if>
		 	<if test="age!=null and age!=''">age = #{age} and </if>
		 </trim>
	</select>

 与上面SQL的差别是将查询结果集换成了count记录集的总数;

 

3. serviceimpl

	public List<UserInfo> getUserInfoList(UserInfo userInfo) {
		userInfo.getPagination().setTotalRow(userInfoMapper.getUserInfoListCount(userInfo));
		return userInfoMapper.getUserInfoList(userInfo);
	}

 

 4. controller

	@RequestMapping(value = "/demo/userInfo/search")
	public String search(Model model, UserInfo userInfo, HttpServletRequest request) {
		// userInfo里含有pagination属性。
		model.addAttribute("userInfoList", userInfoService.getUserInfoList(userInfo));
		// pagination是分页对象
		model.addAttribute("pagination", userInfo.getPagination());
		// paginationForm是为了不丢失从查询页面传过来的查询参数,并保存当前页、每页显示数的信息
		model.addAttribute("paginationForm", PaginationUtil.getPaginationForm(request));
		return  "/demo/userInfo/userInfoList";
	}

 

5. paginationUtil用于保存来自源页面的参数,防止翻到第二页时丢失。

	public static String getPaginationForm(HttpServletRequest request) {
		StringBuffer form = new StringBuffer();
		form.append("<form name=\"_paginationForm\" id=\"_paginationForm\" method=\"post\" aciton=\""
				+ new UrlPathHelper().getOriginatingRequestUri(request) + "\">\n");
		Enumeration paramNames = request.getParameterNames();
		while (paramNames.hasMoreElements()) {
			String paramName = (String) paramNames.nextElement();
			String paramValue = request.getParameter(paramName);
			if (!"pagination.pageSize".equals(paramName) && !"pagination.currentPage".equals(paramName)) {
				form.append("	<input type=\"hidden\" name=\"" + paramName + "\" value=\"" + paramValue + "\" />\n");
			}
		}
		String pageSize = (request.getParameter("pagination.pageSize") == null) ? Constant.PAGE_SIZE_DEFAULT.toString()
				: request.getParameter("pagination.pageSize");
		String currentPage = (request.getParameter("pagination.currentPage") == null) ? "1" : request
				.getParameter("pagination.currentPage");
		form.append("	<input type=\"hidden\" id=\"_pagination.pageSize\" name=\"pagination.pageSize\" value=\"" + pageSize + "\" />\n");
		form.append("	<input type=\"hidden\" id=\"_pagination.currentPage\" name=\"pagination.currentPage\" value=\"" + currentPage + "\" />\n");
		form.append("</form>");
		return form.toString();
	}

 

6. 分页页面

	<table class="tableList" id="userInfoList">
	<tr>
			<th>userId</th>
			<th>userName</th>
			<th>password</th>
			<th>age</th>
		<th>操作</th>
	<tr>
		<c:forEach items="${userInfoList}" var="userInfo" varStatus="status">
		<tr id="${status.index}">
			<td>${userInfo.userId}</td>
			<td>${userInfo.userName}</td>
			<td>${userInfo.password}</td>
			<td>${userInfo.age}</td>
			<td><a href="${userInfo.userId}">查看</a> 
			<a href="${userInfo.userId}/edit">编辑</a> 
			<a href="javascript:void();" onclick="deleteRow('${userInfo.userId}','${status.index}');">删除</a></td>
		</tr>
		</c:forEach>
	</table>
	<div>${pagination.navigator}</div>
${paginationForm}

 ${pagination.navigator}是分页导航

${paginationForm}是分页表单

 

最后上传完整工程附件,含初始化sql脚本

欢迎大家讨论优化。

 

分享到:
评论

相关推荐

    MyBatis自动分页实现

    * 简洁易用:无需手动编写分页逻辑,MyBatis 将自动实现分页功能。 * 高效灵活:可以根据需要选择不同的拦截器,例如 MybatisPageInterceptor 和 MybatisSpringPageInterceptor。 * 可扩展性强:可以根据需要添加新...

    Mybatis通用分页插件

    这个插件的目的是简化在数据库查询时的分页操作,使得开发者能够更专注于业务逻辑,而不是繁琐的SQL编写。 在传统的Mybatis中,如果要实现分页查询,通常需要手动编写带有LIMIT和OFFSET的SQL语句,这种方式既不直观...

    Jsp+Servlet+MyBatis完成分页查询

    同时,还可以生成分页导航链接,使用户能够方便地浏览其他页面。 通过以上步骤,我们便成功地使用JSP、Servlet和MyBatis实现了分页查询功能。这种组合提供了良好的分工,让前端负责展示,后端负责处理逻辑,而...

    mybatis物理分页插件

    物理分页是指在数据库层面进行分页,相比于逻辑分页(在应用层进行数据截取),物理分页通常更高效,因为它减少了传输到应用程序的数据量,降低了服务器负担。该插件兼容多种主流数据库,如MySQL、Oracle、SQL ...

    mybatis数据库分页Spring原生例子

    在Spring的业务逻辑层(Service)中,我们可以注入`UserMapper`,并调用`findAll`方法实现分页查询。为了处理分页参数,可以创建一个Page对象,包含当前页码和每页大小: ```java @Service public class ...

    MyBatis 分页源码简单

    我们可以根据这些信息来构建分页导航。 4. **自定义分页插件**: 如果 PageHelper 的默认行为不能满足需求,可以通过继承 `PageInterceptor` 并重写部分方法来自定义分页逻辑。例如,可以改变 SQL 语句的生成方式...

    spring+mybatis实现了物理分页

    总结起来,本项目实现了基于Spring和MyBatis的物理分页,利用PageHelper插件简化了分页逻辑,提高了代码的可读性和维护性。同时,Shiro的引入增强了系统的安全性。这样的设计适用于大多数需要分页展示数据的Web应用...

    springMVC+mybatis实现分页、登录、增删改查

    在Service层,我们可以利用MyBatis的分页插件,如PageHelper,自动实现SQL的分页查询。返回结果后,Controller将分页信息和数据传递给视图,如Bootstrap模板,展示分页效果。 权限设置则是为了确保不同用户只能访问...

    mybatis分页插件代码

    - **自动分页**:通过BaseMapper接口,自动处理分页逻辑。 - **条件构造**:通过QueryWrapper或LambdaQueryWrapper,可以方便地构造复杂查询条件。 - **数据操作**:提供insert、update、delete等方法,简化了对...

    springmvc+mybatis+分页查询

    在本项目中,我们主要探讨的是如何利用Spring MVC和MyBatis两大流行框架构建一个具有分页查询功能的Web应用。Spring MVC作为控制层,负责处理HTTP请求和响应,而MyBatis则作为数据访问层,用于处理数据库交互。下面...

    mybatis的分页插件

    而 PageHelper 插件则提供了一种优雅的解决方案,它可以自动处理分页逻辑,使得开发过程更加高效。 PageHelper 插件的主要功能包括: 1. **智能分页**:PageHelper 可以自动识别 SQL 语句类型,无论是 SELECT 还是...

    MyBatis 分页

    在MyBatis中,分页主要分为两种类型:逻辑分页和物理分页。 1. **逻辑分页**: 逻辑分页通常通过在SQL查询语句中添加`LIMIT`和`OFFSET`(MySQL)或`ROW_NUMBER() OVER()`(SQL Server)等关键字来实现。这种方式...

    mybatis 物理分页,借助于mybatis-paginator插件

    首先,物理分页与逻辑分页的区别在于,物理分页直接在数据库层面进行,通过SQL语句的LIMIT和OFFSET或者ROWNUM等关键字来限制返回的数据量,避免了将大量数据一次性加载到内存中,从而提高了效率。而逻辑分页通常是在...

    pring_mybatis物理分页

    2. **拦截器实现**:在不修改原有业务逻辑和Mapper接口的情况下,我们可以通过MyBatis的拦截器机制来注入分页逻辑。拦截器会在SQL执行前添加分页条件,如`LIMIT`(MySQL)或`ROWNUM`(Oracle)等。 3. **Page对象**...

    mybatis mysql分页实例(不能用找我)

    6. **前端展示**:在前端页面中,你可以设置分页导航,通过Ajax异步请求,每次切换页码时,向后台发送当前页码和每页大小,服务端根据这些信息返回相应的分页数据。 7. **注意事项**:虽然物理分页简单直接,但当...

    MyBatis高级应用:实现自定义分页插件

    为了提高代码的可维护性和可移植性,我们可以通过编写自定义分页插件来实现更灵活的分页逻辑。本文将详细介绍如何在 MyBatis 中实现自定义分页插件。 自定义分页插件提供了一种灵活且高效的方式来实现 MyBatis 的...

    ssm整合的jar和mybatis分页代码,mybatis生成工具类

    分页拦截器通常会自动处理查询结果的分页逻辑,无需在每个Mapper接口或SQL映射文件中显式编写分页代码。它通过计算总记录数和当前页的记录来实现分页效果,使得在大型数据集的应用场景下能有效提高性能。 接下来,`...

    Mybatis分页拦截器

    Mybatis分页拦截器是Mybatis框架中一种实用的扩展机制,用于实现高效的数据库查询分页功能。在Mybatis中,拦截器扮演着插件的角色,可以监听并修改Mybatis执行过程中的某些行为。本话题将深入探讨Mybatis分页拦截器...

Global site tag (gtag.js) - Google Analytics