MyBatis Plus 实现简单分页(拓展性强
1、导入 MyBatis Plus 相关依赖
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>
<!-- 需要 mybatis plus 的注解 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-annotation</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.2</version>
</dependency>
2、配置分页拦截器(核心)
@Configuration
@MapperScan("xx.xx.mapper")
public class MyBatisPlusConfig {
//分页拦截器
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
paginationInnerInterceptor.setOverflow(true); //合理化
interceptor.addInnerInterceptor(paginationInnerInterceptor);
return interceptor;
}
}
3、entity 实体类, 根据自己的需求
@Getter
@Setter
@TableName("t-user")
public class User implements Serializable {
@TableId(type = IdType.AUTO)
private Long id;
private String name; //姓名
private String nickname; //昵称
private String sex; //性别
private String phone; //联系电话
private String email; //邮箱
}
4、封装查询对象, 根据自己需求进行封装
@Getter
@Setter
public class BaseQuery {
private Integer currentPage = 1;
private Integer pageSize = 10;
private String keyword;
public Integer getStart() {
return (currentPage - 1) * pageSize;
}
}
5、Mapper接口使用 MyBatis plus 一定要 继承 BaseMapper并指明泛型, 注意!!! 一定要贴上 @MapperScan(“xx.xx.mapper”) mapper 扫描器
public interface UserMapper extends BaseMapper<User> {
}
6、业务层接口
public interface IUserService extends IService<User> {
Page<User> queryPage(BaseQuery qo);
}
7、业务层接口实现类, 一定要贴上 @Service 注解, 交给 sping 容器进行管理
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
@Override
public Page<User> queryPage(BaseQuery qo) {
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>()
.like(StringUtils.hasLength(qo.getKeyword()), User::getName, qo.getKeyword());
return super.page(new Page<>(qo.getCurrentPage(), qo.getPageSize()), wrapper);
}
}
8、Controller控制层调用业务层 UserServiceImpl 中分页方法
@RestController
@RestMapping("/users")
public class UserController {
@Autowired
private IUserService userService;
@GetMapping("/query")
public AjaxResult<?> query(BaseQuery qo) {
Page<User> page = userService.queryPage(qo);
return AjaxResult.success(page);
}
}
9、统一结果响应处理对象
/**
* 统一结果响应对象
* @param <T> 相应的 data 属性数据类型
*/
public class AjaxResult<T> extends HashMap<String, Object> {
public static final Integer DEFAULT_SUCCESS_CODE = HttpStatus.OK;
public static final String DEFAULT_SUCCESS_MSG = "success";
public static final Integer DEFAULT_FAILED_CODE = HttpStatus.SERVER_ERROR;
public static final String DEFAULT_FAILED_MSG = "error";
public static final String CODE_NAME = "code";
public static final String MSG_NAME = "msg";
public static final String DATA_NAME = "data";
public AjaxResult(Integer code, String msg, T data) {
super.put(CODE_NAME, code);
super.put(MSG_NAME, msg);
// 当 data 没有数据的时候,就没有属性
// 完整数据结构: {code: 200, msg: "xxx", data: {xxx}}
// 没有 data: {code: 200, msg: "xxx"}
if (data != null) {
super.put(DATA_NAME, data);
}
}
public AjaxResult(Integer code, String msg) {
this(code, msg, null);
}
public static <T> AjaxResult<T> success(String msg, T data) {
return new AjaxResult<>(DEFAULT_SUCCESS_CODE, msg, data);
}
public static <T> AjaxResult<T> success(T data) {
return success(DEFAULT_SUCCESS_MSG, data);
}
public static <T> AjaxResult<T> success(String msg) {
return success(msg, null);
}
public static <T> AjaxResult<T> success() {
return success(DEFAULT_SUCCESS_MSG);
}
public static <T> AjaxResult<T> failed(Integer code, String msg, T data) {
return new AjaxResult<>(code, msg, data);
}
public static <T> AjaxResult<T> failed(Integer code, String msg) {
return failed(code, msg, null);
}
public static <T> AjaxResult<T> failed(String msg) {
return failed(DEFAULT_FAILED_CODE, msg);
}
public static <T> AjaxResult<T> failed(Wolf2wException ex) {
return failed(ex.getCode(), ex.getMessage());
}
public static <T> AjaxResult<T> failed() {
return failed(DEFAULT_FAILED_MSG);
}
/**
* 向 map 中链式添加元素
* @param key 添加元素的 key
* @param value 添加元素的 value
* @return 当前的 map 对象, 以便于链式编程
*/
public AjaxResult<?> put(String key, Object value) {
super.put(key, value);
return this;
}
}