MyBatis-Plus使用自定义xml查询并分页
在MyBatis-Plus的基础上加载自定义的xml且分页
一、Mapper接口和xml编写
注意事项:
- 此处mapper接口根据官网文档 可以集成BaseMapper 也可不继承
- 传递参数 Page 即自动分页,必须放在第一位
- 对象类参数要加@Param注解;value值要和xml中 #{user.user_name} 保持一致
@Mapper
public interface UserMapper extends BaseMapper<User>{
public Page<User> listUser(Page<User> page,@Param("user") User user);
}
<?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.ch.mapper.UserMapper">
<select id="listUser" parameterType="com.ch.vo.User" resultType="com.ch.vo.User">
select * from user where 1=1
<if test="user.user_name!=null and user.user_name !=''">
and user_name like '%'#{user.user_name}
</if>
<if test="user.age!=null and user.age !=''">
<![CDATA[
and age > #{user.age}
]]>
</if>
</select>
</mapper>
二、yml配置
server:
port: 8080
spring:
datasource:
username: root
password: 1234
#指定时区和编码参数
url: jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai&characterEncoding=utf-8&useSSL=false
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis-plus:
configuration:
# 关闭驼峰命名
map-underscore-to-camel-case: false
mapper-locations:
#此处注意classpath后面要加* 表示加载多个jar下的xml
- classpath*:/mapper/**.xml
三、分页插件的配置
@Configuration
public class MybatisPlusConfig {
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
// 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求
// 默认false 为false时 会返回空数据
paginationInterceptor.setOverflow(true);
// 设置最大单页限制数量,默认 500 条,-1 不受限制
// paginationInterceptor.setLimit(500);
// 开启 count 的 join 优化,只针对部分 left join
paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
return paginationInterceptor;
}
}
四、User实体类
此处使用了lombok插件
@Getter
@Setter
@TableName("user")
public class User {
@TableId(value = "id")
private Long id;
@TableField(value = "user_name")
private String user_name;
@TableField(value = "addr")
private String addr;
@TableField(value = "age")
private Integer age;
@TableField(value = "password")
private String password;
}
五、Service接口及实现类
public interface IUserService extends IService<User>{
/**
* 自定义xml分页查询
* @param page
* @param user
* @return
*/
public Page<User> listUser(Page<User> page,User user);
}
@Service("userService")
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService{
@Override
public Page<User> listUser(Page<User> page, User user) {
return getBaseMapper().listUser(page, user);
}
}
六、Controller代码
此处只是测试直接new一个Page对象,current表示当前第几页,10 为每页显示的条数据
@RestController
public class UserController {
@Autowired
private IUserService userService;
@GetMapping("/user/list")
public ReturnResult<?> list(User user,Long current){
Page<User> page=new Page<>(current, 10);
return ReturnResult.ok(userService.listUser(page, user));
}
}
七、运行测试
启动服务访问 http://localhost:8080/user/list?current=1
八、总结
- 主要是注意mapper接口的分页参数要放到第一位
- 对象类型的参数要添加@Param注解 且value值要和xml #{user.xxx}对应
- 当mapper文件存在jar内部时,要把mapper-locations配置为
classpath*:/mapper/**.xml