`
b_l_east
  • 浏览: 639238 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

MyBatis自动分页实现

 
阅读更多

近两天一直再研究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配置文件

	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="configLocation" value="classpath:mybatis/mybatis.config.xml"/>
		<property name="typeAliasesPackage" value="com.xjd.springmybatis.model" />
		<property name="plugins">
			<bean class="com.xjd.springmybatis.mybatispage.MybatisSpringPageInterceptor">
			</bean>
		</property>
	</bean>

 修改Mapper方法:

public List<User> getByName(String username);

 为

public List<User> getByName(String username, Page page);

 

 Ok, 即可使用了。

 

MybatisPageInterceptor:

修改spring配置文件

	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="configLocation" value="classpath:mybatis/mybatis.config.xml"/>
		<property name="typeAliasesPackage" value="com.xjd.springmybatis.model" />
		<property name="plugins">
			<bean class="com.xjd.springmybatis.mybatispage.MybatisPageInterceptor">
			</bean>
		</property>
	</bean>

  修改Mapper方法:

 

public List<User> getByName(String username);

 为

 

 

public List<User> getByName(@Param("user") String username, Page page);

必要时修改mapper的xml文件:

 

	<select id="getByName" parameterType="map" resultMap="user_map" >
		select <include refid="user_columns"/>, <include refid="addr_columns"/>
		from user u left join address addr
		on u.id = addr.user_id
		where u.username = #{user}
	</select>

 

Ok, 即可使用了。

 

 使用方式:

 

Page<User> page = new Page<User>();
page.setPageNo(1);
page.setPageSize(20);
List<User> users = mapper.getByName("xjd", page);

System.out.println(page);
//users == page.getResults()

 

注意:目前只支持MySQL和Oracle,其它数据库请自行修改代码。

 

 

 

分享到:
评论
14 楼 renlongnian 2016-09-11  
看了各位答案,我整理一下,供大家参考
1.<if test=""> 报错 ,请求参数用@Param("")
eg:代码:List<User> select(@Param("user") User record,Page page);
     xmL:<if test="user.userId != null">
    and user_id = #{user.userId,jdbcType=INTEGER}
    </if>

2.改完后参数不报错了。分页报错
  解决方法:
  MybatisSpringPageInterceptor.queryTotalRecord(Page<?> page, Object parameterObject, MappedStatement mappedStatement, Connection connection) throws SQLException方法中改个参数,
BoundSql boundSql = mappedStatement.getBoundSql(page);改成
BoundSql boundSql = mappedStatement.getBoundSql(parameterObject);

分页不报错了

感谢楼主分享的代码。
13 楼 l804935629 2016-08-15  
<property name="typeAliasesPackage" value="com.xjd.springmybatis.model" />
压缩包里没这个呀,
12 楼 showlives 2016-08-01  
非常感谢楼主分享, 




能不能附上你们的 sql.xml文件
11 楼 hai_dragon 2016-05-06  
可以用不错
10 楼 牛叉大丸子 2016-01-29  
艹艹  不严谨!!!!!sql语句form  还区分大小写 我也是醉了
9 楼 牛叉大丸子 2016-01-28  
后台输出是-1,貌似得不到sql语句,!!
8 楼 sq1073497452 2015-11-18  
首先谢谢发帖人无私奉献,然后我又一个问题

FontStyleMapper
文件调用的时候必须加@param不然就会报错!我使用的不对吗?

List<FontStyle> selectAllPage(@Param("fontStyle")FontStyle fontStyle,Page page);


FontStyleMapper.xml
<!-- 查询所有字体样式-->
  <select id="selectAllPage" resultMap="BaseResultMap" parameterType="com.ist.pojo.FontStyle" >
    select
    <include refid="Base_Column_List" />
    from font_style where 1=1
    <if test="fontStyle.fsId != null" >
       and fs_id = #{fontStyle.fsId,jdbcType=VARCHAR}
    </if>
  </select>
7 楼 b_l_east 2015-11-14  
Daniel_yexi 写道
b_l_east 写道
Daniel_yexi 写道
zjy7554 写道
mapper.xml里面如果有<if test=''>会报错,怎么解决


各位请看我在github上的一个项目,前面这个确实有bug: https://github.com/bleast/mybatis-page-plugin





基本类型是ok了,但是如果我传一个对象给mybatis的xml文件呢,还是不能引用出来


注意使用@Param
6 楼 Daniel_yexi 2015-11-10  
b_l_east 写道
Daniel_yexi 写道
zjy7554 写道
mapper.xml里面如果有<if test=''>会报错,怎么解决


各位请看我在github上的一个项目,前面这个确实有bug: https://github.com/bleast/mybatis-page-plugin





基本类型是ok了,但是如果我传一个对象给mybatis的xml文件呢,还是不能引用出来
5 楼 b_l_east 2015-09-13  
Daniel_yexi 写道
zjy7554 写道
mapper.xml里面如果有<if test=''>会报错,怎么解决


各位请看我在github上的一个项目,前面这个确实有bug: https://github.com/bleast/mybatis-page-plugin
4 楼 Daniel_yexi 2015-09-02  
zjy7554 写道
mapper.xml里面如果有<if test=''>会报错,怎么解决

3 楼 Daniel_yexi 2015-09-02  
我也是同样问题,<if test="">会报错,怎么解决
2 楼 zjy7554 2015-07-20  
mapper.xml里面如果有<if test=''>会报错,怎么解决
1 楼 mrzhanghao 2014-09-03  
敬告,Mybatis已经过时了.现在都是NOSQL了.

相关推荐

    Mybatis通用分页插件

    在传统的Mybatis中,如果要实现分页查询,通常需要手动编写带有LIMIT和OFFSET的SQL语句,这种方式既不直观,又容易出错,特别是在处理大数据量时,效率较低。Mybatis通用分页插件通过自动处理分页参数,极大地简化了...

    springMVC+mybatis实现分页、登录、增删改查

    在Service层,我们可以利用MyBatis的分页插件,如PageHelper,自动实现SQL的分页查询。返回结果后,Controller将分页信息和数据传递给视图,如Bootstrap模板,展示分页效果。 权限设置则是为了确保不同用户只能访问...

    mybatis分页插件代码

    - **自动分页**:通过BaseMapper接口,自动处理分页逻辑。 - **条件构造**:通过QueryWrapper或LambdaQueryWrapper,可以方便地构造复杂查询条件。 - **数据操作**:提供insert、update、delete等方法,简化了对...

    spring+mybatis实现了物理分页

    本项目是基于Spring和MyBatis框架实现的物理分页,让我们来深入探讨这个主题。 首先,Spring是一个开源的Java应用程序框架,它提供了一种依赖注入(Dependency Injection,DI)的方式来管理对象,使得代码更加模块...

    spring-boot-mybatis-mapper包含SpringBoot集成mybatis自动分页

    在本文中,我们将深入探讨如何在Spring Boot项目中集成MyBatis并实现自动分页功能。Spring Boot以其简洁的配置和强大的自动化配置能力,极大地简化了微服务开发过程。而MyBatis作为一款轻量级的持久层框架,能够灵活...

    springboot+mybatis拦截器实现自动分页

    在Spring Boot和MyBatis框架下,我们常常需要实现数据的自动分页功能,以便于在Web应用中展示大量的数据而不会对性能造成过大压力。本教程将详细讲解如何利用拦截器来实现这一功能。 首先,我们需要理解Spring Boot...

    MyBatis 分页源码简单

    PageHelper 是一个 MyBatis 的第三方分页插件,它可以自动完成分页参数的设置和结果集的转换。而自定义分页插件则允许开发者根据具体需求进行个性化定制。 在 MyBatis 中实现分页的基本步骤如下: 1. **配置分页...

    mybatis分页实现1

    MyBatis 提供了两种主要的分页实现方法:一种是通过在 Mapper XML 文件中直接编写分页 SQL,另一种是利用 MyBatis 的插件机制,如 PageHelper 插件,进行拦截器实现分页。这里我们主要讨论第一种方法,即“普通的...

    MyBatis分页

    2. **使用PageHelper插件**:PageHelper是MyBatis的第三方分页插件,通过简单的配置即可实现自动分页,且支持多种数据库。 **四、注意事项** 1. 分页效率优化:避免全表扫描,尽可能利用索引提升查询速度。 2. ...

    Spring Boot集成MyBatis与分页插件

    本教程将详细讲解如何在Spring Boot项目中集成MyBatis,并利用分页插件实现高效的数据分页。 首先,我们需要在Spring Boot项目中引入MyBatis依赖。在`pom.xml`文件中添加以下Maven依赖: ```xml &lt;groupId&gt;org....

    springboot整合mybatis-plus实现多表分页查询

    在本文中,我们将深入探讨如何在SpringBoot项目中整合MyBatis-Plus,实现多表分页查询。MyBatis-Plus是一个强大的MyBatis扩展,简化了对数据库的操作,包括CRUD操作以及复杂的关联查询。它提供了丰富的API,使得开发...

    mybatis自动生成代码分页功能 mysql 数据库

    本篇将聚焦于MyBatis的代码自动生成和分页功能,特别是在MySQL数据库中的应用。 一、MyBatis代码生成器(MyBatis Generator) MyBatis Generator(MBG)是MyBatis官方提供的一个工具,可以自动生成Java模型类、...

    mybatis的分页插件

    总的来说,MyBatis 分页插件 PageHelper 是一个强大且易于使用的工具,它能够帮助开发者快速实现分页功能,提高开发效率,同时提供了一定的性能优化。无论是在小型项目还是大型项目中,它都是一个值得信赖的伙伴。

    SpringMVC+Mybatis+分页插件的实现

    自己最近搭建的一个SpringMVC+Mybatis的框架 属于无实体类的框架 ... 并实现了Myabtis的自动分页和总数查询 只要传入分页参数便能自动查询总数和分页 总数封装在参数里面执行查询后可以直接从参数中获取

    springmvc+mybatis+分页查询

    在本项目中,我们主要...综上所述,这个项目展示了如何在Spring MVC和MyBatis框架下实现一个完整的Web应用,通过PageHelper插件轻松实现分页查询功能。理解并掌握这些知识点,对于开发基于Java的Web应用是非常重要的。

    mybatis分页拦截器(自动封装版)剖析.pdf

    MyBatis 分页拦截器是一种优化数据库操作的技术,它的主要目的是在不修改大量现有业务代码的情况下,实现对数据库查询结果的自动分页。在自动封装版的MyBatis分页拦截器中,开发者通常会创建一个拦截器类,该类会...

    pring_mybatis物理分页

    然后在Service层,可以通过Page对象传递分页参数,MyBatis会自动处理分页查询。 例如,在SpringMVC项目中,我们可能有以下步骤: - 创建自定义方言类,实现MyBatis的Dialect接口,覆盖`getLimitString()`方法。 - ...

    mybatis分页完整的项目

    1. **MyBatis分页插件**:MyBatis提供了PageHelper等分页插件,可以简化分页操作,通过配置即可实现自动分页。 2. **MyBatis动态SQL**:利用MyBatis的动态SQL,可以根据条件灵活构建SQL语句,实现复杂的查询需求。 ...

Global site tag (gtag.js) - Google Analytics