利用java反射解决Mybatis Pagehelper插件联表查询分页不准确的问题(二)

简介: 利用java反射解决Mybatis Pagehelper插件联表查询分页不准确的问题

CompanyWhere 源码:

package com.easy.xdo;
import lombok.Data;
@Data
public class CompanyWhere extends CompanyDO{
  /**
     * page -1 默认不分页
     */
    private int page;
    private int rows;
    private int startrow;
    private String suffix;
}

CompanyParam 源码:


package com.easy.xdo;
import lombok.Data;
@Data
public class CompanyParam {
  private CompanyDO xdo;
  private CompanyWhere where;
}

EmployeDO源码:

package com.easy.xdo;
import lombok.Data;
@Data
public class EmployeDO {
    //演示员工类
  private String id;
  private String name;
  private String age;
  private String companyid;
}

CompanyController源码:

package com.easy.controller;
import io.swagger.annotations.Api;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.easy.service.CompanyService;
import com.easy.util.PageUtil;
import com.easy.xbo.PageBO;
import com.easy.xdo.CompanyParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import io.swagger.annotations.ApiOperation;
@Api("API-公司接口")
@RestController
@RequestMapping("api/v1/company")
public class CompanyController {
  @Autowired
    private CompanyService companyService;
  @ApiOperation(value = "分页查询")
    @PostMapping("/page")
    public PageBO page() throws Exception{
    CompanyParam param=new CompanyParam();
        return PageUtil.getPageBOData(companyService,param);
    }
}

CompanyService 源码:

package com.easy.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import com.easy.dao.CompanyDAO;
import com.easy.xdo.CompanyDO;
import com.easy.xdo.CompanyParam;
public class CompanyService {
  @Autowired
  private CompanyDAO companyDAO;
  public List<CompanyDO> selectPage(CompanyParam param){
        return companyDAO.selectList(param);
    }
    public int selectCount(CompanyParam param){
        return companyDAO.selectCount(param);
    }
}


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.easy.dao.CompanyDAO">
  <resultMap id="BaseResultMap" type="com.easy.xdo.CompanyDO">
    <id column="id" property="id" />
    <result column="name" property="name" />
    <result column="address" property="address" />
    <collection property="employes" ofType="com.easy.xdo.EmployeDO">
      <id column="eid" property="id" />
      <result column="ename" property="name"/>
      <result column="age" property="age"/>
    </collection>
  </resultMap>
  <sql id="sqlBase">
     c.id,c.name,c.address,e.id as eid,e.name as ename,e.age 
  </sql>
  <sql id="WhereModelSql">
    <if test="where != null">
      <where>
        <if test="where.id != null and where.id != ''"> AND c.id=#{where.id} </if>
        <if test="where.name != null and where.name != ''"> AND c.name=#{where.name} </if>
        <if test="where.address != null and where.address != ''"> AND c.address=#{where.address} </if>
      </where>
    </if>
  </sql>
  <select id="selectList" resultMap="BaseResultMap" parameterType="com.easy.xdo.CompanyParam">
    select
    <include refid="sqlBase" />
    from company c left join employe e on  c.id=e.companyid  
    where c.id in (select page.id from (select id from company 
    <include refid="WhereModelSql" />  limit #{where.startrow},#{where.rows})
    page)
  </select>
  <select id="selectCount" resultType="java.lang.Integer" parameterType="com.easy.xdo.CompanyParam">
    select
    count(c.id)
    from company
    <include refid="WhereModelSql" />
  </select>
</mapper>

这里特殊说明一下in语句子语句中不能使用limit,但是孙语句中可以使用,很蛋疼所以多包了一层,sql语句这里大家可以根据自己的情况随意写,只要最后传参进去出来的数据准确就ok了


相关文章
|
4天前
|
SQL XML Java
8、Mybatis-Plus 分页插件、自定义分页
这篇文章介绍了Mybatis-Plus的分页功能,包括如何配置分页插件、使用Mybatis-Plus提供的Page对象进行分页查询,以及如何在XML中自定义分页SQL。文章通过具体的代码示例和测试结果,展示了分页插件的使用和自定义分页的方法。
8、Mybatis-Plus 分页插件、自定义分页
|
6天前
|
前端开发 Java 数据库连接
一天十道Java面试题----第五天(spring的事务传播机制------>mybatis的优缺点)
这篇文章总结了Java面试中的十个问题,包括Spring事务传播机制、Spring事务失效条件、Bean自动装配方式、Spring、Spring MVC和Spring Boot的区别、Spring MVC的工作流程和主要组件、Spring Boot的自动配置原理和Starter概念、嵌入式服务器的使用原因,以及MyBatis的优缺点。
|
6天前
|
SQL Java 数据库连接
后端框架的学习----mybatis框架(5、分页)
这篇文章介绍了如何在MyBatis框架中实现分页功能,包括使用SQL的`limit`语句进行分页和利用MyBatis的`RowBounds`对象进行分页的方法。
|
5天前
|
Java 数据库 Spring
MyBatisPlus分页插件在SpringBoot中的使用
这篇文章介绍了如何在Spring Boot项目中配置和使用MyBatis-Plus的分页插件,包括创建配置类以注册分页拦截器,编写测试类来演示如何进行分页查询,并展示了测试结果和数据库表结构。
MyBatisPlus分页插件在SpringBoot中的使用
|
11天前
|
XML Java 数据库连接
Mybatis java.lang.NumberFormatException: For input string: "1,2" 问题处理
【8月更文挑战第9天】Mybatis java.lang.NumberFormatException: For input string: "1,2" 问题处理
|
22天前
|
SQL 关系型数据库 Java
mybatis-分页
1. MyBatis RowBounds分页:先查询所有结果,再进行内存分页。 2. PageHelper插件:自动识别数据库类型并添加对应分页关键字,分两步执行:添加分页查询,然后查询总数。 3. SQL分页:直接在SQL中使用`LIMIT`或`ROWNUM`等进行分页。 4. 数组分页:DAO层查询所有数据,Service层通过`subList`方法实现分页。 5. 拦截器分页:自定义拦截器对特定方法进行拦截,并在SQL语句中添加分页参数。 6. 总结:逻辑分页适合小数据量,物理分页适合大数据量避免内存溢出。物理分页优于逻辑分页。
|
5天前
|
SQL Java 数据库连接
后端框架的学习----mybatis框架(5、分页)
这篇文章介绍了如何在MyBatis框架中实现分页功能,包括使用SQL的`limit`语句进行分页和利用MyBatis的`RowBounds`对象进行分页的方法。
|
1月前
|
SQL 缓存 Java
使用MyBatis优化Java持久层操作
使用MyBatis优化Java持久层操作
|
1月前
|
SQL Java 数据库连接
Java面试题:简述ORM框架(如Hibernate、MyBatis)的工作原理及其优缺点。
Java面试题:简述ORM框架(如Hibernate、MyBatis)的工作原理及其优缺点。
31 0
|
1月前
|
SQL 缓存 Java
使用MyBatis优化Java持久层操作
使用MyBatis优化Java持久层操作