1.mysql中分页用limit,但是limit后面不能跟表达式 ,错误表达式:limit (1-1)*10,10。 2.对象中提供分页数据的方法。 备注:limit a,b 表示从第a+1条开始取,本次一共取b条 如limit 0,10:取第1-10条数据,如 limit 25,8:去第26-33条数据。
application.properties数据库Mysql配置
#数据库配置 spring.datasource.url=jdbc:mysql://localhost:3306/xxxxxx?serverTimezone=UTC spring.datasource.username= xxxx spring.datasource.password= xxxx spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver #mybatis的mapper书写路径 mybatis.mapper-locations=classpath:mapper/*/*.xmlpom依赖
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.2</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency>分页对象: 主要看pageNo 、pageSize 、startNum,这里给页码和条数附初始值。有@Data在可以自动实现set和get
import lombok.Data; import java.util.Date; @Data public class BaseModel { /** * 上游系统唯一系统标识号 12位系统号 **/ private String upSystemId; /** * 上游系统唯一流水号 21位 **/ private String upSystemSeqNo; /** * 上游系统 请求日期 2020-10-20 **/ private Date tranDate; /** * 上游系统 操作人 12位 **/ private String userId; /** * 主键ID **/ private String id; /** * 创建时间 **/ private Date createTime; /** * 更新时间 **/ private Date updateTime; /** * 当前页,需要查询的页数 * pageNo从1开始 */ private int pageNo = 0; /** * 每页显示的条数 */ private int pageSize = 10; /** * 当前页,需要查询的页数 * pageNo从1开始 */ private int startNum; /** * 设置分页查询数据 */ public void setPageQuery() { this.startNum = this.getPageNo() > 0 ? (this.getPageNo() - 1) * this.getPageSize() : 0; }在调用sql前,设置分页数据:model.setPageQuery(); 备注:该对象继承了BaseModel ,所以子类可以直接调用父类的方法。
@BaseBeforeAnnotation @RequestMapping("selectReaderCardList") public BaseResponse selectReaderCardList(@RequestBody ReaderCardInfoModel model) { model.setPageQuery(); List<ReaderCardInfoModel> bookInfoModel = readerCardInfoService.selectReaderCardList(model); return new BaseResponse(ResultEnum.SUCCESS,bookInfoModel); }mapping.xml中的分页查询sql: 主要看这段,pageNo>0表示是分页查询,不是全量查询。 startNum表示从第startNum+1条数据开始取数据,startNum在setPageQuery()方法中赋值了。 pageSize表示取多少条数据。
<if test="pageNo > 0"> limit #{startNum}, #{pageSize} </if> <select id="selectReaderCardList" parameterType="com.example.demo.executer.readerCardInfo.model.ReaderCardInfoModel" resultMap="BaseResultMap"> select id, reader_id, usable_flag, card_amt, bind_date, remark, create_time, update_time from t_reader_card <where> <if test="usableFlag != null"> and usable_flag = #{usableFlag} </if> <if test="bindDate != null"> and bind_date = #{bindDate} </if> <if test="readerId != null"> and reader_id = #{readerId} </if> </where> order by create_time desc <if test="pageNo > 0"> limit #{startNum}, #{pageSize} </if> </select>postman请求参数 查询第3页的4条数据,limit 8,4
管理台日志打印 后台在接收到请求时,生成ReaderCardInfoController对象时,会自动生成
: ----------------------------------------------------------------------------------------------------start : ------BaseBeforeAspect---获取到请求参数------ : ---入口方法:com.example.demo.executer.readerCardInfo.controller.ReaderCardInfoController : ---请求方法:selectReaderCardList : ---请求参数:{"pageNo":3,"pageSize":4,"startNum":0,"usableFlag":"0"} : ==> Preparing: select id, reader_id, usable_flag, card_amt, bind_date, remark, create_time, update_time from t_reader_card WHERE usable_flag = ? order by create_time desc limit ?, ? : ==> Parameters: 0(String), 8(Integer), 4(Integer) : <== Total: 4 : ---commonAfter返回参数: {"code":"000000","data":[ {"createTime":1603295662000,"id":"202010211554221000048","pageNo":0,"pageSize":10,"remark":"新建卡","startNum":0,"updateTime":1603295662000}, {"createTime":1603295662000,"id":"202010211554221000049","pageNo":0,"pageSize":10,"remark":"新建卡","startNum":0,"updateTime":1603295662000}, {"createTime":1603295661000,"id":"202010211554211000045","pageNo":0,"pageSize":10,"remark":"新建卡","startNum":0,"updateTime":1603295661000}, {"createTime":1603295661000,"id":"202010211554211000046","pageNo":0,"pageSize":10,"remark":"新建卡","startNum":0,"updateTime":1603295661000} ],"msg":"交易成功"} : ----------------------------------------------------------------------------------------------------end"} : ----------------------------------------------------------------------------------------------------end有个想法,不想再方法中调用model.setPageQuery(),想自动完成这个步骤。 分页对象写成以下两种,并在调用处去掉model.setPageQuery();
/** * 当前页,需要查询的页数 * pageNo从1开始 */ private int startNum = this.getPageNo() > 0 ? (this.getPageNo() - 1) * this.getPageSize() : 0; // private int startNum = 0; /** * 设置分页查询数据 */ public void setPageQuery() { this.startNum = this.getPageNo() > 0 ? (this.getPageNo() - 1) * this.getPageSize() : 0; } public BaseModel(){ setPageQuery(); } @BaseBeforeAnnotation @RequestMapping("selectReaderCardList") public BaseResponse selectReaderCardList(@RequestBody ReaderCardInfoModel model) { // model.setPageQuery(); List<ReaderCardInfoModel> bookInfoModel = readerCardInfoService.selectReaderCardList(model); return new BaseResponse(ResultEnum.SUCCESS,bookInfoModel); }结果是:不得行。嘿嘿,暂时未想到好的方法。
此分页方法是自己结合公司项目写的,有不足的地方欢迎大家指正。