Mybatis的分页查询

示例1:查询业务员的联系记录

1.控制器代码(RelationController.java)

    //分页列出联系记录
    @RequestMapping(value="toPage/customerRecord")
    public String listRelationRecord(Map map,String beginTime,String endTime,
            String uname,Long curPage){
        Map<String,Object> map1 = new HashMap<String, Object>();
        if(beginTime!= null && !"".equals(beginTime)){
            map1.put("beginTime",beginTime);
        }
        if(endTime != null && !"".equals(endTime)){
            map1.put("endTime",endTime);
        }
        if(uname != null && !"".equals(uname)){
            map1.put("uname","%"+uname+"%");
        }
        if(curPage == null){
            curPage=(long) 1;
        }
        Page page = relationService.getPageDataRecord(curPage, 4, map1);
        map.put("page", page);
        return "Relation/ListRelationRecord";
    }

2.服务层代码(RelationService.java)

   //分页列出联系记录
    public Page getPageDataRecord(long curPage , long pageRows ,Map map){
        return relationDaoImpl.getPageDataRecord(curPage, pageRows, map);
    }

3.模型层代码(RelationDaoImpl.java)

   /**
     * 分页列出联系记录
     * @param curPage 当前页
     * @param pageRows 每页的行数
     * @param map 传给mybatis的参数Map
     * @return
     */
    public Page getPageDataRecord(long curPage , long pageRows ,Map map){
        //初始化Page
        Page page = new Page();

        //获取联系记录的总记录数
        long count = session.selectOne(Relation.class.getName()+".getCountRecord",map);

        //获取总页数=(总记录数+每页的行数-1)/每页的行数。如:总记录数为24条,每页的行数为4条,则共有:(24+4-1)/4=6页
        long allPage = (count+pageRows -1)/pageRows;

        //设置当前页
        if(curPage < 1)curPage = 1;//如果当前页小于1则设当前页为第1页
        if(allPage > 0 && curPage > allPage ) curPage = allPage;//如果当前页大于总页数则设当前页为总页数(即尾页)

        //将查询的开始记录偏移量、最大查询记录数放到map中
        map.put("start", (curPage -1)* pageRows);//查询记录的偏移量=(当前页-1)*每页的行数。如当前页为2,则查询记录的偏移量为(2-1)*4=4
        map.put("stop", pageRows);//最大查询数=每页的行数

        //获取联系记录数据
        List<Relation> dataList = session.selectList(Relation.class.getName()+".getDataListRecord",map);
        //设置page的当前页
        page.setCurPage(curPage);
        //设置page的每页的行数
        page.setPageRows(pageRows);
        //设置page的总页数
        page.setPageNum(allPage);
        //设置page的数据
        page.setDataList(dataList);
        //返回page
        return page;
    }

4.Mybatis的映射文件(Relation.xml)

4.1 获取联系记录的总记录数。即在getPageDataRecord方法中long count = session.selectOne(Relation.class.getName()+".getCountRecord",map);语句对应的xml文件中的SQL

 <!-- 获取联系记录的总记录数 -->
  <select id="getCountRecord" resultType="long" parameterType="Map">
      select count(*) from user u,relation r,linkman l,customer c where
       r.lid=l.lid and r.uid=u.uid and l.cid=c.cid
      <if test="beginTime != null">
        <![CDATA[AND redate >= #{beginTime}]]>
    </if>
    <if test="endTime != null">
        <![CDATA[AND redate <= #{endTime}]]>
    </if>
    <if test="uname != null">
        and username like #{uname}
    </if>
  </select>

4.2 获取联系记录数据。即在getPageDataRecord方法中List<Relation> dataList = session.selectList(Relation.class.getName()+".getDataListRecord",map);语句对应的xml文件中的SQL

<!-- 列出联系记录分页 -->
  <select id="getDataListRecord" resultMap="listRelation" parameterType="Map">
      select reid,r.lid,content,c.cid,cname,redate,nextdate,nextremark,l.lname,r.uid,u.username,
       l.phone,c.statues,c.address from user u,relation r,linkman l,customer c where
       r.lid=l.lid and r.uid=u.uid and l.cid=c.cid
      <if test="beginTime != null">
        <![CDATA[AND redate >= #{beginTime}]]>
    </if>
    <if test="endTime != null">
        <![CDATA[AND redate <= #{endTime}]]>
    </if>
    <if test="uname != null">
        and username like #{uname}
    </if>
      order by redate desc limit #{start},#{stop}
  </select>

说明:因为在控制器RelationController.java中有另一个分页方法,所以在模型层代码(RelationDaoImpl.java)中没有调用父类(BaseDaoImpl.java)的分页方法,下面贴一下此控制器中另一个分页方法——分页列出联系计划。

示例2:分页列出联系计划

1.控制器代码(RelationController.java)

   //分页列出联系计划
    @RequestMapping(value="toPage/customerPlan")
    public String listRelation(Map map,String beginTime,String endTime,
            String uname,Long curPage){
        Map<String,Object> map1 = new HashMap<String, Object>();
        if(beginTime!= null && !"".equals(beginTime)){
            map1.put("beginTime",beginTime);
        }
        if(endTime != null && !"".equals(endTime)){
            map1.put("endTime",endTime);
        }
        if(uname != null && !"".equals(uname)){
            map1.put("uname","%"+uname+"%");
        }
        if(curPage == null){
            curPage=(long) 1;
        }
        Page page = relationService.getRePlanList(curPage, 4, map1);
        map.put("page", page);
        return "Relation/listRelation";
    }

2.服务层代码(RelationService.java)

    //分页列出联系计划
    public Page getRePlanList(long curPage, long pageRows, Map map){
        return relationDaoImpl.getRePlanList(curPage,pageRows,map);
    }

3.模型层代码(RelationDaoImpl.java)

@Repository
public class RelationDaoImpl extends BaseDaoImpl<Relation>{
    //分页列出联系计划
    public Page getRePlanList(long curPage, long pageRows, Map map){
        return super.getPageData(curPage, pageRows, map);
    }

}

4.模型层代码(父类BaseDaoImpl.java)

public class BaseDaoImpl<T>  {
/**
     * 分页
     * @param curPage 当前页
     * @param pageRows 每页的条数
     * @param map
     * @return
     */
    public Page getPageData(long curPage , long pageRows ,Map map){
        Page page = new Page();

        long count = session.selectOne(clazz.getName()+".getCount",map);//获取数据的总条数
        long allPage = (count+pageRows -1)/pageRows;//根据每页的行数+总条数获取总页数

        //设置当前页
        if(curPage < 1)curPage = 1;//如果当前页小于1则设当前页的值为1
        if(allPage > 0 && curPage > allPage ) curPage = allPage;//如果当前页大于总页数则设当前页为总页数

        map.put("start", (curPage -1)* pageRows);//设置查询的起始值
        map.put("stop", pageRows);//设置返回的最大条数——即每页的行数

        //获取数据
        List<T> dataList = session.selectList(clazz.getName()+".getDataList",map);
        page.setCurPage(curPage);//当前页
        page.setPageRows(pageRows);//每页的行数
        page.setPageNum(allPage);//总页数
        page.setDataList(dataList);//数据

        return page;
    }

}

5.Mybatis的映射文件(Relation.xml)

5.1 获取联系计划的总记录数。即在getPageData方法中 long count = session.selectOne(clazz.getName()+".getCount",map);语句对应的xml文件中的SQL

<!-- 获取联系计划的总记录数 -->
  <select id="getCount" resultType="long" parameterType="Map">
      select count(*) from
      linkman l,relation r,customer c,user u where
      r.lid=l.lid and r.uid=u.uid and l.cid=c.cid and nextdate>now()
      <if test="beginTime != null">
        <![CDATA[AND nextdate >= #{beginTime}]]>
    </if>
    <if test="endTime != null">
        <![CDATA[AND nextdate <= #{endTime}]]>
    </if>
    <if test="uname != null">
        and username like #{uname}
    </if>
  </select>

5.2获取联系计划的数据。即在getPageData方法中 List<T> dataList = session.selectList(clazz.getName()+".getDataList",map);语句对应的xml文件中的SQL

  <!-- 获取联系计划分页数据 -->
  <select id="getDataList" resultMap="listRelation" parameterType="Map">
      Select reid,redate,content,nextdate, nextremark,u.uid,username,
      l.lid,l.lname,lsex,l.phone,c.cid,cname,c.statues,c.address from
      linkman l,relation r,customer c,user u where
      r.lid=l.lid and r.uid=u.uid and l.cid=c.cid and nextdate>now()
     <if test="beginTime != null">
        <![CDATA[AND nextdate >= #{beginTime}]]>
     </if>
     <if test="endTime != null">
        <![CDATA[AND nextdate <= #{endTime}]]>
     </if>
     <if test="uname != null">
        and username like #{uname}
     </if>
      order by nextdate desc limit #{start},#{stop}
  </select>
时间: 2024-12-14 10:30:04

Mybatis的分页查询的相关文章

Mybatis封装分页查询的java公用类

分页----对于数据量很大的查询中,是必不可少的.mybatis底层的分页sql语句由于需要我们自己去手动写.而实现分页显示的时候我们需要根据分页查询条件查询符合条件的总记录数和记录的详细情况.因此,若是不去实现封装一下的话,我们需要写两条SQL语句去实现它.一次用于查询记录数目.一次用于查询分页显示的详细记录.当项目中碰到很多需要分页的时候,我们便对于每一个Mapper.xml文件都需要去写两条SQL语句.极其麻烦,代码重用----必须重用.所以,一个公共方法的分页需求应运而生. 直接上分页公

Mybatis包分页查询java公共类

分页----对于数据量非常大的查询中.是不可缺少的. mybatis底层的分页sql语句因为须要我们自己去手动写.而实现分页显示的时候我们须要依据分页查询条件查询符合条件的总记录数和记录的具体情况.因此,若是不去实现封装一下的话,我们须要写两条SQL语句去实现它.一次用于查询记录数目.一次用于查询分页显示的具体记录. 当项目中碰到非常多须要分页的时候,我们便对于每个Mapper.xml文件都须要去写两条SQL语句. 极其麻烦.代码重用----必须重用.所以,一个公共方法的分页需求应运而生. 直接

spring-boot 集合mybatis 的分页查询

spring-boot 集合mybatis 的github分页查询 一.依赖包 <!-- mysql 数据库驱动. --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!-- spring-boot mybatis依赖: 请不要使用1.0.0版本,因为还不支持拦截器

mybatis之分页查询

1)StudentDao.java /** * 持久层*/ public class StudentDao { /** * 增加学生 */ public void add(Student student) throws Exception{ SqlSession sqlSession = MyBatisUtil.getSqlSession(); try{ sqlSession.insert("mynamespace.add",student); }catch(Exception e){

mybatis中分页查询

1 如果在查询方法中有多个参数,可以使用map对象将所有数据都存储进去.比如分页查询,需要用到两个参数,可以将这两个参数包装到map中. 例子:分页查询 dao层方法 public List<Student> getStudentPage(int pstart, int pnumber) throws Exception{ SqlSession sqlSession = MybatisUtil.getSqlSession(); Map<String,Integer> map = n

springboot多数据源动态切换和自定义mybatis件分页插

1.配置多数据源 增加druid依赖 完整pom文件 数据源配置文件 route.datasource.driver-class-name= com.mysql.jdbc.Driver route.datasource.url= jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8 route.datasource.username= root route.datasource.password= 1234

myBatis学习笔记(10)——使用拦截器实现分页查询

1. Page package com.sm.model; import java.util.List; public class Page<T> { public static final int DEFAULT_PAGE_SIZE = 20; protected int pageNo = 1; // 当前页, 默觉得第1页 protected int pageSize = DEFAULT_PAGE_SIZE; // 每页记录数 protected long totalRecord = -1

MyBatis系列:(4)分页查询

Emp.java package com.rk.entity; public class Emp {     private Integer id;     private String name;     private Double sal;     public Emp(){}          public Emp(Integer id, String name, Double sal) {         this.id = id;         this.name = name;

Mybatis+SpringMVC实现分页查询(附源码)

Maven+Mybatis+Spring+SpringMVC实现分页查询(附源码) 一.项目搭建 关于项目搭建,小宝鸽以前写过一篇Spirng+SpringMVC+Maven+Mybatis+MySQL项目搭建,这篇文章提供了详细的搭建过程,而且提供了源码下载,接下来的将在这个源码的基础上继续开发.所以建议各位猿友可以把猿友下载一下. 二.分页插件的介绍 博主采用的插件是PageHelper这个插件,使用起来十分方便.该插件支持以下数据库: Oracle Mysql MariaDB SQLite