`
b_l_east
  • 浏览: 636626 次
  • 性别: 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了.

相关推荐

    SpringMVC+Mybatis+分页插件的实现

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

    mybatis查询分页插件

    本插件针对mybatis分页查询而编写,在mybatis3.2.7版本测试通过,其它版本未经测试。 优点: 实现原理为mybatis的拦截器,但是比网上目前流行的修行sql方式优化,只是第一次调用查询时需要处理,以后不需要再额外...

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

    使用maven和jdk1.8 项目导入直接更改数据库连接即可使用

    mybatis分页拦截器(自动封装版)

    近期由于工作需要,想要开发一版能够满足多数人员使用的mybatis分页拦截器,在网上查找了很多资料并结合自己的一些理解,开发出了以下一版简单的代码。 起初想要遵循江湖惯例,通过各个层级间传递分页参数来实现目标...

    Oracle使用MyBatis中RowBounds实现分页查询功能

    使用MyBatis中的RowBounds进行分页查询时,不需要在 sql 语句中写 offset,limit,mybatis 会自动拼接 分页sql ,添加 offset,limit,实现自动分页。 需要前台传递参数currentPage和pageSize两个参数,分别是当前页...

    Java简单实现SpringMVC+MyBatis分页插件

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

    mybatis拦截器的完整实现

    mybatis拦截器的完整实现,test.sql是数据库测试脚本,主要目的是生成mybatis最终执行的sql语句,并打印出来,方便调试。 基于此,可以实现自动化分页。

    智能排班系统Spring+SpringMVC+MyBatis+PateHelper分页.zip

    智能排班系统Spring+SpringMVC+MyBatis+PateHelper分页+JS+JQ

    基于Spring + Spring MVC + Mybatis

    实现Mybatis的分页查询模块,支持MySQL、PostgreSQL、SQLServer等数据库分页查询 通用的权限管理模块,基于Apache Shiro的 用户-角色-权限(RBAC)的细粒度权限控制 大量配置示例,根据需求,自由优化、调整,达到最佳...

    Spring boot+Mybatis整合实现增删改查(适合初学者入门必备也可以做脚手架开发)

    3、后台的分页使用Mybatis的插件pagehelper实现 5.添加定时任务:不再使用作业自动调度框架Quartz实现作业调度,使用spring框架自带的调度器进行作业调度,简化了配置。@Scheduled是单线程的,每次最多只有一个作业...

    mybatis-generator自动生成代码

    利用mybatis-generator自动生成代码 实现快捷操作 很方便

    MyBatis-plus+达梦数据库实现自动生成代码的示例

    主要介绍了MyBatis-plus+达梦数据库实现自动生成代码的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    springmybatis

    mybatis实战教程mybatis in action之七实现mybatis分页源码下载 mybatis实战教程mybatis in action之八mybatis 动态sql语句 mybatis实战教程mybatis in action之九mybatis 代码生成工具的使用 mybatis ...

    Spring boot整合Mybatis实现增删改查

    2.前端框架采用https://adminlte.io ,后台的分页使用Mybatis的插件pagehelper实现; 3.数据库使用Mysql中自带的sakila数据库,使用前,请将application.yml中的spring.datasource.ssm.password中的数据库密码设置...

    Spring+SpringMVC+Mybatis整合实现增删改查功能(适合入门学习也可以做脚手架开发)

    4、后台的分页使用Mybatis的插件pagehelper实现 5、不再使用作业自动调度框架Quartz实现作业调度,使用spring框架自带的调度器进行作业调度,简化了配置; 6、json插件使用阿里的开源fastjson工具,注意低版本的...

    Mybatis plus 基于 springBoot 源码

    内置分页插件:基于Mybatis物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通List查询 内置性能分析插件:可输出Sql语句以及其执行时间,建议开发测试时启用该功能,能有效解决慢查询 内置...

    JavaBean+MyBatis注解,根据表结构自动生成

    2、工具主要针对SpringMvc+Mybatis注解+Mysql生成对象,dao、sqlDao、interface、实现接口 3、根据表生成Excel 4、生成成功后倒入到自己对应的项目中,然后Ctrl+Shipt+O(Eclipse快速倒入包)实现 5、里面因为运用的...

    SpringBoot整合mybatis.docx

    通过SpringBoot整合MyBatis,具体说明如下: 1.项目以maven创建 2.Mybatis的基本代码由mybatis generator 自动生成代码插件自动生成 3.数据库连接池使用alibaba的druid...4.使用Pagehelper分页帮助类,实现分页效果

    Mybatis增强工具包(Mybatis plus).rar

    丰富功能:代码生成、自动分页、逻辑删除、自动填充等功能一应俱全。 其优点如下: 无侵入:Mybatis-Plus 在 Mybatis 的基础上进行扩展,只做增强不做改变,引入 Mybatis-Plus 不会对您现有的 Mybatis 构架产生任何...

Global site tag (gtag.js) - Google Analytics