SSM 封装base(一) 实现了简单的增删查改,此篇会加上分页功能

首先是 service层 的实现类

  • 省去了上一遍中实现过的增删查改
@Service
public abstract class BaseService<T> implements IBaseService<T>{public abstract IBaseDao<T> getBaseDao(); public abstract Class<T> getClasss();public Class<T> clsss;{clsss = getClasss();}@Overridepublic Page<T> queryByPage(Page<T> page) {String tableName = clsss.getSimpleName().toLowerCase();List<T> list = new ArrayList<>();//分页 查询 数据   (表名,分页起始位置(利用mysql的limit),每页条数,[条件]) List<HashMap<Object, Object>> listmap =  getBaseDao().queryByPage( tableName, (page.getPage()-1)*page.getSize() , page.getWhere() );// 遍历每个 Map 并通过自定义的方法转换成目标实体类,并添加到结果集list中for (HashMap<Object, Object> hashMap : listmap) {T t1 = hashMapToEntity(hashMap);list.add( t1 );}//将转换好的数据集合放入 Page 对象
        page.setList(list);//根据条件查询数据条数if ( page.getWhere()==null || page.getWhere().length()<=0 ) {page.setCount( queryCount(  ) );}else {page.setCount( queryCount( page.getWhere() ) );}//数据总条数int tmp = page.getCount()/page.getSize();//最大页数page.setMax(page.getCount()<=page.getSize()?1:page.getCount()%page.getSize()>0?tmp+1:tmp);return page;}/*** 将HashMap 转成 实体类对象*/private T hashMapToEntity( Map<Object, Object> map ) {T t = null;try {t = clsss.newInstance();for (Field f : t.getClass().getDeclaredFields()) {f.setAccessible(true);f.set(t,map.get(f.getName()));}} catch (Exception e1) {e1.printStackTrace();}return t;}//无条件查询记录数public int queryCount() {String tableName = clsss.getSimpleName().toLowerCase();return getBaseDao().queryCount( tableName , "1=1" );}//有条件的查找记录数public int queryCount(String where) {String tableName = clsss.getSimpleName().toLowerCase();return getBaseDao().queryCount( tableName , where );}
}

IBaseDao 接口

  • 同样的省去了上一篇中实现过的方法
public interface IBaseDao <T> {List<HashMap<Object, Object>> queryByPage(@Param("name")String name, @Param("page")int page, @Param("size")int size,String where);int queryCount( @Param("name")String lowerCase , @Param("where") String where);}

BaseMapper

  • 经过 service 层的麻烦的数据处理,在语句方面已经非常简单了,同样省去上一篇已经实现了的方法
<mapper namespace="base.dao.IBaseDao" ><select id="queryByPage" resultType="hashmap">select * from ${name} where  ${where} limit #{page},#{size} </select><select id="queryCount" resultType="int">select count(1) from ${name} where ${where}</select></mapper>

Page 对象

  • 导航页码呢就是分页中·····额算了 直接上图吧 
  • 还有 地址 url 这个 在后面 BaseController 里面说
@Controller
public class Page <T>{private Integer page;   //当前页private Integer size = 5;//每页默认为5private Integer max; //最大页数private Integer count;   //项目条数private String url; //地址private List<Integer> indexs;//要显示的页码private Integer indexNum ;//可现实页码范围内的数量private List<T> list;private String where;//在无参构造中初始化,当然我也在 BaseController 中初始化,//两种方式皆可,反正我都写上了//当然可以写在配置文件中,这是更好的,//方便起见就没有写配置文件了public Page() {page = 1;size = 5;indexNum = 5;where = " 1=1 ";}/*** 计算显示的导航页码*/private void count() {Integer page = getPage();Integer max = getMax();if ( page!=null && max!=null ) {int begin = Math.max(page-indexNum, 1);int end = Math.min(page+indexNum, max);indexs = new ArrayList<>();for( int i = begin ; i <= end ; i++ ) {indexs.add(i);}}}public void setPage(Integer page) {this.page = page;count(); //计算页码
    }public void setMax(Integer max) {this.max = max;count(); //计算页码
    }/*** 省去  普通的get set tostring等*/
}

BaseController 增强

  • 在使用时,你自己的Controller中 拿到 Page 对象之前会 在这里做一些处理

  • 可以在这里做一些初始化,将参数全部在这里截取并重新拼接(为了保留参数),方便后续开发中需要做相应的带条件的分页查询。

  • 这里的 url 就是每次要访问的地址了 
    第一次分页查询时的地址 
     
    点击下一页后地址 
     
    从输出看,每次点击下一页,rul都是保持”干净的” 

  • 所以说地址固定了,在分页页面中想要添加条件直接写&&条件即可,如果不在这里截取url ,那么之前的条件还是会在,所有条件堆在后面,地址栏会越来越长
@Controller
public class BaseController <T> {@InitBinderpublic void initBinder( WebDataBinder binder , final HttpServletRequest request ){binder.registerCustomEditor(Page.class,new PropertyEditorSupport(){@Overridepublic Object getValue() {Page<T> page = (Page<T>) super.getValue();//提前操作  Page 对象if ( page.getPage() == null ) {//没有设页数的时候 默认第一页page.setPage(1);}//设置每页的条数page.setSize(5);//解析request ,获得请求连接String url = request.getRequestURI();String params = request.getQueryString();//获取参数//忽略掉一已经没用的参数,url变成"http://localhost:8080/SSM/stu/queryByPage?1=1"//所以页面中对page传参直接写:&参数=值 接上新的参数即可if ( params!=null && !"".equals(params) ) {url += "?" + params;}else {url += "?1=1";}//找到 每次要访问的地址int index = -1;if ( (index = url.indexOf("&page="))!=-1 ) {url = url.substring(0, index);}page.setUrl(url);return page;}});}
}

page.jsp

  • 这里我将page给单独分出来了,需要用的时候直接引入即可

  • 如之前说的,在去到另一页时只需要用我们 page 中的url 加上需要的条件,参数即可

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>    <div><c:if test="${page.page==1 }"><a>首页</a><a>上一页</a></c:if><c:if test="${page.page>1 }"><a href="${page.url }&page=1">首页</a><a href="${page.url }&page=${page.page-1}">上一页</a></c:if><!-- 页码 --><c:forEach items="${page.indexs }" var="index">        <c:if test="${index == page.page }"><b>${index}</b></c:if><c:if test="${index != page.page }"><a href="${page.url }&page=${index}"><b>${index}</b></a></c:if></c:forEach><c:if test="${page.page<page.max }"><a href="${page.url }&page=${page.page+1}">下一页</a><a href="${page.url }&page=${page.max}">尾页</a></c:if><c:if test="${page.page==page.max }"><a >下一页</a><a >尾页</a></c:if><a>当前第${page.page }页/共${page.max }页</a>     </div>

使用中

@Controller
@RequestMapping("/stu")
public class StuController extends BaseController<Student> {@Autowiredprivate  IStudentService studentService  ;@RequestMapping("/queryByPage")public String queryByPage( Model model , Page<Student> page ) {//这里用 page接收即可,数据也是放在其中的page = studentService.queryByPage( page );model.addAttribute("page",page);//可以选择是否设置条件,可以在一些需要特殊搜索的时候加上条件//可以在页面中传参然后在这里设置条件//比如  年龄大于20的 学生 并分页page.setWhere("age>20");System.out.println(page);return "stulist";
}

同上一篇 ,你自己的service和dao层该继承的继承,该实现的实现,

public interface IStudentService extends IBaseService<Student> {
}

@Service
public class StudentService extends BaseService<Student> implements IStudentService {@Autowiredprivate IStudentDao mapper;@Overridepublic IBaseDao<Student> getBaseDao() {return mapper;}@Overridepublic Class<Student> getClasss() {return Student.class;}
}

public interface IStudentDao extends IBaseDao<Student> {}

下一篇呢 准备先写一个 简单的级联查询

转载于:https://www.cnblogs.com/huangjianlong/p/7861381.html

SSM 封装base(二) -封装分页相关推荐

  1. axios的一封装和二次封装

    在做axios请求的时候还是有一个后端服务器地址比较好,这是自己搞的一个简易的后端,小白一枚,不要喷我哦 指令是: 全局指令: npm install express-generator -g 局部指 ...

  2. 《C#零基础入门之百识百例》(五十二)封装介绍 -- 二维多项式求值

    C#零基础入门 面向对象 -- 封装介绍 -- 二维多项式求值 前言 一,封装概念 二,封装属性 三,实例练习 -- 二维多项式求值 3.1 题目描述 3.2 问题分析 3.3 参考代码 前言 本文属 ...

  3. el-table封装,elementtable封装,eltable封装详解(含分页)

    首次发布时间:2021-04-09 18:23:36 最后更新时间:2022-09-24 20:51 前言:仔细看懂本篇博客,玩转element table 不成问题 ,个人理解所谓封装,就是把经常都 ...

  4. 快速封装一个二维码在线生成接口

    方法一:利用接口,生成二维码 这种方法生成的二维码最简单,你只需要调用别人提供的二维码生成接口,同时传递相应的参数即可. <?php /*** @author DengPeng <3@de ...

  5. Python面向对象二 封装与修饰器

    Python面向对象二 封装与修饰器 1. 特殊方法 2. 封装 2.1 封装的引入 2.2 封装实例一 2.3 封装实例二 3. property装饰器 1. 特殊方法 • 在类中可以定义一些特殊方 ...

  6. 【JavaSE】类和对象 (二) —— 封装、包以及 static 关键字

    目录 1. 封装 1.1 封装的概念 1.2 访问限定符 2. 包 2.1 包的概念 2.2 导入包中的类 2.3 自定义包 2.3.1 包的基本规则 2.3.2 创建一个包 2.4 包访问权限--d ...

  7. ssm南工二手书交易平台 毕业设计-附源码172334

    SSM南工二手书交易平台 摘 要 随着计算机技术和网络技术的迅速发展,网上购物已经融入了人们的日常生活中,电子商务也因此流行起来.国内的京东商城.天猫.苏宁易购等大型网站在图书销售等商品零售领域已经十 ...

  8. (附源码)ssm南工二手书交易平台 毕业设计172334

    SSM南工二手书交易平台 摘要 随着计算机技术和网络技术的迅速发展,网上购物已经融入了人们的日常生活中,电子商务也因此流行起来.国内的京东商城.天猫.苏宁易购等大型网站在图书销售等商品零售领域已经十分 ...

  9. 常用公共代码二之分页代码的实现

    在项目中,我们经常会写到一些公共的代码,来让开发人员调用,减少代码重复,下面,我就将一些常用到的公共类贴出来和大家分享!! 二.分页代码实现:在项目中,分页是一个项目中必不可少的,它可以防止我们从数据 ...

最新文章

  1. css( div和span)——读书笔记
  2. C++11 std::function
  3. CodeForces - 1454E Number of Simple Paths(基环树+思维)
  4. Jerry的反省:程序员不要轻易说出“这个功能技术上无法实现“
  5. aws rds恢复数据库_使用AWS Glue将数据从AWS S3加载到AWS RDS SQL Server数据库
  6. 现代计算机内补码是多少进制,二进制:关于10000000如何表示-128的问题
  7. 北航计算机专业怎么样,选计算机专业,北航、南大、中科大3校如何选择?选北航更有优势...
  8. matlab bar 填充花纹,科学网—使用matlab绘画柱状图,且使用不同的图案填充 - 时杰的博文...
  9. Hadoop数据传输工具sqoop - 样例
  10. 计算机网络之物理层、链路层、网络层
  11. Unity web player-----a new version is required/insatall manually
  12. Windows系统开机自动运行程序和自动启动服务
  13. 身份认证协议攻击怎么解决
  14. python 如何匹配一撇字符_使用Python正则表达式解析斜杠和撇号
  15. 端到端测试(e2e测试)
  16. Linux 主机网络接入配置
  17. linux的简体中文
  18. 选修课《创新创业执行力》第一次课有感
  19. 三种方式实现网页二级菜单
  20. 汇川机器人视觉标定_汇川机器人应用技术课件.ppt

热门文章

  1. 【恋上数据结构】计数排序
  2. 小程序进阶学习02--安装webstorm
  3. 集成CAS单点登录 决策系统的配置以及注意事项
  4. 用java制作心理测试软件_Java 程序员必备的10款开源工具
  5. Vue父子组件传递数据
  6. vue条件渲染指令if/show
  7. python定义模块结束语_python-模块定义、导入、优化
  8. java多线程基础_java线程基础
  9. M - Corporate Identity(多组字符串匹配问题)
  10. 使用python的笔记