一、MyBatis
1、依赖
<!-- 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>
2、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
3、实现
@RestController
@RequestMapping("/emp")
public class EmpController{
//@Autowired
//private EmpService empService;
// 为了博客简化代码量 所以直接调用Dao层接口
@Autowired
private EmpMapper empMapper;
/**
* 分页查询
* @param pageNum 当前页数
* @param pageSize 每页条数
* @return
*/
@GetMapping("/findAll/{page}/{size}")
public R findAll(@PathVariable("page") Integer pageNum, @PathVariable("size") Integer pageSize){
Integer page = (pageNum - 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 pageNum,
@Param("size") Integer pageSize);
Integer selectCount();
}
<!--返回前端的分页信息 这里的数据表字段名有点不规范-->
<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>
二、MyBatis-Plus
1、依赖
<!--整合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>
2、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 # 字段与属性的驼峰规则
3、实现
@RestController
@RequestMapping("/emp")
public class EmpController{
@Autowired
private EmpService empService;
/**
* 分页查询
* @param pageNum 当前页数
* @param pageSize 每页条数
* @return
*/
@GetMapping("/findAll/{page}/{size}")
public R findAll(@PathVariable("page") Integer pageNum, @PathVariable("size") Integer pageSize){
Page<Emp> page = new Page<>(pageNum, pageSize);
// 此方法还可以传入第二个参数:QueryWrapper条件构造器
// 用于增添一些查询条件用的 这里就不做展示了
empService.page(page);
// 如果是调用数据访问层的就是selectPage()方法即以下语句
// mapper.selectPage(page, QueryWrapper);
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> {
}
4、测试返回数据
可以看到在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;
}
}
三、PageHelper
其实MyBatis底层就是调用Github的PageHelper插件工具。但是如果直接使用Github的分页的话会更加简便,但是有一个坑。只需要将上面MyBatis的业务代码改为以下代码块。相比而言,代码行数一致。多了一句PageMethod.startPage()、少了一句设置总条数的语句。
@RestController
@RequestMapping("/emp")
public class EmpController{
//@Autowired
//private EmpService empService;
// 为了博客简化代码量 所以直接调用Dao层接口
@Autowired
private EmpMapper empMapper;
/**
* 分页查询
* @param pageNum 当前页数
* @param pageSize 每页条数
* @return
*/
@GetMapping("/findAll/{page}/{size}")
public R findAll(@PathVariable("page") Integer pageNum, @PathVariable("size") Integer pageSize){
// 由于PageHelper继承PageMethod但未重写方法 所以写成下面的语句
Page<Object> page = PageMethod.startPage(pageNum, pageSize);
// 获取查询出的列表
List<Emp> empList = empMapper.selectByPage(page, pageSize);
PageInfo<Emp> pageInfo = new PageInfo<>(empList);
// pageInfo.setTotal(empMapper.selectCount());
// 此时page已经有列表信息、与总条数了 无需再一条SQL查询总条数
return R.ok(page);
}
}
这里的踩坑处就是Page对象一定要在想要查询的列表前先初始出来,否则过滤无效。这样子Paga中的列表信息才是我们想要的查询出来的信息