精华内容
下载资源
问答
  • Java WEB 分页实现

    万次阅读 多人点赞 2016-04-16 13:08:26
    Java Web 分页实现设计基于 MySQL 的关键字 limitm,n 从指定下标位置 m 开始返回 n 条记录,实现查询某一页的列表数据;前端控制分页"组件",此处组件是手写的,基本效果是支持跳转首页、尾页、以及展示出的页码,...

    1. 前言

        Java Web 分页实现设计基于 MySQL 的关键字 limit m,n 从指定下标位置 m 开始返回 n 条记录,实现查询某一页的列表数据;前端控制分页"组件",此处组件是手写的,基本效果是支持跳转首页、尾页、以及展示出的页码,最多展示 6 个页码;

        项目基于 JSP+Servlet+MySQL 实现的列表分页。分页实现效果演示 :

    图1-1、项目欢迎页图

     

    图1-2、首页分页效果图

     

    图1-3、中间页分页效果图

     

    图1-4、尾页分页效果图

     

    2. 实现设计

    从效果可以看出内容由两部分组成
        1.学生信息
        数据库中插入一些记录,此处以学生对象为例。通过JDBC获取数据库中全部的学生记录,显示在前端页面用来演示。
        2.页码查询
        当前页码为第一页或者最后一页时,不可点击,该内容会在tab.jsp文件中控制实现。

    3. 技术实现

    • JDBC 数据库的连接
    • Java 基础类接口及泛型的知识
    • JSP 与 Servlet
    • XML 配置文件

    4. 项目代码结构

        此处所用平台为  myeclipse  数据库为  mysql  (也可用其他);SpringMVC  架构MVC(model-view-controller)

         

    图4-1、项目代码结构图
    图没截全,补一下

     

    5. 开发实现

    5.1.数据库处理

        首先  jdbc  的相关操作,新建数据库  mysql2,新建表 student 

    (1)表的信息

    (2)表各属性的类型及长度

        分页实现就是将数据库中表的数据记录,前端请求服务器,Servlet 响应请求并交互数据库获取数据列表返回给前端,前端渲染展示列表,支持按指定页查询即可。

    5.2.新建Web Project

        数据库的表信息处理好后,新建  web Project 项目,

        在   /WebRoot/WEB-INF/lib  下导入  jar  用于数据库连接的包   /WebRoot/WEB-INF/lib/mysql-connector-java-5.0.3-bin.jar

        在  src  下新建包 文件名、包名自己定义(以下新建  类、包、jsp、servlet  等命名自定义 )

    (1)在所建包  pers.ms.rfeng.util  创建类  DBO  用于平台与数据库的连接,代码如下:

              

    (2)新建测试连接是否成功,代码如下:

        

    (3)新建Student 类及泛型PageBean<T>类代码如下

         
         

    (4)学生信息类对应的  DAO  包下

        新建接口 StudentDao,写一个待实现的方法  按页查询内容  findByPage(),

        同时新建类  StudentDaoImpl  实现该接口。

    StudentDao.java对应代码如下:

        

    StudentDaoImpl.java实现接口的代码

        

        

       

    (6)新建类  StudentService  类调用按页查询内容的方法

    StudentService.java 代码如下:

        

    (7)新建跳转页面  index.jsp  代码如下

         

    (8)新建对应的  servlet  名为  StudentServlet ,处理来自视图的命令或数据的接收

    StudentServlet.java 代码如下:

         

        

    (8)StudentServlet 中跳转的界面对应的 message. jsp 就是开头效果所展示的内容的  视图,

    message.jsp 代码如下:

        

    (9)其中页码的跳转条是 tab.jsp  

    tab.jsp 代码如下:

         

         

    (10)最后配置文件 web.xml

    说明:

        一般该文件,在MyEclipse是自动生成的,eclipse下需自己创建编写代码

    web.xml代码如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
      <display-name>Manager</display-name>
      <servlet>
        <description>This is the description of my J2EE component</description>
        <display-name>This is the display name of my J2EE component</display-name>
        <servlet-name>StudentServlet</servlet-name>
        <servlet-class>pers.ms.rfeng.servlet.StudentServlet</servlet-class>
      </servlet>
    
      <servlet-mapping>
        <servlet-name>StudentServlet</servlet-name>
        <url-pattern>/StudentServlet</url-pattern>
      </servlet-mapping>
    
      <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
      </welcome-file-list>
    </web-app>

    扩展
        可以加上跳转页面文本输入框,校验输入的是否为数字,根据输入的数字跳转到对应的页面或者给出合理的提示。
    其他
         字体较小,Ctrl  + 即可调界面大小,对应 Ctrl  -
         效果如开始所展示那样,
         具体的页面风格,像内容居中,颜色,加一些自己的风格,可以在,对应的   jsp  写相应的修改
    分页项目源码 :https://gitee.com/niaonao/PagingProject

    Powered By niaonao

    展开全文
  • android Gridview分页实现

    千次下载 热门讨论 2012-11-01 08:47:34
    android Gridview分页实现的一个小例子
  • 几种常见mybatis分页实现

    万次阅读 多人点赞 2019-03-23 23:39:26
    mybatis框架分页实现,有几种方式,最简单的就是利用原生的sql关键字limit来实现,还有一种就是利用interceptor来拼接sql,实现和limit一样的功能,再一个就是利用PageHelper来实现。这里讲解这三种常见的实现方式:...

    mybatis框架分页实现,有几种方式,最简单的就是利用原生的sql关键字limit来实现,还有一种就是利用interceptor来拼接sql,实现和limit一样的功能,再一个就是利用PageHelper来实现。这里讲解这三种常见的实现方式:

    无论哪种实现方式,我们返回的结果,不能再使用List了,需要一个自定义对象Pager。

    package com.xxx.mybatis.bean;
    import java.util.List;
    public class Pager<T> {
    	private int page;//分页起始页
    	private int size;//每页记录数
    	private List<T> rows;//返回的记录集合
    	private long total;//总记录条数
    	public int getPage() {
    		return page;
    	}
    	public void setPage(int page) {
    		this.page = page;
    	}
    	public int getSize() {
    		return size;
    	}
    	public void setSize(int size) {
    		this.size = size;
    	}
    	public List<T> getRows() {
    		return rows;
    	}
    	public void setRows(List<T> rows) {
    		this.rows = rows;
    	}
    	public long getTotal() {
    		return total;
    	}
    	public void setTotal(long total) {
    		this.total = total;
    	}
    }
    

    limit关键字实现:

    UserDao.java增加两个方法

    public List<User> findByPager(Map<String, Object> params);
    public long count();

    UserMapper.xml中增加两个查询

    <select id="findByPager" resultType="com.xxx.mybatis.domain.User">
    	select * from xx_user limit #{page},#{size}
    </select>
    <select id="count" resultType="long">
    	select count(1) from xx_user
    </select>

     UserService.java中增加分页方法

    public Pager<User> findByPager(int page,int size){
    	Map<String, Object> params = new HashMap<String, Object>();
    	params.put("page", (page-1)*size);
    	params.put("size", size);
    	Pager<User> pager = new Pager<User>();
    	List<User> list = userDao.findByPager(params);
    	pager.setRows(list);
    	pager.setTotal(userDao.count());
    	return pager;
    }

    这是最直观的实现方式,也是最简单的,不用任何插件或者工具就能够很方便的实现的方法。 

    interceptor plugin实现:

    需要定义一个类实现Interceptor接口

    MyPageInterceptor.java

    package com.xxx.mybatis.bean;
    import java.sql.Connection;
    import java.util.Map;
    import java.util.Properties;
    import org.apache.ibatis.executor.parameter.ParameterHandler;
    import org.apache.ibatis.executor.statement.StatementHandler;
    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;
    @Intercepts({@Signature(type=StatementHandler.class,method="prepare",args={Connection.class,Integer.class})})
    public class MyPageInterceptor implements Interceptor {
    	
    	private int page;
    	private int size;
    	@SuppressWarnings("unused")
    	private String dbType;
    
    	@SuppressWarnings("unchecked")
    	@Override
    	public Object intercept(Invocation invocation) throws Throwable {
    		System.out.println("plugin is running...");
    		StatementHandler statementHandler = (StatementHandler)invocation.getTarget();
    		MetaObject metaObject = SystemMetaObject.forObject(statementHandler);
    		while(metaObject.hasGetter("h")){
    			Object object = metaObject.getValue("h");
    			metaObject = SystemMetaObject.forObject(object);
    		}
    		while(metaObject.hasGetter("target")){
    			Object object = metaObject.getValue("target");
    			metaObject = SystemMetaObject.forObject(object);
    		}
    		MappedStatement mappedStatement = (MappedStatement)metaObject.getValue("delegate.mappedStatement");
    		String mapId = mappedStatement.getId();
    		if(mapId.matches(".+ByPager$")){
    			ParameterHandler parameterHandler = (ParameterHandler)metaObject.getValue("delegate.parameterHandler");
    			Map<String, Object> params = (Map<String, Object>)parameterHandler.getParameterObject();
    			page = (int)params.get("page");
    			size = (int)params.get("size");
    			String sql = (String) metaObject.getValue("delegate.boundSql.sql");
    			sql += " limit "+(page-1)*size +","+size;
    			metaObject.setValue("delegate.boundSql.sql", sql);
    		}
    		return invocation.proceed();
    	}
    
    	@Override
    	public Object plugin(Object target) {
    		return Plugin.wrap(target, this);
    	}
    
    	@Override
    	public void setProperties(Properties properties) {
    		String limit = properties.getProperty("limit","10");
    		this.page = Integer.parseInt(limit);
    		this.dbType = properties.getProperty("dbType", "mysql");
    	}
    
    }
    

    我们之前在service的findByPager方法里面,为了给limit传入两个参数,其中page做了计算,这里使用拦截器的方式就无需计算了:

    public Pager<User> findByPager(int page,int size){
    	Map<String, Object> params = new HashMap<String, Object>();
    	params.put("page", page);
    	params.put("size", size);
    	Pager<User> pager = new Pager<User>();
    	List<User> list = userDao.findByPager(params);
    	pager.setRows(list);
    	pager.setTotal(userDao.count());
    	return pager;
    }

    spring配置中,增加plugin设置:

    到这里,你也许也猜到了MyPageInterceptor实际上是以一种拦截器的方式在程序执行findByPager方法的时候,对语句会增加limit page,size的拼接,还是和第一种原生实现思路一样,所以这里需要对UserMapper.xml配置文件中的findByPager这个查询对应的语句中的limit #{page},#{size}这部分去掉,变为如下的样子:

    至此,通过拦截器插件的方式也实现了分页功能了。 

    PageHelper实现:

    这种方式实现需要我们引入maven依赖。

    <dependency>
    	<groupId>com.github.pagehelper</groupId>
    	<artifactId>pagehelper</artifactId>
    	<version>4.2.1</version>
     </dependency>

    spring.xml配置文件做一下修改:

     <bean id="pageInterceptor" class="com.github.pagehelper.PageHelper">
    	<property name="properties">
    		<props>
    			<prop key="helperDialect">mysql</prop>
    			<prop key="reasonable">true</prop>
    			<prop key="supportMethodsArguments">true</prop>
    			<prop key="params">count=countSql</prop>
    		</props>
    	</property>
     </bean>
    
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    	<property name="dataSource" ref="dataSource" />
    	<property name="mapperLocations"  value="classpath:com/xxx/mybatis/dao/*Mapper.xml"/>
    	<property name="plugins" ref="pageInterceptor"></property>
    </bean> 

    service层的方法,做一些修改:

    public Pager<User> findByPager(int page,int size){
    	Pager<User> pager = new Pager<User>();
    	Page<User> res = PageHelper.startPage(page,size);
    	userDao.findAll();
    	pager.setRows(res.getResult());
    	pager.setTotal(res.getTotal());
    	return pager;
    }

    至此,PageHelper工具方法实现分页也实现了。其实PageHelper方法也是第二种使用Interceptor拦截器方式的一种三方实现,它内部帮助我们实现了Interceptor的功能。所以我们不用自定义MyPageInterceptor这个类了。实际上也是在运行查询方法的时候,进行拦截,然后设置分页参数。所以PageHelper.startPage(page,size)这一句需要显示调用,然后再执行userDao.findAll(),在查询所有用户信息的时候,会进行一个分页参数设置,让放回的结果只是分页的结果,而不是全部集合。

    展开全文
  • js分页实现,前端实现

    千次阅读 2018-11-13 19:06:05
    js分页实现,前端实现

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

    也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

                   

       主要是借鉴了网上一个例子,自己重新加了样式,添加了跳转,修改了一些小地方,用于和大家一起分享,前端分页的技巧,表格的数据是我已经写好了,其实大家也可以前端渲染表格然后再分页,都是可以的。


    其实分页最关键是这两句:

    var startRow = (currentPage - 1) * pageSize+1;  //currentPage 为当前页,pageSize为每页显示的数据量
    var endRow = currentPage * pageSize;


    找到我们需要显示的行的范围(starRow~endRow)


    ps:这里在跳转的时候遇到了一个小BUG,就是获取到的select的value值是string类型的,比如获取到了1,然后你想再加1的时候就会变成"11" 而不是我们想要的"2"所以这里需要用parseInt( )来转换一下,小细节需要注意呀!!!


    效果图:



    <!doctype html><html><head> <meta charset='utf-8'> <style type="text/css">       a{  text-decoration: none; }  .table2{  border:#C8C8C8 solid;     border-width:1px 0px 0px 1px;   background: #F3F0F0;  margin-top:25px; }  .td0{     border:#C8C8C8 solid;    border-width:0 0 1px 0; }  .td2{     border:#C8C8C8 solid;     border-width:0 1px 1px 0 ; }  .barcon {  width: 1000px;  margin: 0 auto;  text-align: center;     } .barcon1 {     font-size: 17px;     float: left;     margin-top: 20px; } .barcon2 {  float: right; } .barcon2 ul {     margin: 20px 0;     padding-left: 0;     list-style: none;     text-align: center; } .barcon2 li {     display: inline; } .barcon2 a {  font-size: 16px;  font-weight: normal;  display: inline-block;  padding: 5px;  padding-top: 0;  color: black;  border: 1px solid #ddd;  background-color: #fff; } .barcon2 a:hover{  background-color: #eee; } .ban {     opacity: .4; } </style></head><body>    <table width="950" cellpadding="0" cellspacing="0" class="table2" align="center"> <thead> <tr> <td colspan="3" height="33" class="td0"> </td> <td align="center" class="td2"><a href="###">添加用户</a></td> </tr> <tr align="center">  <th width="150" height="33" class="td2">序号</th>  <th width="300" class="td2">用户名</th>  <th width="250" class="td2">权限</th>  <th width="250" class="td2">操作</th> </tr> </thead> <tbody id="adminTbody"> <tr align="center">  <td class="td2" height="33" width="150">1</td>  <td class="td2" >admin</td>  <td class="td2" >管理员</td>  <td class="td2" ><a href="###">修改</a></td> </tr> </tbody></table><div id="barcon" class="barcon" > <div id="barcon1" class="barcon1"></div>  <div id="barcon2" class="barcon2">   <ul>    <li><a href="###" id="firstPage">首页</a></li>    <li><a href="###" id="prePage">上一页</a></li>    <li><a href="###" id="nextPage">下一页</a></li>    <li><a href="###" id="lastPage">尾页</a></li>    <li><select id="jumpWhere">    </select></li>    <li><a href="###" id="jumpPage" onclick="jumpPage()">跳转</a></li>   </ul>  </div></div><script src="jquery.js"></script><script>/*动态生成用户函数 num为生成的用户数量*/function dynamicAddUser(num){ for(var i=1;i<=num;i++) {   var trNode=document.createElement("tr");   $(trNode).attr("align","center");   //序号   var tdNodeNum=document.createElement("td");   $(tdNodeNum).html(i+1);   tdNodeNum.style.width = "150px";   tdNodeNum.style.height = "33px";   tdNodeNum.className = "td2";   //用户名   var tdNodeName=document.createElement("td");   $(tdNodeName).html("lzj"+i);   tdNodeName.style.width = "300px";   tdNodeName.className = "td2";   //权限      var tdNodePri=document.createElement("td");   tdNodePri.style.width = "250px";   tdNodePri.className = "td2";   var priText=document.createElement("span");   $(priText).css({"display":"inline-block","text-align":"center"});   $(priText).text("普通用户");   tdNodePri.appendChild(priText);   //操作   var tdNodeOper = document.createElement("td");   tdNodeOper.style.width = "170px";   tdNodeOper.className = "td2";   var editA = document.createElement("a");   $(editA).attr("href", "###").text("编辑");   $(editA).css({ display: "inline-block" });   tdNodeOper.appendChild(editA);   trNode.appendChild(tdNodeNum);   trNode.appendChild(tdNodeName);   trNode.appendChild(tdNodePri);   trNode.appendChild(tdNodeOper);   $("#adminTbody")[0].appendChild(trNode); }}$(function(){ dynamicAddUser(80); goPage(1,10); var tempOption=""; for(var i=1;i<=totalPage;i++) {  tempOption+='<option value='+i+'>'+i+'</option>' } $("#jumpWhere").html(tempOption);})/** * 分页函数 * pno--页数 * psize--每页显示记录数 * 分页部分是从真实数据行开始,因而存在加减某个常数,以确定真正的记录数 * 纯js分页实质是数据行全部加载,通过是否显示属性完成分页功能**/var pageSize=0;//每页显示行数var currentPage_=1;//当前页全局变量,用于跳转时判断是否在相同页,在就不跳,否则跳转。var totalPage;//总页数function goPage(pno,psize){    var itable = document.getElementById("adminTbody");    var num = itable.rows.length;//表格所有行数(所有记录数)     pageSize = psize;//每页显示行数    //总共分几页     if(num/pageSize > parseInt(num/pageSize)){               totalPage=parseInt(num/pageSize)+1;          }else{              totalPage=parseInt(num/pageSize);          }       var currentPage = pno;//当前页数  currentPage_=currentPage;    var startRow = (currentPage - 1) * pageSize+1;     var endRow = currentPage * pageSize;        endRow = (endRow > num)? num : endRow;           //遍历显示数据实现分页    /*for(var i=1;i<(num+1);i++){            var irow = itable.rows[i-1];        if(i>=startRow && i<=endRow){            irow.style.display = "";            }else{            irow.style.display = "none";        }    }*/ $("#adminTbody tr").hide(); for(var i=startRow-1;i<endRow;i++) {  $("#adminTbody tr").eq(i).show(); }    var tempStr = "共"+num+"条记录 分"+totalPage+"页 当前第"+currentPage+"页";  document.getElementById("barcon1").innerHTML = tempStr;      if(currentPage>1){  $("#firstPage").on("click",function(){   goPage(1,psize);  }).removeClass("ban");  $("#prePage").on("click",function(){   goPage(currentPage-1,psize);  }).removeClass("ban");       }else{  $("#firstPage").off("click").addClass("ban");  $("#prePage").off("click").addClass("ban");      }    if(currentPage<totalPage){  $("#nextPage").on("click",function(){   goPage(currentPage+1,psize);  }).removeClass("ban")  $("#lastPage").on("click",function(){   goPage(totalPage,psize);  }).removeClass("ban")    }else{  $("#nextPage").off("click").addClass("ban");  $("#lastPage").off("click").addClass("ban");    }     $("#jumpWhere").val(currentPage);}function jumpPage(){ var num=parseInt($("#jumpWhere").val()); if(num!=currentPage_) {  goPage(num,pageSize); }}</script></body> </html>




    
               

    给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

    这里写图片描述
    你好! 这是你第一次使用 **Markdown编辑器** 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

    新的改变

    我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

    1. 全新的界面设计 ,将会带来全新的写作体验;
    2. 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
    3. 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
    4. 全新的 KaTeX数学公式 语法;
    5. 增加了支持甘特图的mermaid语法1 功能;
    6. 增加了 多屏幕编辑 Markdown文章功能;
    7. 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
    8. 增加了 检查列表 功能。

    功能快捷键

    撤销:Ctrl/Command + Z
    重做:Ctrl/Command + Y
    加粗:Ctrl/Command + B
    斜体:Ctrl/Command + I
    标题:Ctrl/Command + Shift + H
    无序列表:Ctrl/Command + Shift + U
    有序列表:Ctrl/Command + Shift + O
    检查列表:Ctrl/Command + Shift + C
    插入代码:Ctrl/Command + Shift + K
    插入链接:Ctrl/Command + Shift + L
    插入图片:Ctrl/Command + Shift + G

    合理的创建标题,有助于目录的生成

    直接输入1次#,并按下space后,将生成1级标题。
    输入2次#,并按下space后,将生成2级标题。
    以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。

    如何改变文本的样式

    强调文本 强调文本

    加粗文本 加粗文本

    标记文本

    删除文本

    引用文本

    H2O is是液体。

    210 运算结果是 1024.

    插入链接与图片

    链接: link.

    图片: Alt

    带尺寸的图片: Alt

    当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

    如何插入一段漂亮的代码片

    博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

    // An highlighted block var foo = 'bar'; 

    生成一个适合你的列表

    • 项目
      • 项目
        • 项目
    1. 项目1
    2. 项目2
    3. 项目3
    • 计划任务
    • 完成任务

    创建一个表格

    一个简单的表格是这么创建的:

    项目 Value
    电脑 $1600
    手机 $12
    导管 $1

    设定内容居中、居左、居右

    使用:---------:居中
    使用:----------居左
    使用----------:居右

    第一列 第二列 第三列
    第一列文本居中 第二列文本居右 第三列文本居左

    SmartyPants

    SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

    TYPE ASCII HTML
    Single backticks 'Isn't this fun?' ‘Isn’t this fun?’
    Quotes "Isn't this fun?" “Isn’t this fun?”
    Dashes -- is en-dash, --- is em-dash – is en-dash, — is em-dash

    创建一个自定义列表

    Markdown
    Text-to-HTML conversion tool
    Authors
    John
    Luke

    如何创建一个注脚

    一个具有注脚的文本。2

    注释也是必不可少的

    Markdown将文本转换为 HTML

    KaTeX数学公式

    您可以使用渲染LaTeX数学表达式 KaTeX:

    Gamma公式展示 Γ(n)=(n1)!nN\Gamma(n) = (n-1)!\quad\forall n\in\mathbb N 是通过欧拉积分

    Γ(z)=0tz1etdt&ThinSpace;. \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,.

    你可以找到更多关于的信息 LaTeX 数学表达式here.

    新的甘特图功能,丰富你的文章

    gantt
            dateFormat  YYYY-MM-DD
            title Adding GANTT diagram functionality to mermaid
            section 现有任务
            已完成               :done,    des1, 2014-01-06,2014-01-08
            进行中               :active,  des2, 2014-01-09, 3d
            计划一               :         des3, after des2, 5d
            计划二               :         des4, after des3, 5d
    
    • 关于 甘特图 语法,参考 这儿,

    UML 图表

    可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图::

    张三李四王五你好!李四, 最近怎么样?你最近怎么样,王五?我很好,谢谢!我很好,谢谢!李四想了很长时间,文字太长了不适合放在一行.打量着王五...很好... 王五, 你怎么样?张三李四王五

    这将产生一个流程图。:

    链接
    长方形
    圆角长方形
    菱形
    • 关于 Mermaid 语法,参考 这儿,

    FLowchart流程图

    我们依旧会支持flowchart的流程图:

    • 关于 Flowchart流程图 语法,参考 这儿.

    导出与导入

    导出

    如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

    导入

    如果你想加载一篇你写过的.md文件或者.html文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
    继续你的创作。


    1. mermaid语法说明 ↩︎

    2. 注脚的解释 ↩︎

    展开全文
  • Mybatis分页实现

    千次阅读 2016-08-01 22:36:28
    一、引言 ...二、普通的分页实现 普通分页实现即使直接在mapper文件中写分页查询语句 Messsage.xml <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-

    一、引言

    Mybatis提供了强大的分页拦截实现,可以完美的实现分功能


    二、普通的分页实现

    普通分页实现即使直接在mapper文件中写分页查询语句

    Messsage.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    
    <mapper namespace="com.imooc.bean.Message">
    
      <resultMap type="com.imooc.bean.Message" id="MessageResult">
        <id column="id" jdbcType="INTEGER" property="id"/>
        <result column="command" jdbcType="VARCHAR" property="command"/>
        <result column="description" jdbcType="VARCHAR" property="description"/>
        <result column="content" jdbcType="VARCHAR" property="content"/>
      </resultMap>
    
      <!-- 
    	普通分页实现		
    	使用sql实现分页查询,不是使用拦截器 
      	oracle分页使用rownum,子查询呢需要使用别名不能使用rownum,row等关键字
      -->
      <select id="queryMessageListByPage" parameterType="java.util.Map" resultMap="MessageResult">
      	select * from ( select rownum r, id,command,description,content from message
      	 	<where>
      			<if test="command != null and command.trim() != ''">
      				and command=#{command}
      			</if>
      			<if test="descriptioin != null and description.trim() != '' ">
      				and descriptioin=#{descriptioin}
      			</if>
      			<if test="page != null">
      			 	and rownum <= #{page.dbNumber}
      			</if>
     		 </where>
      		)
      		<where>
      			 and r > #{page.dbIndex}
     		 </where>
     		 order by id
      </select>
      <select id="count" parameterType="com.imooc.bean.Message"  resultType="int">
        select count(*) from message
        <where>
        	<if test="command != null and !"".equals(command.trim())">
    	    	and command=#{command}
    	    </if>
    	    <if test="description != null and ''!=description.trim()">
    	    	and description like concat(concat('%',#{description}),'%')
    	    </if>
        </where>
      </select>
    </mapper>


    Page.java分页相关的参数都通过该类对象设置

    package com.imooc.common;
    
    /**
     * 分页对应的实体类
     */
    public class Page {
    	/**
    	 * 总条数
    	 * */
    	private int totalNumber;
    
    	/**
    	 * 总页数
    	 * */
    	private int totalPage;
    
    	/**
    	 * 当前页
    	 * */
    	private int currentPage;
    
    	/**
    	 * 每页显示的数目
    	 * */
    	private int pageNumber = 5;
    
    	/**
    	 * 数据库中limit的参数,从第几条开始取
    	 * */
    	private int dbIndex;
    
    	/**
    	 * 数据库中limit的参数,一共取多少条,适用于mysql, 如果是oracle则表示最大取到的条数
    	 * */
    	private int dbNumber;
    
    	/**
    	 * 根据当前对象中的属性值计算并设置相关属性的值
    	 * */
    	
    	public void count() {
    		// 计算总页数
    		int totalPageTemp = this.totalNumber / this.pageNumber;
    		int plus = (this.totalNumber % this.pageNumber) == 0 ? 0 : 1;
    		totalPageTemp += plus;
    		// 如果总页数小于0显示第一页
    		if (totalPageTemp <= 0) {
    			totalPageTemp += 1;
    		}
    		this.totalPage = totalPageTemp;	
    		//设置limit参数
    		this.dbIndex = (this.currentPage -1 ) * this.pageNumber;
    		this.dbNumber = this.pageNumber;
    	}
    
    	public int getTotalNumber() {
    		return totalNumber;
    	}
    
    	public void setTotalNumber(int totalNumber) {
    		this.totalNumber = totalNumber;
    		count();
    	}
    
    	public int gettotalPage() {
    		return totalPage;
    	}
    
    	public void settotalPage(int totalPage) {
    		this.totalPage = totalPage;
    	}
    
    	public int getCurrentPage() {
    		return currentPage;
    	}
    
    	public void setCurrentPage(int currentPage) {
    		this.currentPage = currentPage;
    		count();
    	}
    
    	public int getPageNumber() {
    		return pageNumber;
    	}
    
    	public void setPageNumber(int pageNumber) {
    		this.pageNumber = pageNumber;
    	}
    
    	public int getDbIndex() {
    		return dbIndex;
    	}
    
    	public void setDbIndex(int dbIndex) {
    		this.dbIndex = dbIndex;
    	}
    
    	public int getDbNumber() {
    		return dbNumber;
    	}
    
    	public void setDbNumber(int dbNumber) {
    		this.dbNumber = dbNumber;
    	}
    	
    }
    

    Dao层实现

    package com.imooc.dao;
    
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import org.apache.ibatis.session.SqlSession;
    import com.imooc.bean.Message;
    import com.imooc.common.Page;
    import com.imooc.db.DBAccess;
    
    public class MessageDao {
    
    	DBAccess dbAccess = new DBAccess();
     
    	//计算查询的数据的总数
    	
             public int getMessageCount(String command,String description) throws Exception{
    		int count = 0;
    		SqlSession session = null;
    		try {
    			session = dbAccess.getSqlSession();
    			Message message = new Message();
    			message.setCommand(command);
    			message.setDescription(description);
    			count = session.selectOne(Message.class.getName()+".count", message);
    		} catch (Exception e) {
    			throw new Exception(e.getMessage());
    		} finally {
    			if (session != null) {
    				session.close();
    			}
    		}
    		return count;
    	} 
        
    	//分页实现主要的方法
    	public List<Message> queryMessageListByPage(String command, String description,Page page) throws Exception {
    		List<Message> messagesList = null;
    		SqlSession session = null;
    		try {
    			session = dbAccess.getSqlSession();
    			Map<String, Object> paramater = new HashMap<String, Object>();
    			paramater.put("command", command);
    			paramater.put("description", description);
    			paramater.put("page", page);
    			messagesList = session.selectList(Message.class.getName()+".queryMessageListByPage2", paramater);
    		} catch (Exception e) {
    			e.printStackTrace();
    			throw new Exception(e.getMessage());
    		} finally {
    			if (session != null) {
    				session.close();
    			}
    		}
    		return messagesList;
    	}
    	
    
    }


    Service层实现

    调用Dao层的方法,返回本次查询的数据

    package com.imooc.service;
    
    import java.util.ArrayList;
    import java.util.List;
    import com.imooc.bean.Message;
    import com.imooc.common.Page;
    import com.imooc.dao.MessageDao;
    
    public class MessageService {
    
    	MessageDao dao = new MessageDao();
    
    	public int getCount(String command, String description) throws Exception {
    		int count = 0;
    		try {
    			count= dao.getMessageCount(command, description);
    		} catch (Exception e) {
    			throw new Exception(e.getMessage());
    		}
    		return count;
    	}
    	
    
    	public List<Message> queryMessageListByPage(String command, String description,Page page) throws Exception {
    		List<Message> messageList = null;
    		try {
    			messageList = dao.queryMessageListByPage(command, description, page);
    		} catch (Exception e) {
    						throw new Exception(e.getMessage());
    
    		}
    		return messageList;
    	}
    }



    ListServet.java 

    用于接收前台页面的参数,以及传回数据给jsp页面

    package com.imooc.servlet;
    
    import java.io.IOException;
    import java.util.List;
    import java.util.regex.Pattern;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import com.imooc.bean.Message;
    import com.imooc.common.Page;
    import com.imooc.service.MessageService;
    
    public class ListServlet extends HttpServlet {
    
    	/**
    	 * 
    	 */
    	private static final long serialVersionUID = 1L;
    	MessageService messageService = new MessageService();
    
    	@Override
    	protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
    		try {
    			// 设置编码
    			req.setCharacterEncoding("utf-8");
    			// 接受参数
    			String command = req.getParameter("command");
    			String description = req.getParameter("description");
    			String currentPage = req.getParameter("currentPage");
    			//创建分页对象
    			Page page = new Page();
    			//设置总条数
    			page.setTotalNumber(messageService.getCount(command, description));
    			Pattern patttern = Pattern.compile("[0-9]{1,9}"); 
    			if(currentPage == null || !patttern.matcher(currentPage).matches()){
    				page.setCurrentPage(1);
    			}else {
    				page.setCurrentPage(Integer.parseInt(currentPage));
    			}
    			//oracle数据库分页,dbNumber表示最大能取到的条数
    			page.setDbNumber(page.getDbIndex()+page.getPageNumber());
    			List<Message> messageList = messageService.queryMessageListByPage(command, description, page);
    			req.setAttribute("command", command);
    			req.setAttribute("description", description);
    			req.setAttribute("messages", messageList);
    			req.setAttribute("page", page);
    			// 向页面跳转
    			req.getRequestDispatcher("/WEB-INF/jsp/back/list.jsp").forward(req,resp);
    		} catch (Exception e) {
    			e.printStackTrace();
    			req.setAttribute("retMsg", "查询失败");
    		}
    	}
    
    	@Override
    	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
    			throws ServletException, IOException {
    		doGet(req, resp);
    	}
    
    }
    

    jsp页面实现


    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
    <html xmlns="http://www.w3.org/1999/xhtml">
    	<head>
    		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    		<meta http-equiv="X-UA-Compatible"content="IE=9; IE=8; IE=7; IE=EDGE" />
    		<title>内容列表页面</title>
    		<link href="<%= basePath %>css/all.css" rel="stylesheet" type="text/css" />
    		<script src="<%= basePath %>js/common/jquery-1.8.0.min.js"></script>
    		<script src="<%= basePath %>js/back/list.js"></script>
    	</head>
    	<body style="background: #e1e9eb;">
    		<form action="<%= basePath %>List.action" id="mainForm" method="post">
    			<input type="hidden" name="currentPage" id="currentPage" value="${page.currentPage}"/>
    			
    			<div class="right">
    				<div class="current">当前位置:<a href="javascript:void(0)" style="color:#6E6E6E;">内容管理</a> > 内容列表</div>
    				<div class="rightCont">
    					<p class="g_title fix">内容列表 <a class="btn03" href="#">新 增</a>    <a class="btn03" href="javascript:deleteBatch('<%=basePath%>');">删 除</a></p>
    					<table class="tab1">
    						<tbody>
    							<tr>
    								<td width="90" align="right">指令名称:</td>
    								<td>
    									<input name="command" type="text" class="allInput" value="${command}"/>
    								</td>
    								<td width="90" align="right">描述:</td>
    								<td>
    									<input name="description" type="text" class="allInput" value="${description}"/>
    								</td>
    	                            <td width="85" align="right"><input type="submit" class="tabSub" value="查 询" /></td>
    	       					</tr>
    						</tbody>
    					</table>
    					<div class="zixun fix">
    						<table class="tab2" width="100%">
    							<tbody>
    								<tr>
    								    <th><input type="checkbox" id="all" οnclick="javascript:selAllCheckbox('id')"/></th>
    								    <th>序号</th>
    								    <th>指令名称</th>
    								    <th>描述</th>
    								    <th>操作</th>
    								</tr>
    								<c:forEach items="${requestScope.messages}" var="message" varStatus="status">
    									<tr  <c:if test="${status.index % 2 != 0}">style='background-color:#ECF6EE;'</c:if>>
    										<td><input type="checkbox"  name="id" value="${message.id}"/></td>
    										<td>${status.index + 1}</td>
    										<td>${message.command}</td>
    										<td>${message.description}</td>
    										<td>
    											<a href="#">修改</a>   
    											<a href="${basePath}DeleteOneServlet.action?id=${message.id}">删除</a>
    										</td>
    									</tr>
    								</c:forEach>
    							</tbody>
    						</table>
    						<div class='page fix'>
    							共 <b>${page.totalNumber}</b> 条
    							共<b>${page.totalPage }</b>页
    							<c:if test="${page.currentPage != 1}">
    								<a href="javascript:changeCurrentPage('1')" class='first'>首页</a>
    								<a href="javascript:changeCurrentPage('${page.currentPage-1}')" class='pre'>上一页</a>
    							</c:if>
    							当前第<span>${page.currentPage}/${page.totalPage}</span>页
    							<c:if test="${page.currentPage != page.totalPage}">
    								<a href="javascript:changeCurrentPage('${page.currentPage+1}')" class='next'>下一页</a>
    								<a href="javascript:changeCurrentPage('${page.totalPage}')" class='last'>末页</a>
    							</c:if>
    							跳至 <input id="currentPageText" type='text' value='${page.currentPage}' class='allInput w28' /> 页 
    							<a href="javascript:changeCurrentPage($('#currentPageText').val())" class='go'>GO</a>
    						</div>
    					</div>
    				</div>
    			</div>
    	    </form>
    	</body>
    </html>

    使用jquery提交分页参数

    /*
     * 实现翻页功能
     */
    function changeCurrentPage(currentPage){
    $("#currentPage").val(currentPage).val();
    $("#mainForm").submit();
    }


    三、使用Mybatis分页拦截器实现

     使用Mybatis分页拦截器,我们可以不用在Mapper配置文件中写分页查询语句,我们只需要写非分页查询语句就行,然后通过分页拦截器,拦截到需要分页查询的普通sql

    将普通的sql替换成分页sql,非常巧妙的实现分页查询

    1.实现拦截器我们需实现Interceptor

    我们假如将拦截器形象的比喻成够票与代理商

    a.@Intercepts注解声明了代够员取哪里拦截需要买票的顾客(去哪里拦截顾客)

    b.setProperties获取Configuration.xml中plugins--》plugin--->propertis中的固定资本(公司固定资本)

    c.plugin方法中判断是否需要拦截(顾客是否需要购票)

    d.intercept方法中可以获取原始的sql(非分页查询的sql),和分页参数   通过取到这些参数替换掉原来的sql即编程分页sql(代购员从顾客哪里获取信息)

    package com.imooc.interceptor;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.util.Map;
    import java.util.Properties;
    
    import org.apache.ibatis.executor.parameter.ParameterHandler;
    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.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 org.apache.ibatis.session.Configuration;
    
    import com.imooc.common.Page;
    
    /**
     * myBatis分页拦截器实现
     * 拦截器在配置文件Configuration.xml中注册后,通过下边的注解声明拦截的类,方法,方法参数
     * */
    //type指向需要拦截的接口,method指向需要拦截的方法,args指向方法中的参数
    //StatementHandler是一个接口,实现类是BaseStatementHanlder,实现了其中的prepare方法,实现方法中instantiateStatement(connection)
    //返回Statement
    @Intercepts({@Signature(type=StatementHandler.class,method="prepare",args={Connection.class})})
    public class PageInterceptor implements Interceptor{
    	private Object object;
    	private static String defualtSqlId = ".+ByPage$";  //需要拦截的配置文件中的id的正则表达式
    	private static String defaultDialect = "oracle";   //默认数据库类型
    	private String dialect;     			//数据库类型
    	
    	/**
    	 * 3.代购
    	 * 可以指定拦截映射文件中那种id的值,
    	 * invocation中可以获取想要的数据
    	 * */
    	@Override
    	public Object intercept(Invocation invocation) throws Throwable {
    		//代理业务员获取代理对象的携带的信息(需要买票的人哪里获取信息)
    		StatementHandler statementHandler =	(StatementHandler)invocation.getTarget();
    		//使用metaObject中获取statementHandler属性的值
    		MetaObject metaObject = MetaObject.forObject(statementHandler, SystemMetaObject.DEFAULT_OBJECT_FACTORY, SystemMetaObject.DEFAULT_OBJECT_WRAPPER_FACTORY);
    		//BaseStatementHandler-->mappedStatement(delegate为<span style="font-family: Arial, Helvetica, sans-serif;">mappedStatement属性名</span><span style="font-family: Arial, Helvetica, sans-serif;">)</span>
    		MappedStatement mappedStatement=(MappedStatement) metaObject.getValue("delegate.mappedStatement");
    	       Configuration configuration = (Configuration) metaObject.getValue("delegate.configuration");
    		//获取数据库类型,获取Configuration.xml properties标签中声明的变量
    	    dialect = configuration.getVariables().getProperty("dialect");
    	    if (null == dialect || "".equals(dialect)) {
                dialect = defaultDialect;
            }
    		//获取mapper文件中sql语句的id
    		String pageSqlId = mappedStatement.getId();
    		if(pageSqlId.matches(defualtSqlId)){//获取已Bypage结尾的id中的sql语句    		拦截谁
    			BoundSql boundSql = statementHandler.getBoundSql();
    			//获取原始的sql
    			String sql = boundSql.getSql();
    			//查询总条数
    			String countSql = "select count(*) from ("+sql+") a";
    			Connection connection = (Connection) invocation.getArgs()[0];
    			PreparedStatement countStatement = connection.prepareStatement(countSql);
    			//获取原始的sql参数信息
    			ParameterHandler parameterHandler =  (ParameterHandler) metaObject.getValue("delegate.parameterHandler");
    			//设置参数值
    			parameterHandler.setParameters(countStatement);
    			//执行获取总条数
    			ResultSet rs = countStatement.executeQuery();
    			
    			//改造成带分页查询的sql,获取传给配置文件的参数,就是MessageDao中queryMessageListByPage中方法执行中传递进去的map参数,所以需要强转
    			Map<String, Object> parameter = (Map<String, Object>) boundSql.getParameterObject();
    			//paramter(map)中传入的page对象的参数
    			Page page = (Page)parameter.get("page"); 
    			//设置page的总条数
    			if(rs.next()){
    				page.setTotalNumber(rs.getInt(1));
    			}
    			//改造成带分页查询的sql
    			String pageSql = buildPageSql(sql,page);
    			//替换员来的sql
    			//第一参数:找到源码中的sql
    			//第二个参数:改造后的sql
    			metaObject.setValue("delegate.boundSql.sql", pageSql);   		//买票
    		}
    		return invocation.proceed();   //交回主权,买票后送回
    	}
    
    	/**
    	 * 2.定位客户  @Intercepts({@Signature(type=StatementHandler.class,method="prepare",args={Connection.class})})
    	 * 如果拦截成功,会返回一个代理类(业务员),然后会执行intercept方法
    	 * 就好比拦截到买票的人,需不需要买票,不需要放行,return就是放行
    	 * 需要就代表一种协议Plugin.wrap(target, this);
    	 * target就好比拦截住的需要买票的人,this就是公司的业务员,返回后this就变成可以代理target去买票的业务员
    	 * */
    	@Override
    	public Object plugin(Object target) {
    		return Plugin.wrap(target, this);
    	}
    
    	/**
    	 * 1.获取固定资本
    	 * 获取Configuration.xml中的plugin中的property中的属性值
    	 * */
    	@Override
    	public void setProperties(Properties properties) {
    		this.object = properties.get("test"); 
    	}
    	
    	/**
    	 * 改造成带分页查询的sql
    	 * sql原始sql(不带分页功能)
    	 * Page page分页实体类对象
    	 **/
    	public String buildPageSql(String sql,Page page){
    		StringBuilder builder = new StringBuilder();
    		if(dialect.equals("oracle")){
    			builder = pageSqlForOracle(sql, page);
    		}
    		if(dialect.equals("mysql")){
    			pageSqlForMysql(sql, page);
    		}
    		return builder.toString();
    	}
    	//mysql分页查询
    	public StringBuilder pageSqlForMysql(String sql,Page page){
    		StringBuilder builder = new StringBuilder();
    		builder.append(sql);
    		builder.append(" limit "+page.getDbIndex()+","+page.getDbNumber());
    		builder.append(" order by id");
    		return builder;
    	}
    
    	/**
    	 * 实现oracle分页
    	 * */
    	public StringBuilder pageSqlForOracle(String sql,Page page){
    		StringBuilder builder = new StringBuilder();
    		builder.append("select * from ( select rownum r, id,command,description,content from (");
    		builder.append(sql);
    		builder.append(") where rownum <= ").append(page.getDbNumber()+page.getDbIndex());
    		builder.append(") where r > ").append(page.getDbIndex());
    		builder.append(" order by id");
    		System.out.println(builder.toString());
    		return builder;
    	}
    }
    

    Configuration.xml中注册分页拦截器插件

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
    
    <configuration>
    	<properties>
    		<property name="dialect" value="oracle" />
    	</properties>
    	<!-- 拦截器可以有很多,就像代购公司有很多每一个公司都需要注册,下边就是注册 -->
    	<plugins>
    		<plugin interceptor="com.imooc.interceptor.PageInterceptor">
    			<property name="test" value="interceptor" /><!-- property中的值可以在拦截器中的setProperties中拿到 -->
    		</plugin>
    	</plugins>
    
    	<environments default="development">
    		<environment id="development">
    			<transactionManager type="JDBC">
    				<property name="" value="" />
    			</transactionManager>
    			<dataSource type="UNPOOLED">
    				<property name="driver" value="oracle.jdbc.driver.OracleDriver" />
    				<!-- <property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"/> -->
    				<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe" />
    				<property name="username" value="caojx" />
    				<property name="password" value="caojx" />
    			</dataSource>
    		</environment>
    	</environments>
    
    	<mappers>
    		<mapper resource="com/imooc/config/sqlxml/Message.xml" />
    	</mappers>
    
    </configuration>

    Message.xml变化

    不需要写分语句

    <?xml version="1.0" encoding="UTF-8"?>
    
    <!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    
    <mapper namespace="com.imooc.bean.Message">
    
      <resultMap type="com.imooc.bean.Message" id="MessageResult">
        <id column="id" jdbcType="INTEGER" property="id"/>
        <result column="command" jdbcType="VARCHAR" property="command"/>
        <result column="description" jdbcType="VARCHAR" property="description"/>
        <result column="content" jdbcType="VARCHAR" property="content"/>
      </resultMap>
    
    <!-- select标签用于书写查询语句-->
      <select id="queryMessageListByPage" parameterType="java.util.Map" resultMap="MessageResult">
        select id,command,description,content from message
        <where>
        	<if test="command != null and !"".equals(command.trim())">
    	    	and command=#{command}
    	    </if>
    	    <!-- like 查询一般会拼接concat()拼接两个字符串 -->
    	    <if test="description != null and ''!=description.trim()">
    	    	and description like concat(concat('%',#{description}),'%')
    	    </if>
        </where>
      </select>
    </mapper>

    ListServlet.java中的一小点变化

    package com.imooc.servlet;
    
    import java.io.IOException;
    import java.util.List;
    import java.util.regex.Pattern;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import com.imooc.bean.Message;
    import com.imooc.common.Page;
    import com.imooc.service.MessageService;
    
    public class ListServlet extends HttpServlet {
    
    	/**
    	 * 
    	 */
    	private static final long serialVersionUID = 1L;
    	MessageService messageService = new MessageService();
    
    	@Override
    	protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
    		try {
    			// 设置编码
    			req.setCharacterEncoding("utf-8");
    			// 接受参数
    			String command = req.getParameter("command");
    			String description = req.getParameter("description");
    			String currentPage = req.getParameter("currentPage");
    			//创建分页对象
    			Page page = new Page();	
    			Pattern patttern = Pattern.compile("[0-9]{1,9}"); 
    			if(currentPage == null || !patttern.matcher(currentPage).matches()){
    				page.setCurrentPage(1);
    			}else {
    				page.setCurrentPage(Integer.parseInt(currentPage));
    			}
    			List<Message> messageList = messageService.queryMessageListByPage(command, description, page);
    			req.setAttribute("command", command);
    			req.setAttribute("description", description);
    			req.setAttribute("messages", messageList);
    			req.setAttribute("page", page);
    			// 向页面跳转
    			req.getRequestDispatcher("/WEB-INF/jsp/back/list.jsp").forward(req,resp);
    		} catch (Exception e) {
    			e.printStackTrace();
    			req.setAttribute("retMsg", "查询失败");
    		}
    	}
    
    	@Override
    	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
    			throws ServletException, IOException {
    		doGet(req, resp);
    	}
    
    }
    

    结果图


    注:本案例思想有慕课网提供指导

    展开全文
  • EasyUI数据分页实现(真假分页)

    千次阅读 2018-01-20 11:21:28
    数据分页功能的实现是在...现在的分页实现依赖于EasyUI前台框架的强大功能,那么接下来就让我们看看数据分页在Easyui中的实现吧! 分页往往是依附于数据表格的,所以我们就使用的是easyui的datagrid组件,来开启pagi
  • 常见数据库分页实现

    千次阅读 2017-10-15 16:09:23
    因为数据量过大,如果一次性查询会耗用大量时间以及性能,因此对数据进行分页显示变得尤为重要,以下就列出一些常用数据库的sql分页实现。  1.MySQL实现分页  MySQL实现分页效果比较简单,只有一个limit关键字...
  • Laravel 手动分页实现

    万次阅读 2016-06-24 15:27:20
    Laravel 手动分页实现基于5.2版本在开发过程中有这么一种情况,你请求Java api获取信息,由于信息较多,需要分页显示。Laravel官方提供了一个简单的方式paginate($perPage),但是这种方法只适用model、查询构建器。 ...
  • jeesite的分页实现

    2017-03-06 20:17:00
    jeesite分页实现 我们在使用jeesite的时候总是会遇到一些问题,其中分页问题比较常见,分页不能使用 下面我就来说一下jeesite是到底怎么实现分页的 如下: 首先看一下JSP页面 怎么实现: page函数 在自动生成的代码...
  • 手动分页实现

    千次阅读 2019-08-27 23:12:31
    这时候pageHelper就不再适用了,因为pageHelper是对查询sql的修改,添加分页语句实现分页。这时候,就需要自己手动分页。 代码: Integer page = pageBean.getPage(); Integer size = pageB...
  • springboot 中 分页实现

    万次阅读 热门讨论 2018-04-17 16:20:56
    本次要讲的是典型的两种分页方式,即sql分页和插件分页。 依赖 因为使用了mybatis、mysql ,所以要添加相关依赖。这里版本没有特别需求,选择你想要的版本即可。 &amp;amp;amp;lt;!--mybatis--&amp...
  • Oracle分页实现

    千次阅读 2012-03-14 23:13:12
    Oracle分页实现 10级学员 张帅鹏课堂总结 简单分析下如何实现: 考虑mySql中的实现分页,select * from 表名 limit 开始记录数,显示多少条;就可以实现我们的分页效果。 但是在oracle中没有limit关键字,但是有...
  • 后台分页实现方式总结

    千次阅读 2016-06-20 15:51:18
    @(JAVA开发)后台分页实现方式总结分页后端的实现方式有两种, 一种是第一次就取出全部数据。然后点击下一页的时候只是展示的不一样而已,而不是再次和后台交互。 而另外一种也是基本大家都在使用的方式就是每一次...
  • SpringBoot+Mybatis+Oracle分页实现

    千次阅读 2020-02-28 21:57:47
    在日常开发中,对数据的分页实现是在所难免的,而分页可以通过原始的方法来实现,也可以使用相应的分页插件。 Idea工程目录如下: 实体类: 数据库字段类: package com.per.springtest.entity; import lombok.Data;...
  • Oracle的分页实现

    万次阅读 2017-12-07 18:02:47
    在Oracle中实现分页的方法大致分为两种,用ROWNUM关键字和用ROWID关键字
  • MySql分页实现

    千次阅读 2018-06-19 22:27:06
    分页sql格式是:select * from table limit (start-1)*limit,limit; 其中start是页码,limit是每页显示的条数。分页需求:客户端通过传递start(页码),limit(每页显示的条数)两个参数去分页查询数据库表中的数据,那...
  • java web Spring mvc 分页实现

    万次阅读 2016-04-21 09:44:13
    分页实现的效果:  ///////// /////////////////////////////////////////////////////// //////////////////////////////////////////////// ////////////////////////////////////////////////////////////...
  • mybatisPlus3.X XML自定义分页实现

    千次阅读 2019-11-06 19:23:58
    mybatisPlus3.X XML自定义分页实现 ##开发中遇到的问题:xml中写了一个复杂的查询sql,没法用MP的单表自动分页功能,网上找了很久发现了这篇文章,终于解决了。 链接 ...链接: link. 总结: 1.MP版本不同,实现细节有...
  • 问题描述 园友是做前端的,产品经理要求他使用jQuery DataTables插件显示一个列表,要实现分类效果。...先来分析下分页实现。 一是后端分页:这种情况下,在后端很容易实现,在官网上有示例,不多说明。 二是
  • 小程序分页实现

    万次阅读 2018-03-29 17:35:59
    小程序分页和下拉刷新时一个最常用的功能,实现起来也不是很难,我这里就使用一个伪代码方式来实现,最主要的是这个思路 2.实现 // pages/zhibo/zhibo.js var app = getApp(); var wechatUtil = require('../../...
  • layui 分页实现

    千次阅读 2018-08-03 16:38:32
    还是基于自己搭建的SSM案例框架来实现 效果图如下 分页jsp和js内容模块,暂时写在了一块,当然也可以提出来写个js文件 &lt;%@ page language="java" contentType="text/html; charset=UTF-...
  • easyui 分页实现

    千次阅读 2015-07-04 16:19:20
    1、用datagrid 做分页显示, 根据API例子,终于解决,废话不说,datagrid分页 有一个附加的分页控件 通过在datagrid中设置pagination:true 就会显示分页 当请求是 后台会通过 获取page 获取当前页 根据rows每页显示...
  • 分页实现的原理

    千次阅读 2018-12-20 15:49:17
    什么是分页技术 分页,是一种将所有数据分段展示给用户的技术.用户每次看到的不是全部数据,而是其中的一部分,如果在其中没有找到自习自己想要的内容,用户可以通过制定页码或是翻页的方式转换可见内容,直到找到自己想...
  • SpringBoot下dataTable分页实现

    千次阅读 2018-09-26 17:33:55
    dataTable的分页可以前端实现,但是前端实现分页是假分页(从后台获取所有数据,再缓存分页处理),这样做确实方便开发,但是随着数据量逐渐增大,查询的消息越来越低,每次都在查询的时候卡住几秒。所以假分页...
  • 原始Pagination分页实现

    千次阅读 2018-01-28 11:40:27
    本文章主要实现了原始方式和Pagination插件方式实现分页 源码放在下面码云地址上。 下面是效果图: 1.jdbcSqlStudent.jsp页面 <%@ page language="java" contentType="text/html; charset=UTF-8" ...
  • js分页实现,前端实现。

    万次阅读 多人点赞 2017-01-05 18:32:38
    主要是借鉴了网上一个例子,自己重新加了样式,添加了跳转,修改了一些小地方,用于和大家一起分享,前端分页的技巧,表格 的数据是我已经写好了,其实大家也可以前端渲染表格然后再分页,都是可以的。 ...
  • Oracle分页实现原理

    千次阅读 2017-12-14 11:30:12
    Oracle中的表,除了我们建表时设计的各个字段,其实还有两个字段(此处只介绍2个),分别是ROWID(行标示符)...对于分页,我们只要想办法可以查询到从某一起始行到终止行就可以的,分页的逻辑可以放到程序里面。 于是
  • java后台简单分页实现

    千次阅读 2017-12-24 22:33:49
    1、写分页的DTO package pers.weisg.ssm.common.paginated; import java.io.Serializable; import java.util.List; /** * @Description: 分页的DTO * @author WEISANGNG * @date 2017年12月24日 */ public ...
  • 前段时间项目需要WPF分页控件,百度了许久,也没有找到一个合适的开源控件,不是太丑,就是封装的控件无法使用,最后决定自己写一个。 写的时候,参照百度搜索分页对传统分页控件做了简化。细致地看了下百度搜索...
  • symfony分页实现方法

    千次阅读 2016-02-22 16:30:20
    一个分页让我无语了好长时间,找了各种资料,就是不知道怎么入门,官方文档又没有说,这里说一下吧! @姐的世界,尔等怎么会...所以这里使用KnpPaginatorBundle实现翻页 运行命令拉去组件 composer require "knplabs/k

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 301,484
精华内容 120,593
关键字:

分页如何实现