Spring+Mybatis+SpringMVC后台与前台分页展示实例(附工程)(转)
Posted 沧海一滴
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring+Mybatis+SpringMVC后台与前台分页展示实例(附工程)(转)相关的知识,希望对你有一定的参考价值。
林炳文Evankaka原创作品。转载请注明出处http://blog.csdn.net/evankaka
摘要:本文实现了一个后台由Spring+Mybatis+SpringMVC组成,分页采用PageHelper,前台展示使用bootstrap-paginator来显示效果的分页实例。整个项目由maven构成。这里主要讲了分页的实例,框架怎么搭建就不再说明,主要是在这里的基础上来增加分页功能的。注意,此文是在这个基础 Spring+Mybatis+SpringMVC+Maven+MySql搭建实例 之上来做分页的,建议文中看不懂的配置可以看看这里。
最后的结果如下:
环境:jdk1.6
Tomcat 7.0
Eclipse luna/windows 7
一、后台PageHelper使用
PageHelper:https://github.com/pagehelper/Mybatis-PageHelper
1、引入jar包
- <!-- 添加分布插件的包pagehelper -->
- <dependency>
- <groupId>com.github.pagehelper</groupId>
- <artifactId>pagehelper</artifactId>
- <version>4.0.0</version>
- </dependency>
2.mybatis-config.xml中添加插件
- <plugins>
- <!-- com.github.pagehelper为PageHelper类所在包名 -->
- <plugin interceptor="com.github.pagehelper.PageHelper">
- <property name="dialect" value="mysql"/>
- <!-- 该参数默认为false -->
- <!-- 设置为true时,会将RowBounds第一个参数offset当成pageNum页码使用 -->
- <!-- 和startPage中的pageNum效果一样-->
- <property name="offsetAsPageNum" value="true"/>
- <!-- 该参数默认为false -->
- <!-- 设置为true时,使用RowBounds分页会进行count查询 -->
- <property name="rowBoundsWithCount" value="true"/>
- <!-- 设置为true时,如果pageSize=0或者RowBounds.limit = 0就会查询出全部的结果 -->
- <!-- (相当于没有执行分页查询,但是返回结果仍然是Page类型)-->
- <property name="pageSizeZero" value="true"/>
- <!-- 3.3.0版本可用 - 分页参数合理化,默认false禁用 -->
- <!-- 启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页 -->
- <!-- 禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据 -->
- <property name="reasonable" value="false"/>
- <!-- 3.5.0版本可用 - 为了支持startPage(Object params)方法 -->
- <!-- 增加了一个`params`参数来配置参数映射,用于从Map或ServletRequest中取值 -->
- <!-- 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值 -->
- <!-- 不理解该含义的前提下,不要随便复制该配置 -->
- <property name="params" value="pageNum=start;pageSize=limit;"/>
- </plugin>
- </plugins>
这样子就引入进来了,接下来就是来开始分页功能的实现
3、mapper文件中添加如下一个方法:
- <select id="selectUserByUserName" parameterType="java.lang.String" resultMap="BaseResultMap">
- SELECT *
- FROM t_user
- WHERE 1 = 1
- <if test="userName != null and userName !=‘‘">
- AND USER_NAME = #{userName,jdbcType=VARCHAR}
- </if>
- ORDER BY USER_ID
- </select>
注意,这里的返回其实是一个list
- <!--设置domain类和数据库中表的字段一一对应,注意数据库字段和domain类中的字段名称不致,此处一定要! -->
- <resultMap id="BaseResultMap" type="com.lin.domain.User">
- <id column="USER_ID" property="userId" jdbcType="INTEGER" />
- <result column="USER_NAME" property="userName" jdbcType="CHAR" />
- <result column="USER_PASSWORD" property="userPassword" jdbcType="CHAR" />
- <result column="USER_EMAIL" property="userEmail" jdbcType="CHAR" />
- </resultMap>
4、然后就是dao类
- /**
- *
- * @author linbingwen
- * @since 2015年10月22日
- * @param userName
- * @return
- */
- List<User> selectUserByUserName(@Param("userName") String userName);
这里一定的记得加@Param("userName")
接下来就可以在service层中添加分页查询的的接口了
5、接口类
- /**
- *
- * @author linbingwen
- * @since 2015年10月23日
- * @param userName 查询条件,可为空
- * @param pageNo 查询条件,可为空,默认取1
- * @param pageSize 查询条件,可为空,默认取10
- * @return
- */
- PagedResult<User> queryByPage(String userName,Integer pageNo,Integer pageSize);
6、实现类
- public PagedResult<User> queryByPage(String userName,Integer pageNo,Integer pageSize ) {
- pageNo = pageNo == null?1:pageNo;
- pageSize = pageSize == null?10:pageSize;
- PageHelper.startPage(pageNo,pageSize); //startPage是告诉拦截器说我要开始分页了。分页参数是这两个。
- return BeanUtil.toPagedResult(userDao.selectUserByUserName(userName));
- }
这里就可以直接在返回里头使用了PageHelper,这里userDao.selectUserByUserName(userName)的返回是一个list
其中,PagedResult是我自己封装的一个分页结果类
- package com.lin.util;
- import java.util.List;
- import com.lin.dto.BaseEntity;
- /**
- * 功能概要:
- *
- * @author linbingwen
- * @since 2015年10月23日
- */
- public class PagedResult<T> extends BaseEntity {
- /*serialVersionUID*/
- private static final long serialVersionUID = 1L;
- private List<T> dataList;//数据
- private long pageNo;//当前页
- private long pageSize;//条数
- private long total;//总条数
- private long pages;//总页面数目
- public List<T> getDataList() {
- return dataList;
- }
- public void setDataList(List<T> dataList) {
- this.dataList = dataList;
- }
- public long getPageNo() {
- return pageNo;
- }
- public void setPageNo(long pageNo) {
- this.pageNo = pageNo;
- }
- public long getPageSize() {
- return pageSize;
- }
- public void setPageSize(long pageSize) {
- this.pageSize = pageSize;
- }
- public long getTotal() {
- return total;
- }
- public void setTotal(long total) {
- this.total = total;
- }
- public long getPages() {
- return pages;
- }
- public void setPages(long pages) {
- this.pages = pages;
- }
- }
这是它的基类
- package com.lin.dto;
- import java.io.Serializable;
- import java.lang.reflect.Method;
- import java.lang.reflect.Modifier;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- /**
- *
- * <b>类说明:</b>bean基类
- *
- * <p>
- * <b>详细描述:</b>
- *
- * @author costin_law
- * @since 2014-5-5
- */
- public abstract class BaseEntity implements Serializable{
- private static final long serialVersionUID = 1L;
- private static Map<Class<?>,PropertyInfo[]> class2Props = new HashMap<Class<?>,PropertyInfo[]>(128);
- @Override
- public String toString() {
- PropertyInfo[] props = class2Props.get(this.getClass());
- if( props == null ){
- props = getProps(this.getClass());
- }
- StringBuilder builder = new StringBuilder(1024);
- boolean isFirst = true;
- for (int i = 0, n = props.length; i < n; i++) {
- try {
- PropertyInfo propInfo = props[i];
- Object value = propInfo.getMethod.invoke(this, new Object[0]);
- if (isFirst)
- isFirst = false;
- else
- builder.append(",");
- builder.append(propInfo.propName);
- builder.append(":");
- if (value instanceof String)
- builder.append("\"");
- builder.append(value);
- if (value instanceof String)
- builder.append("\"");
- } catch (Exception e) {
- // ignore
- }
- }
- return "{" + builder.toString() + "}";
- }
- private static PropertyInfo[] getProps(Class<? extends BaseEntity> clazz) {
- PropertyInfo[] props;
- Method[] allMethods = clazz.getMethods();
- List<PropertyInfo> propList = new ArrayList<PropertyInfo>();
- for (int i = 0, n = allMethods.length; i < n; i++) {
- try {
- Method method = allMethods[i];
- if ((method.getModifiers() & Modifier.PUBLIC) == 1
- && method.getDeclaringClass() != Object.class
- && (method.getParameterTypes() == null || method
- .getParameterTypes().length == 0)) {
- String methodName = method.getName();
- if (methodName.startsWith("get") || methodName.startsWith("is") ) {
- PropertyInfo propInfo = new PropertyInfo();
- propInfo.getMethod = method;
- if (methodName.startsWith("get")) {
- propInfo.propName = methodName.substring(3, 4).toLowerCase()
- + methodName.substring(4);
- } else if (methodName.startsWith("is")) {
- propInfo.propName = methodName.substring(2, 3).toLowerCase()
- + methodName.substring(3);
- }
- propList.add(propInfo);
- }
- }
- }catch(Exception e){
- }
- }
- props = new PropertyInfo[propList.size()];
- propList.toArray(props);
- class2Props.put(clazz, props);
- return props;
- }
- static class PropertyInfo{
- Method getMethod;
- String propName;
- }
- }
BeanUtil是一个将PageHelper返回的list转成pageResult的工具
- package com.lin.util;
- import java.util.List;
- import com.github.pagehelper.Page;
- import com.lin.util.PagedResult;
- /**
- * 功能概要:
- *
- * @author linbingwen
- * @since 2015年10月22日
- */
- public class BeanUtil {
- public static <T> PagedResult<T> toPagedResult(List<T> datas) {
- PagedResult<T> result = new PagedResult<T>();
- if (datas instanceof Page) {
- Page page = (Page) datas;
- result.setPageNo(page.getPageNum());
- result.setPageSize(page.getPageSize());
- result.setDataList(page.getResult());
- result.setTotal(page.getTotal());
- result.setPages(page.getPages());
- }
- else {
- result.setPageNo(1);
- result.setPageSize(datas.size());
- result.setDataList(datas);
- result.setTotal(datas.size());
- }
- return result;
- }
- }
7、这样就好了,可以跑单元测试了
- /**
- * 分页测试
- * @author linbingwen
- * @since 2015年10月22日
- */
- @Test
- public void queryByPage(){
- PagedResult<User> pagedResult = userService.queryByPage(null,1,10);//null表示查全部
- logger.debug("查找结果" + pagedResult);
- }
输出结果:
看不清的话看下面
查找结果{total:46,dataList:Page{pageNum=1, pageSize=10, startRow=0, endRow=10, total=46, pages=5, reasonable=false,
pageSizeZero=true},pageNo:1,pageSize:10,pages:5}
其中的dataList中存放的就是数据
打个断点看下就知道了:
二、前台展示分页结果
前台展示主要使用了bootstrap-paginator,这里的原理其实就是将上面查出来的结果,转换成json数据传给前台,然后前台再根据条数和分页数目、总目生成表格,同时每次点击对应的按钮都发送一个ajax请求到后台查询应对的数据,前台每次发送到后台都会包含分页数目、查询条件
1、Controller层的基类
这个基类主要实现了将数据转成json
引用到的jar包如下:
- <!-- 添加json的依赖包 -->
- <dependency>
- <groupId>net.sf.json-lib</groupId>
- <artifactId>json-lib</artifactId>
- <version>2.3</version>
- <classifier>jdk15</classifier>
- </dependency>
- <dependency>
- <groupId>org.springframework.data</groupId>
- <artifactId>spring-data-commons</artifactId>
- <version>1.6.1.RELEASE</version>
- </dependency>
- <dependency>
- <groupId>org.springframework.data</groupId>
- <artifactId>spring-data-jpa</artifactId>
- <version>1.4.1.RELEASE</version>
- </dependency>
- <dependency>
- <groupId>com.alibaba</groupId>
- <artifactId>fastjson</artifactId>
- <version>1.1.34</version>
- </dependency>
基类如下:
- package com.lin.controller;
- import com.lin.common.HttpConstants;
- import com.lin.json.JsonDateValueProcessor;
- import net.sf.json.JSONArray;
- import net.sf.json.JSONObject;
- import net.sf.json.JsonConfig;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import java.util.Date;
- /**
- * Controller基类
- */
- public class BaseController {
- protected Logger logger = LoggerFactory.getLogger(this.getClass());
- protected final static String DATE_FORMATE = "yyyy-MM-dd";
- /**
- * 返回服务端处理结果
- * @param obj 服务端输出对象
- * @return 输出处理结果给前段JSON格式数据
- * @author YANGHONGXIA
- * @since 2015-01-06
- */
- public String responseResult(Object obj){
- JSONObject jsonObj = null;
- if(obj != null){
- logger.info("后端返回对象:{}", obj);
- JsonConfig jsonConfig = new JsonConfig();
- jsonConfig.registerJsonValueProcessor(Date.class, new JsonDateValueProcessor());
- jsonObj = JSONObject.fromObject(obj, jsonConfig);
- logger.info("后端返回数据:" + jsonObj);
- if(HttpConstants.SERVICE_RESPONSE_SUCCESS_CODE.equals(jsonObj.getString(HttpConstants.SERVICE_RESPONSE_RESULT_FLAG))){
- jsonObj.element(HttpConstants.RESPONSE_RESULT_FLAG_ISERROR, false);
- jsonObj.element(HttpConstants.SERVICE_RESPONSE_RESULT_MSG, "");
- }else{
- jsonObj.element(HttpConstants.RESPONSE_RESULT_FLAG_ISERROR, true);
- String errMsg = jsonObj.getString(HttpConstants.SERVICE_RESPONSE_RESULT_MSG);
- jsonObj.element(HttpConstants.SERVICE_RESPONSE_RESULT_MSG, errMsg==null?HttpConstants.SERVICE_RESPONSE_NULL:errMsg);
- }
- }
- logger.info("输出结果:{}", jsonObj.toString());
- return jsonObj.toString();
- }
- /**
- * 返回成功
- * @param obj 输出对象
- * @return 输出成功的JSON格式数据
- */
- public String responseSuccess(Object obj){
- JSONObject jsonObj = null;
- if(obj != null){
- logger.info("后端返回对象:{}", obj);
- JsonConfig jsonConfig = new JsonConfig();
- jsonConfig.registerJsonValueProcessor(Date.class, new JsonDateValueProcessor());
- jsonObj = JSONObject.fromObject(obj, jsonConfig);
- logger.info("后端返回数据:" + jsonObj);
- jsonObj.element(HttpConstants.RESPONSE_RESULT_FLAG_ISERROR, false);
- jsonObj.element(HttpConstants.SERVICE_RESPONSE_RESULT_MSG, "");
- }
- logger.info("输出结果:{}", jsonObj.toString());
- return jsonObj.toString();
- }
- /**
- * 返回成功
- * @param obj 输出对象
- * @return 输出成功的JSON格式数据
- */
- public String responseArraySuccess(Obje
以上是关于Spring+Mybatis+SpringMVC后台与前台分页展示实例(附工程)(转)的主要内容,如果未能解决你的问题,请参考以下文章
Spring+SpringMvc+Mybatis框架集成搭建教程四(项目部署及测试)
Spring+SpringMVC+mybatis入门(环境搭建+crud)
项目笔记: IDEA+MAVEN+Bootstrap+Spring+Mybatis+SpringMVC+Mysql
基于Spring+SpringMVC+MyBatis开发书评网用户对于某本书的阅读状态的查询与更新功能实现