大家好,又见面了,我是你们的朋友全栈君。
java实现mysql分页查询
1.前言
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/*/*.xml
pom依赖
<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>
2.java分页对象类
分页对象: 主要看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);
}
3. Mybatis–Mapping.xml
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>
4.请求与执行结果
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);
}
结果是:不得行。嘿嘿,暂时未想到好的方法。
此分页方法是自己结合公司项目写的,有不足的地方欢迎大家指正。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/129338.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...