mybatis的分页异常

问题描述

大家好。本人用了mybatis实现分页查询,数据库采用mysql。当执行sql语句为:selectID,USERID,RESOURCE_ID,RESOURCE_NAME,IP_ADDRESS,OPER_TIME,MAC_ADDRESS,TYPEfromT_PORTAL_LOG_OPERwhere1=1limit0,15

mybatis无异常,结果值能够注入到List中。但是当sql为:selectID,USERID,RESOURCE_ID,RESOURCE_NAME,IP_ADDRESS,OPER_TIME,MAC_ADDRESS,TYPEfromT_PORTAL_LOG_OPERwhere1=1limit15,15

mybatis无法把结果值注入到List中去。对应的日志如下:执行selectID,USERID,RESOURCE_ID,RESOURCE_NAME,IP_ADDRESS,OPER_TIME,MAC_ADDRESS,TYPEfromT_PORTAL_LOG_OPERwhere1=1limit0,15时的日志:[DEBUG][http-8080-1][org.mybatis.spring.SqlSessionUtils]ReleasingtransactionalSqlSession[org.apache.ibatis.session.defaults.DefaultSqlSession@358ba94a][DEBUG][http-8080-1][org.mybatis.spring.SqlSessionUtils]FetchedSqlSession[org.apache.ibatis.session.defaults.DefaultSqlSession@358ba94a]fromcurrenttransaction[DEBUG][http-8080-1][com.eiei.portal.log.mapper.TPortalLogOperMapper.list]==>Preparing:selectID,USERID,RESOURCE_ID,RESOURCE_NAME,IP_ADDRESS,OPER_TIME,MAC_ADDRESS,TYPEfromT_PORTAL_LOG_OPERwhere1=1limit0,15[DEBUG][http-8080-1][com.eiei.portal.log.mapper.TPortalLogOperMapper.list]==>Parameters:[DEBUG][http-8080-1][com.eiei.portal.log.mapper.TPortalLogOperMapper.list]<==Total:15[DEBUG][http-8080-1][org.mybatis.spring.SqlSessionUtils]ReleasingtransactionalSqlSession[org.apache.ibatis.session.defaults.DefaultSqlSession@358ba94a]

执行selectID,USERID,RESOURCE_ID,RESOURCE_NAME,IP_ADDRESS,OPER_TIME,MAC_ADDRESS,TYPEfromT_PORTAL_LOG_OPERwhere1=1limit15,15时的日志:[DEBUG][http-8080-1][org.mybatis.spring.SqlSessionUtils]ReleasingtransactionalSqlSession[org.apache.ibatis.session.defaults.DefaultSqlSession@2394dd57][DEBUG][http-8080-1][org.mybatis.spring.SqlSessionUtils]FetchedSqlSession[org.apache.ibatis.session.defaults.DefaultSqlSession@2394dd57]fromcurrenttransaction[DEBUG][http-8080-1][com.eiei.portal.log.mapper.TPortalLogOperMapper.list]==>Preparing:selectID,USERID,RESOURCE_ID,RESOURCE_NAME,IP_ADDRESS,OPER_TIME,MAC_ADDRESS,TYPEfromT_PORTAL_LOG_OPERwhere1=1limit15,15[DEBUG][http-8080-1][com.eiei.portal.log.mapper.TPortalLogOperMapper.list]==>Parameters:[DEBUG][http-8080-1][com.eiei.portal.log.mapper.TPortalLogOperMapper.list]<==Total:5[DEBUG][http-8080-1][com.eiei.portal.log.mapper.TPortalLogOperMapper.list]<==Total:5[DEBUG][http-8080-1][com.eiei.portal.log.mapper.TPortalLogOperMapper.list]<==Total:5[DEBUG][http-8080-1][com.eiei.portal.log.mapper.TPortalLogOperMapper.list]<==Total:5[DEBUG][http-8080-1][com.eiei.portal.log.mapper.TPortalLogOperMapper.list]<==Total:5[DEBUG][http-8080-1][com.eiei.portal.log.mapper.TPortalLogOperMapper.list]<==Total:5[DEBUG][http-8080-1][com.eiei.portal.log.mapper.TPortalLogOperMapper.list]<==Total:5[DEBUG][http-8080-1][com.eiei.portal.log.mapper.TPortalLogOperMapper.list]<==Total:5[DEBUG][http-8080-1][com.eiei.portal.log.mapper.TPortalLogOperMapper.list]<==Total:5[DEBUG][http-8080-1][com.eiei.portal.log.mapper.TPortalLogOperMapper.list]<==Total:5[DEBUG][http-8080-1][com.eiei.portal.log.mapper.TPortalLogOperMapper.list]<==Total:5[DEBUG][http-8080-1][org.mybatis.spring.SqlSessionUtils]ReleasingtransactionalSqlSession[org.apache.ibatis.session.defaults.DefaultSqlSession@2394dd57]

解决方案

解决方案二:
继续:第一种情况可以获取到15条数据。第二种情况理论上可以获取到5条数据的,但是结果值却为空。请教大神们,有谁遇到这种情况,谢谢。
解决方案三:
在这里贴上我的代码吧:mybatis.xml<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEconfigurationPUBLIC"-//mybatis.org//DTDConfig3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><settings><!--changesfromthedefaultsfortesting--><settingname="cacheEnabled"value="false"/><settingname="useGeneratedKeys"value="true"/><settingname="defaultExecutorType"value="REUSE"/></settings><plugins><plugininterceptor="com.eiei.rebatis.interceptor.SqlPageInterceptor"><propertyname="dialect"value="com.eiei.rebatis.dialect.MySQLDialect"/></plugin></plugins></configuration>

com.eiei.rebatis.dialect.MySQLDialectpackagecom.eiei.rebatis.dialect;publicclassMySQLDialectextendsDialect{@OverridepublicStringgetLimitString(Stringsql,intoffset,intlimit){sql=trimDelimiter(sql);StringBufferstringBuffer=newStringBuffer(sql.length()+20);stringBuffer.append(sql);if(offset>0){stringBuffer.append("limit").append(offset).append(',').append(limit);}else{stringBuffer.append("limit0,").append(limit);}if(super.hasDelimiter()){stringBuffer.append(SQL_END_DELIMITER);}returnstringBuffer.toString();}}

com.eiei.rebatis.dialect.Dialectpackagecom.eiei.rebatis.dialect;publicclassDialect{publicstaticfinalStringSQL_END_DELIMITER=";";privatebooleandelimiterFlag=false;publicbooleansupportsLimit(){returntrue;}publicbooleansupportsLimitOffset(){returnsupportsLimit();}publicbooleanhasDelimiter(){returndelimiterFlag;}publicStringgetLimitString(Stringsql,intoffset,intlimit){thrownewUnsupportedOperationException("pagedqueriesnotsupported");}protectedStringtrimDelimiter(Stringsql){if(sql==null||sql.length()<=0){returnnull;}this.delimiterFlag=sql.endsWith(SQL_END_DELIMITER);returndelimiterFlag?sql.substring(0,sql.length()-1-SQL_END_DELIMITER.length()):sql;}}

com.eiei.rebatis.interceptor.SqlPageInterceptorpackagecom.eiei.rebatis.interceptor;importjava.sql.Connection;importjava.util.Properties;importorg.apache.ibatis.executor.statement.PreparedStatementHandler;importorg.apache.ibatis.executor.statement.RoutingStatementHandler;importorg.apache.ibatis.executor.statement.StatementHandler;importorg.apache.ibatis.mapping.BoundSql;importorg.apache.ibatis.plugin.Interceptor;importorg.apache.ibatis.plugin.Intercepts;importorg.apache.ibatis.plugin.Invocation;importorg.apache.ibatis.plugin.Plugin;importorg.apache.ibatis.plugin.Signature;importorg.apache.ibatis.session.RowBounds;importorg.springframework.util.StringUtils;importcom.eiei.rebatis.dialect.Dialect;importcom.eiei.rebatis.utils.ReflectUtils;@Intercepts({@Signature(type=StatementHandler.class,method="prepare",args={Connection.class})})publicclassSqlPageInterceptorimplementsInterceptor{Dialectdialect;publicObjectintercept(Invocationinvocation)throwsThrowable{//TODOAuto-generatedmethodstubif(invocation.getTarget()instanceofRoutingStatementHandler){RoutingStatementHandlerstatement=(RoutingStatementHandler)invocation.getTarget();PreparedStatementHandlerdelegate=(PreparedStatementHandler)ReflectUtils.getValueByFieldName(statement,"delegate");RowBoundsrowBounds=(RowBounds)ReflectUtils.getValueByFieldName(delegate,"rowBounds");if(rowBounds!=null){intoffset=rowBounds.getOffset();intlimit=rowBounds.getLimit();if(limit>0&&limit<RowBounds.NO_ROW_LIMIT){BoundSqlboundSql=delegate.getBoundSql();//分页SQL<select>中parameterType属性对应的实体参数,即Mapper接口中执行分页方法的参数,该参数不得为空ObjectparameterObject=boundSql.getParameterObject();if(parameterObject==null){thrownewNullPointerException("parameterObject尚未实例化!");}else{StringpaginationSql=dialect.getLimitString(boundSql.getSql(),offset,limit);//将分页sql语句反射回BoundSqlReflectUtils.setValueByFieldName(boundSql,"sql",paginationSql);}}}}returninvocation.proceed();}publicObjectplugin(Objecttarget){returnPlugin.wrap(target,this);}publicvoidsetProperties(Propertiesproperties){StringdialectClass=properties.getProperty("dialect");if(StringUtils.isEmpty(dialectClass)){return;}try{dialect=(Dialect)Class.forName(dialectClass).newInstance();}catch(Exceptione){thrownewRuntimeException("cannotcreatedialectinstancebydialect:"+dialectClass,e);}}}

解决方案四:
继续:对应的Model类://不用理会注解,注解只是本人用来自动生成代码的工具packagecom.eiei.portal.log.model;importjava.io.Serializable;importjava.util.Date;importcom.eiei.rebatis.an.annotation.AnColumn;importcom.eiei.rebatis.an.annotation.AnId;importcom.eiei.rebatis.an.annotation.AnTable;/***用户操作日志*@authoreiei**/@AnTable(name="t_portal_log_oper")publicclassTPortalLogOperimplementsSerializable{privatestaticfinallongserialVersionUID=8459316607010797753L;@AnId@AnColumn(length=32)privateStringid;@AnColumn(length=32)privateStringuserid;@AnColumn(length=32)privateStringresourceId;@AnColumn(length=255)privateStringresourceName;@AnColumn(length=50)privateStringipAddress;@AnColumn(type="timestamp")privateDateoperTime;@AnColumn(length=50)privateStringmacAddress;@AnColumn(length=10)privateStringtype;publicStringgetId(){returnid;}publicvoidsetId(Stringid){this.id=id;}publicStringgetUserid(){returnuserid;}publicvoidsetUserid(Stringuserid){this.userid=userid;}publicStringgetResourceId(){returnresourceId;}publicvoidsetResourceId(StringresourceId){this.resourceId=resourceId;}publicStringgetResourceName(){returnresourceName;}publicvoidsetResourceName(StringresourceName){this.resourceName=resourceName;}publicStringgetIpAddress(){returnipAddress;}publicvoidsetIpAddress(StringipAddress){this.ipAddress=ipAddress;}publicDategetOperTime(){returnoperTime;}publicvoidsetOperTime(DateoperTime){this.operTime=operTime;}publicStringgetMacAddress(){returnmacAddress;}publicvoidsetMacAddress(StringmacAddress){this.macAddress=macAddress;}publicStringgetType(){returntype;}publicvoidsetType(Stringtype){this.type=type;}@OverridepublicinthashCode(){finalintprime=31;intresult=1;result=prime*result+((id==null)?0:id.hashCode());returnresult;}@Overridepublicbooleanequals(Objectobj){if(this==obj)returntrue;if(obj==null)returnfalse;if(getClass()!=obj.getClass())returnfalse;TPortalLogOperother=(TPortalLogOper)obj;if(id==null){if(other.id!=null)returnfalse;}elseif(!id.equals(other.id))returnfalse;returntrue;}@OverridepublicStringtoString(){return"TPortalLogOper[id="+id+",userid="+userid+",resourceId="+resourceId+",resourceName="+resourceName+",ipAddress="+ipAddress+",operTime="+operTime+",macAddress="+macAddress+",type="+type+"]";}}

对应的mapper.xml代码:<?xmlversion="1.0"encoding="UTF-8"?><!--@authoreiei@since2014年10月28日23:20:30.092此代码由frameworkan生成。--><!DOCTYPEmapperPUBLIC"-//mybatis.org//DTDMapper3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mappernamespace="com.eiei.portal.log.mapper.TPortalLogOperMapper"><resultMaptype="com.eiei.portal.log.model.TPortalLogOper"id="tPortalLogOper"><resultcolumn="ID"property="id"/><resultcolumn="USERID"property="userid"/><resultcolumn="RESOURCE_ID"property="resourceId"/><resultcolumn="RESOURCE_NAME"property="resourceName"/><resultcolumn="IP_ADDRESS"property="ipAddress"/><resultcolumn="OPER_TIME"property="operTime"/><resultcolumn="MAC_ADDRESS"property="macAddress"/><resultcolumn="TYPE"property="type"/></resultMap><sqlid="table_name">T_PORTAL_LOG_OPER</sql><sqlid="sql_columns_items">ID,USERID,RESOURCE_ID,RESOURCE_NAME,IP_ADDRESS,OPER_TIME,MAC_ADDRESS,TYPE</sql><sqlid="id_column">ID</sql><selectid="get"parameterType="String"resultMap="tPortalLogOper">select<includerefid="sql_columns_items"/>from<includerefid="table_name"/>where<includerefid="id_column"/>=#{id}</select><selectid="listAll"resultMap="tPortalLogOper">select<includerefid="sql_columns_items"/>from<includerefid="table_name"/></select><insertid="save"parameterType="com.eiei.portal.log.model.TPortalLogOper">insertinto<includerefid="table_name"/>(<includerefid="sql_columns_items"/>)values(#{id},#{userid},#{resourceId},#{resourceName},#{ipAddress},#{operTime},#{macAddress},#{type})</insert><selectid="list"resultMap="tPortalLogOper"parameterType="com.eiei.rebatis.bean.Condition">select<includerefid="sql_columns_items"/>from<includerefid="table_name"/>where1=1<iftest="id!=nullandid!=''">andID=#{id}</if></select><deleteid="delete"parameterType="String">deletefrom<includerefid="table_name"/>where<includerefid="id_column"/>=#{id}</delete><selectid="count"resultType="int"parameterType="com.eiei.rebatis.bean.Condition">selectcount(1)from<includerefid="table_name"/>where1=1<iftest="id!=nullandid!=''">andID=#{id}</if></select><updateid="update"></update></mapper>

解决方案五:
MyBatis的分页直接写在SQL里,不需要任何代码。你自己实现了一些类,如MySQLDialect,然后和MyBatis一起使用,估计问题就出现在这。

时间: 2024-09-18 21:21:12

mybatis的分页异常的相关文章

Mybatis全面分页插件_java

根据下面分页的思想,很容易实现Mybitas的多租户设计.  使用Mybatis提供的拦截器.对分页的SQL语句通过封装处理,处理成不同的分页sql.  本例已经实现了对Mysql和Oracle的分页功能.注意下面的引用包,不要引用错了.  import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import ja

mybatis+mysql分页事务问题

问题描述 有一个分页场景,前台通过ajax请求,后台用的mybatis分页插件,以下是插件配置:<propertyname="plugins"><list><beanclass="com.github.miemiedev.mybatis.paginator.OffsetLimitInterceptor"><propertyname="dialect"><beanclass="com.

springmvc mybatis freemarker 分页

问题描述 求一个springmvcmybatisfreemarker中传参的分页实例,比如:查询一个类型的所有分页信息谢谢 解决方案

Mybatis极其(最)简(好)单(用)的一个分页插件

以前为Mybatis分页查询发愁过,而且在网上搜过很多相关的文章,最后一个都没采用.在分页的地方完全都是手写分页SQL和count的sql,总之很麻烦. 后来有一段时间想从Mybatis内部写一个分页的实现,我对LanguageDriver写过一个实现,自动分页是没问题了,但是查询总数(count)仍然没法一次性解决,最后不了了之. 最近又要用到分页,为了方便必须地写个通用的分页类,因此又再次参考网上大多数的Mybatis分页代码,本插件主要参考自: http://blog.csdn.net/h

自己动手写的mybatis分页插件(极其简单好用)_java

刚开始项目,需要用到mybatis分页,网上看了很多插件,其实实现原理基本都大同小异,但是大部分都只给了代码,注释不全,所以参考了很多篇文章(每篇文章偷一点代码,评出来自己的,半抄袭),才自己模仿着写出了一个适合自己项目的分页插件,话不多说,直接上代码,相比大部分文章,注释算很完整了 最重要的拦截器 package com.dnkx.interceptor; import java.sql.*; import java.util.HashMap; import java.util.Propert

SpringMVC+MyBatis分页(最新)_java

目前主流的Web MVC框架,除了Struts这个主力 外,还有Spring MVC,主要是由于Spring MVC配置比较简单,使用起来也十分明了,非常灵活,与Spring 集成较好,对RESTful API的支持也比struts要好. MyBatis是ibatis的升级版,作为hibernate的老对手,它 是一个可以自定义SQL.存储过程和高级映射的持久层框架. 与hibernate的主要区别就是mybatis是半自动化的,而hibernate是全自动的,所以当应用需求越来越复杂的时候,自

Mybatis实现增删改查及分页查询的方法_java

MyBatis的前身就是iBatis.是一个数据持久层(ORM)框架. MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持 久层框架.MyBatis消除了几乎所有的JDBC 代码和参数的手工 设置以及结果集的检索.MyBatis使用简单的XML或注解用于 配置和原始映射,将接口和Java 的POJOs(Plan Old Java Objects,普通的Java 对象)映射成数据库中的记录.每个 MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个 SqlS

MySQL分页方法

环境 MySQL 5.1 + 命令行工具 问题 MySQL分页 解决 --创建测 试表 create table test ( id int(11) primary key auto_increment, name varchar(20) not null ); --插入数据 mysql> insert into test(name) values('test1'); Query OK, 1 row affected (0.16 sec) mysql> insert into test(nam

spring-Spring+mybatis 出现 NoSuchBeanDefinitionException

问题描述 Spring+mybatis 出现 NoSuchBeanDefinitionException 异常信息:org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'propertyConfigurer' is defined at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDe