MyBatis-Plus使用自定义xml查询并分页

在MyBatis-Plus的基础上加载自定义的xml且分页

一、Mapper接口和xml编写

注意事项:

  1. 此处mapper接口根据官网文档 可以集成BaseMapper 也可不继承
  2. 传递参数 Page 即自动分页,必须放在第一位
  3. 对象类参数要加@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
在这里插入图片描述

八、总结

  1. 主要是注意mapper接口的分页参数要放到第一位
  2. 对象类型的参数要添加@Param注解 且value值要和xml #{ user.xxx}对应
  3. 当mapper文件存在jar内部时,要把mapper-locations配置为 classpath*:/mapper/**.xml
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐