MyBatis自动分页实现
mybatis分页查询sql语句

mybatis分页查询sql语句在 MyBatis 中,可以通过以下方式实现分页查询:方式一:使用 RowBounds 参数来实现分页在使用 select 语句查询数据时,在 sqlSession.select() 方法调用时可以通过 RowBounds 参数进行分页查询。
例如:List<User> users = sqlSession.selectList("getUserList", null, new RowBounds(5, 10));上面的查询语句表示从第 6 条记录开始,查询 10 条记录,即查询结果为第 6 条记录到第 15 条记录之间的数据。
方式二:使用 Limit 限制查询结果数量在使用 select 语句查询数据时,使用 Limit 语句限制查询结果数量,可以实现分页查询。
例如:<select id="getUserListByLimit" resultType="User">select * from user limit #{offset}, #{limit}</select>上面的语句使用 Limit 限制查询结果为从第 offset 条记录开始,最多返回 limit 条记录。
这里 #{offset} 和 #{limit} 是通过方法参数传递的两个值。
在 Java 代码中,需要通过以下方式传递这两个参数:List<User> users = sqlSession.selectList("getUserListByLimit", null, new RowBounds(offset, limit));其中,offset 和 limit 分别表示从第几条记录开始查询,查询的记录数。
通过以上两种方式可以实现 MyBatis 的分页查询,根据实际场景选择合适的方式即可。
MybatisPlus自定义方法实现分页

MybatisPlus自定义方法实现分页MyBatis Plus是一款基于MyBatis的强大ORM(Object Relational Mapping)框架,提供了很多方便的功能和特性,其中包括分页查询功能。
虽然MyBatis Plus已经提供了默认的分页查询方法,但有时我们可能需要自定义一些分页查询的方法来满足特定的需求。
下面将介绍如何使用MyBatis Plus来自定义方法实现分页查询。
首先,我们需要在项目中引入MyBatis Plus的依赖。
可以在`pom.xml`文件中添加以下依赖:```xml<dependency><artifactId>mybatis-plus-boot-starter</artifactId><version>最新版本</version></dependency>```接下来,我们需要定义一个Mapper接口,在该接口中添加自定义的分页查询方法。
可以在Mapper接口中定义一个方法,参数为`Page`对象和其他查询条件,返回值为`IPage`对象。
```javaimport org.apache.ibatis.annotations.Param;import java.util.List;public interface UserMapper extends BaseMapper<User>```然后,在对应的Mapper.xml文件中编写SQL语句来实现分页查询。
可以使用MyBatis的分页插件`PageHelper`来完成分页查询。
在Mapper.xml中添加以下代码:```xmlSELECT * FROM user WHERE name LIKE CONCAT('%',#{name},'%') </select>```在这个例子中,我们使用`SELECT * FROM user`查询所有符合条件的记录。
mybatis-plus分页page写法

MyBatis-Plus 是一个MyBatis 的增强工具,在MyBatis 的基础上只做增强不做改变,为简化开发和提高效率而生。
MyBatis-Plus 提供了一种更为便捷的接口式编程方式,并封装了MyBatis 的常见操作,使得开发更为简单。
在MyBatis-Plus 中,分页功能可以通过`Page` 对象来实现。
以下是一个简单的例子:```java// 创建Page 对象Page<User> page = new Page<>(1, 10); // 第1页,每页显示10条// 设置查询条件page.add(new QueryWrapper<User>().eq("name", "old"));// 执行分页查询IPage<User> userPage = userMapper.selectPage(page, null);// 获取分页信息userPage.getMeta().setTotal(userMapper.selectCount(newQueryWrapper<User>().eq("name", "old")));// 获取数据列表List<User> userList = userPage.getRecords();```在这个例子中,我们首先创建了一个`Page` 对象,设置了要查询的页码和每页显示的条数。
然后,我们通过`QueryWrapper` 设置了查询条件。
接着,我们执行了分页查询,得到了一个`IPage` 对象。
最后,我们通过`IPage` 对象获取了分页信息和数据列表。
注意,这里的`userMapper` 是MyBatis-Plus 自动生成的Mapper 接口的实例。
如果你没有使用MyBatis-Plus 的自动生成功能,你需要自己创建Mapper 接口和实现类。
mybatis分页插件的原理

mybatis分页插件的原理Mybatis分页插件是一款非常实用的插件,它可以帮助我们在使用Mybatis进行数据库操作时,轻松地实现分页功能。
下面就让我们来了解一下Mybatis分页插件的原理吧。
一、概述Mybatis分页插件是一款基于拦截器机制实现的插件,它可以在执行数据库操作时拦截SQL语句,自动将SQL语句进行改写,从而实现分页功能。
二、核心原理1. 拦截器机制Mybatis中的拦截器机制是指,在执行数据库操作时,可以通过自定义拦截器对SQL语句进行拦截和处理。
Mybatis提供了一个Interceptor接口,只要实现该接口并配置到mybatis-config.xml文件中即可使用。
2. 分页插件实现原理在Mybatis中使用分页插件的原理如下:(1)首先,在mybatis-config.xml文件中配置分页插件。
(2)当执行查询操作时,拦截器会对SQL语句进行拦截,并根据传入的参数自动将SQL语句进行改写,添加limit和offset关键字。
(3)最后将改写后的SQL语句交给Mybatis执行。
三、具体步骤1. 配置分页插件在mybatis-config.xml文件中添加以下代码:```xml<plugins><plugininterceptor="com.github.pagehelper.PageInterceptor"><property name="dialect" value="mysql"/></plugin></plugins>其中,com.github.pagehelper.PageInterceptor是Mybatis分页插件的拦截器类,dialect属性指定了数据库类型。
2. 分页查询在进行分页查询时,需要使用PageHelper.startPage()方法来设置分页参数。
mybatis的分页插件的原理

mybatis的分页插件的原理
Mybatis的分页插件原理
_________________
Mybatis的分页插件可以实现数据库的分页查询,是Mybatis的重要功能之一。
它的实现原理可以分为三个步骤:
### 一、Sql语句拦截
Mybatis分页插件通过拦截Sql语句实现分页,首先会判断当前传入的参数是否为PageHelper.startPage类型,如果是,则开始拦截Sql语句,然后会对参数进行处理,将当前页码和每页显示的条数加入到Sql语句中。
### 二、查询总数
Mybatis分页插件在拦截Sql语句后,会对当前查询语句进行处理,将原来的查询语句转换成一个查询总数的语句,然后根据原来的查询条件进行查询,获得总数。
### 三、执行真正的查询
Mybatis分页插件在获得总数之后,再根据当前页码和每页显示的条数进行处理,转换成真正的查询语句,然后执行查询,获得最终的结果集。
### 四、组装结果集
Mybatis分页插件在获得最终的结果集后,会将总数、当前页码和当前查询出来的结果集封装在PageInfo对象中,然后返回给用户。
以上就是Mybatis分页插件的实现原理,它通过拦截Sql语句实现分页,然后再获得总数和最终的结果集,并将其封装在PageInfo对象中返回给用户。
使用Mybatis分页插件可以大大减少开发人员的工作量,使得开发人员可以将精力集中在处理业务逻辑上,而不用关心底层的数据库分页处理。
一步步学Mybatis-实现简单的分页效果逻辑(5)

⼀步步学Mybatis-实现简单的分页效果逻辑(5) 在前四章中我们已经基本完成了对单表的CRUD与多表联合查询⽅式的Mybatis操作与配置⽅式,今天这⾥要讲的是关于⼀个业务问题中我们常碰到的分页问题。
在开发web项⽬的时候我们经常会使⽤到列表显⽰,⼀般我们都会⽤⼀些常⽤的列表控件例如,datatables(个⼈感觉⼗分不错),easy ui下⾯的那些封装好的表格控件。
思路:在这些控件⾥要达到分页的效果,⼀般都会传2个参数,第⼀个是表⽰当前页的索引(⼀般从0开始),第⼆个表⽰当前页展⽰多少条业务记录,然后将相应的参数传递给List<T> getList(PagenateArgs args)⽅法,最终实现数据库中的分页时候我们可以使⽤limit关键词(针对mysql)进⾏分页,如果是oracle或者sql server他们都有⾃带的rownum函数可以使⽤。
针对上述思路,⾸先我们需要还是⼀如既往的在demo.mybatis.model下⾯新建⼀个名为PagenateArgs的分页参数实体类与⼀个名为SortDirectionEnum的枚举类,⾥⾯包含当前页⾯索引pageIndex, 当前页展⽰业务记录数pageSize, pageStart属性表⽰从第⼏条开始,(pageStart=pageIndex*pageSize)因为limit关键词⽤法是表⽰【limit 起始条数(不包含),取⼏条】,orderFieldStr排序字段,orderDirectionStr 排序⽅向,所以具体创建如下:package david.mybatis.model;/** 分页参数实体类*/public class PagenateArgs {private int pageIndex;private int pageSize;private int pageStart;private String orderFieldStr;private String orderDirectionStr;public PagenateArgs() {// TODO Auto-generated constructor stub}public PagenateArgs(int pageIndex, int pageSize, String orderFieldStr, String orderDirectionStr) {this.pageIndex = pageIndex;this.pageSize = pageSize;this.orderFieldStr = orderFieldStr;this.orderDirectionStr = orderDirectionStr;pageStart = pageIndex * pageSize;}public int getPageIndex() {return pageIndex;}public int getPageStart() {return pageStart;}public int getPageSize() {return pageSize;}public String orderFieldStr() {return orderFieldStr;}public String getOrderDirectionStr() {return orderDirectionStr;}}PagenateArgs分页参数类package david.mybatis.model;/** 排序枚举*/public enum SortDirectionEnum {/** 升序*/ASC,/** 降序*/DESC}SQL排序枚举 完成上⾯的步骤以后我们在IVisitorOperation接⼝类中继续添加⼀个⽅法public List<Visitor> getListByPagenate(PagenateArgs args),前⼏章中我们其实已经有getList⽅法了,这次的分页其实也就是在这个的基础上稍加改动即可,IVisitorOperation接⼝类改动后如下所⽰:package david.mybatis.demo;import java.util.List;import david.mybatis.model.PagenateArgs;import david.mybatis.model.Visitor;import david.mybatis.model.VisitorWithRn;public interface IVisitorOperation {/** 基础查询*/public Visitor basicQuery(int id);/** 添加访问者*/public int add(Visitor visitor);/** 删除访问者*/public int delete(int id);/** 更新访问者*/public int update(Visitor visitor);/** 查询访问者*/public Visitor query(int id);/** 查询List*/public List<Visitor> getList();/** 分页查询List*/public List<Visitor> getListByPagenate(PagenateArgs args);}修改后的IVisitorOperation 接下来我们就要开始动⼿改动我们的VisitorMapper.xml配置⽂件了,新增⼀个<select>节点id与参数类型参照前⼏章的⽅式配置好,如下此处新增的id就为getListByPagenate,配置好以后如下<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapperPUBLIC "-////DTD Mapper 3.0//EN""/dtd/mybatis-3-mapper.dtd"><mapper namespace="david.mybatis.demo.IVisitorOperation"><!-- useGeneratedKeys="true"代表是否使⽤⾃增长序列, keyProperty="Id"指定⾃增长列是哪⼀列, parameterType="Visitor"指定IVisitorOperation接⼝类中定义中所传的相应类型 --> <insert id="add" parameterType="Visitor" useGeneratedKeys="true"keyProperty="Id">insert into Visitor (Name, Email, Status, CreateTime)values (#{name}, #{email}, #{status}, #{createTime})</insert><delete id="delete" parameterType="int">delete from Visitor wherestatus>0 and id = #{id}</delete><update id="update" parameterType="Visitor">update Visitor set Name =#{name}, Email=#{email}, Status=#{status} where id=#{id} and Status>0;</update><select id="query" parameterType="int" resultType="Visitor">select Id,Name, Email, Status, CreateTime from visitor where id=#{id} andStatus>0 order by Id</select><select id="basicQuery" parameterType="int" resultType="Visitor">select *from visitor where id=#{id} andStatus>0 order by Id</select><select id="getList" resultMap="visitorRs"><include refid="getListSql"/></select><sql id="getListSql">select * from Visitor wherestatus>0</sql><!-- 以下为新增部分⽤来分页,orderBySql这个提取出来是为了后⾯有⽰例复⽤ --><resultMap type="Visitor" id="visitorRs"><id column="Id" property="id"/><result column="Name" property="name"/><result column="Email" property="email"/><result column="Status" property="status"/><result column="CreateTime" property="createTime"/></resultMap><select id="getListByPagenate" parameterType="PagenateArgs"resultType="Visitor">select * from (<include refid="getListSql"/><include refid="orderBySql"/>) t <!-- #{}表⽰参数化输出,${}表⽰直接输出不进⾏任何转义操作,⾃⼰进⾏转移 --><if test="pageStart>-1 and pageSize>-1">limit #{pageStart}, #{pageSize}</if></select><sql id="orderBySql">order by ${orderFieldStr} ${orderDirectionStr}</sql></mapper>修改后的VisitorMapper配置 在上⾯你会发现有类似,下图中的配置,这些是属于后⾯⼀章会讲述的动态SQL问题,现在可以暂时不管,这⾥⾯的字段属性都是针对PagenateArgs参数类中的属性名,保持⼀致。
mybatis分页插件pagehelper原理
mybatis分页插件pagehelper原理MyBatis分页插件PageHelper原理1. 前言PageHelper是一款非常受欢迎的MyBatis分页插件,通过对MyBatis进行扩展,提供了简单易用的分页功能。
本文将从浅入深,逐步解释PageHelper的原理。
2. 为什么需要分页插件在处理大量数据时,如果不进行分页处理,一次性将所有数据加载到内存中会导致内存溢出的风险,同时也会导致查询速度变慢。
因此,分页是处理大量数据的常用方式,而PageHelper正是为了简化分页处理而开发的。
3. PageHelper的基本原理PageHelper的基本原理是通过MyBatis的拦截器机制,在sql执行前动态修改sql语句,同时加入分页相关的信息,从而实现分页功能。
具体流程如下:1.PageHelper首先会通过MyBatis的Interceptor拦截器截获Executor的执行过程。
2.通过反射获取到Executor中的MappedStatement对象,进而获取到当前执行的sql语句。
3.根据用户传入的参数,解析出分页相关的信息,如当前页码、每页显示数量等。
4.通过分页相关的信息,动态修改原始的sql语句,加入分页语句,如LIMIT或ROWNUM等。
5.执行修改后的sql语句,得到分页查询的结果。
6.将查询结果封装成Page对象,包含总记录数、总页数、当前页数据等信息,返回给调用者。
4. 使用PageHelper实现分页引入依赖首先需要在项目中引入PageHelper的依赖,可以通过在Maven的``文件中添加以下依赖:<dependency><groupId></groupId><artifactId>pagehelper-spring-boot-starter</artifact Id><version>最新版本</version></dependency>配置PageHelper在Spring Boot项目中,可以通过在配置文件中添加以下配置来启用PageHelper:mybatis:configuration:# PageHelper插件拦截器interceptors:使用PageHelper提供的方法在需要进行分页查询的Mapper接口中,可以直接使用PageHelper提供的方法进行分页查询,例如:import ;import ;public interface UserMapper {List<User> getUsers();// 分页查询用户列表default List<User> getUsersByPage(int pageNum, int p ageSize) {(pageNum, pageSize);List<User> users = getUsers();return new PageInfo<>(users).getList();}}通过对PageHelper的原理解析,我们可以了解到PageHelper是通过MyBatis拦截器实现的分页功能,可以简化分页查询的开发流程。
mybatis pagehelper分页的原理
mybatis pagehelper分页的原理Mybatis PageHelper 分页的原理为了实现数据的快速检索,我们一般会引入分页插件。
Mybatis PageHelper 就是其中的一款分页插件,它能够非常方便地实现分页操作,从而更加高效地访问数据库。
本文将会详细介绍Mybatis PageHelper 的原理,帮助读者更好地理解它的使用。
一、PageHelper 的概述Mybatis PageHelper 是一款能够轻松实现Mybatis 分页查询的插件。
它是针对Mybatis 框架的插件,可以分别用于对MySQL、Oracle、PostgreSQL、SQLite、HSQL 和DB2 等数据库的分页查询操作。
Mybatis PageHelper 的使用方式简单、易上手,具有较好的扩展性和高可用性。
二、PageHelper 的基本使用1、下载PageHelperMybatis PageHelper 的下载地址为:。
用户可以在这个网站上获取最新版的PageHelper 安装包。
2、导入PageHelper将下载好的PageHelper.jar 包导入到项目中的lib 文件夹下。
3、配置分页插件在Mybatis 的配置文件中添加如下节点:<plugins><plugin interceptor="com.github.pagehelper.PageInterceptor"><property name="dialect" value="oracle"/></plugin></plugins>其中,dialect 属性的值应根据不同的数据库而有所区别,这个属性的作用是告诉PageHelper 使用哪种SQL 方言对分页进行处理。
4、分页查询在使用Mybatis 进行分页查询时,只需要通过PageHelper 的静态方法startPage 进行分页设置即可,例如:PageHelper.startPage(pageNum, pageSize);其中,pageNum 表示当前页数,pageSize 表示每页显示的记录数。
Java之mybatis使用limit实现分页案例讲解
Java之mybatis使⽤limit实现分页案例讲解1. Limit实现分页1.1 为什么需要分页减少数据的处理量1.2 使⽤Limit实现分页select * from user limit startIndex,pageSize; # 注意是从startIndex+1开始查询 pageSize 个select * from user limit 3; # [0,3]1.3 使⽤mybatis实现分页(核⼼:SQL)1.3.1 接⼝UserMapper.java// limit实现分页 Map后⾯只能是 Integer 包装类不可以 intList<User> getUserByLimit(Map<String, Integer> map);1.3.2 UserMapper.xml<select id="getUserByLimit" resultMap="er" parameterType="map">select *from erlimit #{statrIndex},#{pageSize};</select>1.3.3 测试类UserMapperTest.java<select id="getUserByLimit" resultMap="UserMap" parameterType="map">select *from `mybatis`.`user`limit #{startIndex},#{pageSize};</select><select id="getUserById" resultMap="UserMap">select *from `mybatis`.`user`where id = #{id};</select>执⾏结果:到此这篇关于Java之mybatis使⽤limit实现分页案例讲解的⽂章就介绍到这了,更多相关Java之mybatis使⽤limit实现分页内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。
mybatis的分页原理
mybatis的分页原理MyBatis是一个流行的Java持久化框架,它提供了一种简单的方式来映射Java对象到关系型数据库中。
在MyBatis中,分页是一个常见的需求,因为在处理大量数据时,需要将数据分成多个页面进行显示。
本文将介绍MyBatis的分页原理。
一、什么是分页分页是指将大量数据按照一定规则划分成若干个页面进行显示。
通常情况下,每一页会显示固定数量的数据,用户可以通过翻页按钮或者滚动条来查看其他页面的数据。
二、MyBatis的分页原理1. 分页插件MyBatis提供了一个名为PageHelper的插件,它可以方便地实现分页功能。
使用PageHelper插件可以不用手动编写SQL语句实现分页。
2. 实现原理PageHelper插件主要通过拦截Executor对象中query方法来实现分页功能。
当执行查询语句时,PageHelper会拦截该方法并解析传入的参数。
然后根据解析出来的参数生成新的SQL语句,并设置相应的参数。
最后再调用原始方法执行新生成的SQL语句。
3. 参数解析在拦截query方法之前,PageHelper会首先解析传入的参数。
主要包括以下几个方面:(1)pageNum:当前页码,从1开始。
(2)pageSize:每页显示的数据量。
(3)count:是否需要进行总数统计。
(4)reasonable:是否进行合理化处理。
4. SQL生成PageHelper插件会根据传入的参数生成新的SQL语句。
主要包括以下几个步骤:(1)根据原始SQL语句生成一个新的SQL语句,该SQL语句用于查询总记录数。
(2)执行第一步生成的SQL语句,获取总记录数。
(3)根据原始SQL语句和传入的参数生成新的SQL语句,该SQL语句用于查询当前页码对应的数据。
5. 结果返回PageHelper插件会将查询结果封装成一个Page对象,并将该对象返回给调用者。
Page对象包含以下几个属性:(1)pageNum:当前页码。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MyBatis自动分页实现
2013-08-16
近两天一直再研究MyBatis的分页问题,看了别人的处理方式,自己总结优化了一下,写了两个拦截类,给有需要的人使用和参考,源码请下载附件。
主要有3个类:Page,MybatisPageInterceptor,MybatisSpringPageInterceptor Page:作为分页对象,有:pageNo、pageSize、totalRecord、totalPage、results属性
MybatisPageInterceptor和MybatisSpringPageInterceptor:
均为拦截类,仅需要选用其中的一个,前者在任何情况下都可用,后再仅在Spring环境下使用。
推荐使用后者,其优点是使用后无需对mapper的XML文件作任何修改,只需要修改Mapper 类的方法,增加一个Page类型的参数即可。
而前者使用时有可能会需要修改XML,特别是原Mapper方法只有一个参数时,需要增加@Param指定参数名,而后修改XML文件使用该参数名。
以下给出在Spring环境下的配置使用方法示例:
MybatisSpringPageInterceptor:
修改Spring配置文件
Java代码
1.<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactory
Bean">
2. <property name="dataSource" ref="dataSource" />
3. <property name="configLocation" value="classpath:mybatis/mybatis.con
fig.xml"/>
4. <property name="typeAliasesPackage" value="com.xjd.springmybatis.mod
el" />
5. <property name="plugins">
6. <bean class="com.xjd.springmybatis.mybatispage.MybatisSpringPage
Interceptor">
7. </bean>
8. </property>
9.</bean>
修改Mapper方法:
Java代码
1.public List<User> getByName(String username);
为
Java代码
1.public List<User> getByName(String username, Page page);
Ok, 即可使用了。
MybatisPageInterceptor:
修改spring配置文件
Java代码
1.<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactory
Bean">
2. <property name="dataSource" ref="dataSource" />
3. <property name="configLocation" value="classpath:mybatis/mybatis.con
fig.xml"/>
4. <property name="typeAliasesPackage" value="com.xjd.springmybatis.mod
el" />
5. <property name="plugins">
6. <bean class="com.xjd.springmybatis.mybatispage.MybatisPageInterc
eptor">
7. </bean>
8. </property>
9.</bean>
修改Mapper方法:
Java代码
1.public List<User> getByName(String username);
为
Java代码
1.public List<User> getByName(@Param("user") String username, Page page); 必要时修改mapper的xml文件:
Java代码
1.<select id="getByName" parameterType="map" resultMap="user_map" >
2. select <include refid="user_columns"/>, <include refid="addr_columns
"/>
3. from user u left join address addr
4. on u.id = er_id
5. where ername = #{user}
6.</select>
Ok, 即可使用了。
使用方式:
Java代码
1.Page<User> page = new Page<User>();
2.page.setPageNo(1);
3.page.setPageSize(20);
4.List<User> users = mapper.getByName("xjd", page);
5.
6.System.out.println(page);
7.//users == page.getResults()
注意:目前只支持MySQL和Oracle,其它数据库请自行修改代码。
∙mybatispage.zip (7.8 KB)
∙下载次数: 4。