您现在的位置是:首页 >技术教程 >【SpringBoot】MyBatis与MyBatis-Plus分页查询问题网站首页技术教程

【SpringBoot】MyBatis与MyBatis-Plus分页查询问题

小白的救赎 2024-06-12 18:01:02
简介【SpringBoot】MyBatis与MyBatis-Plus分页查询问题

        笔者写这篇博客是因为近期遇到的关于两者之间的分页代码差距,其实之前也遇见过但是没有去整理这篇博客,但由于还是被困扰了小一会儿时间,所以还是需要加深记忆。其实会看前后端传参解决这个问题很快、不麻烦。关于这两个框架的分页代码问题主要就是在业务层和MyBatis的SQL问题。注意:这里我不展示前端接口,需要知道的是前端会传给后端当前页(page)以及每页条数(size)。后端根据两个参数去实现分页(limit)

MyBatis

        那么关于MyBatis这个半ORM框架来说,SQL还是需要自己去写在xml中的或者是在注解上实现。这里我就采用xml种实现的方式去实现啦。为了减少代码量(真实开发不能这样的哈),我就将所有业务代码都放到控制层中。

引入依赖

<!--MyBatis框架-->
<dependency>
	<groupId>org.mybatis.spring.boot</groupId>
	<artifactId>mybatis-spring-boot-starter</artifactId>
	<version>2.2.2</version>
</dependency>
<!--JDBC驱动-->
<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<version>8.0.31</version>
</dependency>
<!--MyBatis的分页插件PageHelper -->
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.2.12</version>
</dependency>

修改yml

server:
  port: 8080

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/table?characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: 123456

mybatis:
  mapper-locations: classpath:mapper/*.xml  # 对应xml的位置
  type-aliases-package: com.chf.entity  # 对应namespace的实体类包名
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl  # 日志类型
    map-underscore-to-camel-case: true  # 字段与属性的驼峰规则

# MyBatis的分页插件 这是最重要的
pagehelper:
  helper-dialect: mysql
  reasonable: true
  support-methods-arguments: true
  params: count=countsql

业务代码

@RestController
@RequestMapping("/emp")
public class EmpController{
   
    //@Autowired
    //private EmpService empService; 
    // 为了博客简化代码量 所以直接调用Dao层接口
    @Autowired
    private EmpMapper empMapper;

    /**
     * 分页查询
     * @param currentPage 当前页数
     * @param pageSize 每页条数
     * @return
     */
    @GetMapping("/findAll/{page}/{size}")
    public R findAll(@PathVariable("page") Integer currentPage, @PathVariable("size") Integer pageSize){
        Integer page = (currentPage - 1) * pageSize;
        List<Emp> empList = empMapper.selectByPage(page, pageSize);
        PageInfo<Emp> pageInfo = new PageInfo<>(empList);
        pageInfo.setTotal(empMapper.selectCount());
        return R.ok(pageInfo);
    }
}
@Mapper
public class EmpMapper{
    List<Emp> selectByPage(@Param("page") Integer currentPage,
                           @Param("size") Integer pageSize);
    Integer selectCount();
}

SQL

<!--返回前端的分页信息 这里的数据表字段名有点不规范-->
<select id="selectByPage" resultType="Emp">
    select
        id,name,sex,idcard,phonenum,depart
    from
        emp
    limit
        #{page},#{size}
</select>

<!--返回前端的总记录条数-->
<select id="selectCount" resultType="java.lang.Integer">
    select
        count(*)
    from
        emp
</select>

测试返回数据

        返回的分页信息是在data中的list

MyBatis-Plus

引入依赖

<!--整合MyBatis
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.3</version>
</dependency>
-->
<!--
	这里需要注意哈:如果使用了MyBatis-Plus的话就不能引入MyBatis依赖 否则会报错
    可能也不是因为两个不能互存 只是版本之间产生了依赖 报错原因如下图所示
-->
<!--数据源配置-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.22</version>
</dependency>
<!--MyBatis-Plus-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.4.3</version>
</dependency>
<!--JDBC-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.17</version>
</dependency>

修改yml

server:
  port: 8080

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/table?characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: 123456

mybatis-plus:
  mapper-locations: classpath:mapper/*.xml  # 对应xml的位置
  type-aliases-package: com.chf.entity  # 对应namespace的实体类包名
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl  # 日志类型
    map-underscore-to-camel-case: true  # 字段与属性的驼峰规则

业务代码

@RestController
@RequestMapping("/emp")
public class EmpController{
   
    @Autowired
    private EmpService empService; 

    /**
     * 分页查询
     * @param currentPage 当前页数
     * @param pageSize 每页条数
     * @return
     */
    @GetMapping("/findAll/{page}/{size}")
    public R findAll(@PathVariable("page") Integer currentPage, @PathVariable("size") Integer pageSize){
        Page<Emp> page = new Page<>(currentPage,pageSize);
        // 此方法还可以传入第二个参数:QueryWrapper条件构造器
        // 用于增添一些查询条件用的 这里就不做展示了
        empService.page(page);
        return R.ok(page);
    }
}
public interface EmpService extends IService<Emp> {
}
@Service
public class EmpServiceImpl extends ServiceImpl<EmpMapper,Emp> implements EmpService {
}
@Mapper
public interface EmpMapper extends BaseMapper<Emp> {
}

测试返回数据

        可以看到在MyBatis-Plus返回前端的参数中使用records封装分页信息。看到这里以为结束了吗?仔细看total(总条数)会发现怎么会是0?还有pages(总页数)也是0,学过MyBatis-Plus应该都知道为了完成分页所以还需要配置分页插件才可以实现真正的分页。所以需要再添加一个配置类,代码如下:

@Configuration
public class MyBatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return mybatisPlusInterceptor;
    }
}

         添加好分页插件再次查询接口就会看到总条数和总页数都是真实的数值了。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。