diff --git a/pom.xml b/pom.xml
index 69b656d2..26538fa0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -191,6 +191,11 @@
1.3.1
test
+
+ com.xugudb
+ xugu-jdbc
+ 12.2.0
+
-->
diff --git a/src/main/java/com/github/pagehelper/dialect/helper/XuguDialect.java b/src/main/java/com/github/pagehelper/dialect/helper/XuguDialect.java
new file mode 100644
index 00000000..b76ef108
--- /dev/null
+++ b/src/main/java/com/github/pagehelper/dialect/helper/XuguDialect.java
@@ -0,0 +1,79 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2014-2017 abel533@gmail.com
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+package com.github.pagehelper.dialect.helper;
+
+import com.github.pagehelper.Page;
+import com.github.pagehelper.dialect.AbstractHelperDialect;
+import com.github.pagehelper.util.MetaObjectUtil;
+import org.apache.ibatis.cache.CacheKey;
+import org.apache.ibatis.mapping.BoundSql;
+import org.apache.ibatis.mapping.MappedStatement;
+import org.apache.ibatis.mapping.ParameterMapping;
+import org.apache.ibatis.reflection.MetaObject;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author liuzh
+ */
+public class XuguDialect extends AbstractHelperDialect {
+
+ @Override
+ public Object processPageParameter(MappedStatement ms, Map paramMap, Page page, BoundSql boundSql, CacheKey pageKey) {
+ paramMap.put(PAGEPARAMETER_FIRST, page.getStartRow());
+ paramMap.put(PAGEPARAMETER_SECOND, page.getPageSize());
+ //处理pageKey
+ pageKey.update(page.getStartRow());
+ pageKey.update(page.getPageSize());
+ //处理参数配置
+ if (boundSql.getParameterMappings() != null) {
+ List newParameterMappings = new ArrayList(boundSql.getParameterMappings());
+ if (page.getStartRow() == 0) {
+ newParameterMappings.add(new ParameterMapping.Builder(ms.getConfiguration(), PAGEPARAMETER_SECOND, int.class).build());
+ } else {
+ newParameterMappings.add(new ParameterMapping.Builder(ms.getConfiguration(), PAGEPARAMETER_FIRST, long.class).build());
+ newParameterMappings.add(new ParameterMapping.Builder(ms.getConfiguration(), PAGEPARAMETER_SECOND, int.class).build());
+ }
+ MetaObject metaObject = MetaObjectUtil.forObject(boundSql);
+ metaObject.setValue("parameterMappings", newParameterMappings);
+ }
+ return paramMap;
+ }
+
+ @Override
+ public String getPageSql(String sql, Page page, CacheKey pageKey) {
+ StringBuilder sqlBuilder = new StringBuilder(sql.length() + 14);
+ sqlBuilder.append(sql);
+ if (page.getStartRow() == 0) {
+ sqlBuilder.append("\n LIMIT ? ");
+ } else {
+ sqlBuilder.append("\n LIMIT ?, ? ");
+ }
+ return sqlBuilder.toString();
+ }
+
+}
diff --git a/src/main/java/com/github/pagehelper/dialect/rowbounds/XuguRowBoundsDialect.java b/src/main/java/com/github/pagehelper/dialect/rowbounds/XuguRowBoundsDialect.java
new file mode 100644
index 00000000..3bfc55a5
--- /dev/null
+++ b/src/main/java/com/github/pagehelper/dialect/rowbounds/XuguRowBoundsDialect.java
@@ -0,0 +1,56 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2014-2017 abel533@gmail.com
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+package com.github.pagehelper.dialect.rowbounds;
+
+import com.github.pagehelper.dialect.AbstractRowBoundsDialect;
+import org.apache.ibatis.cache.CacheKey;
+import org.apache.ibatis.session.RowBounds;
+
+/**
+ * mysql 基于 RowBounds 的分页
+ *
+ * @author liuzh
+ */
+public class XuguRowBoundsDialect extends AbstractRowBoundsDialect {
+
+ @Override
+ public String getPageSql(String sql, RowBounds rowBounds, CacheKey pageKey) {
+ StringBuilder sqlBuilder = new StringBuilder(sql.length() + 14);
+ sqlBuilder.append(sql);
+ if (rowBounds.getOffset() == 0) {
+ sqlBuilder.append("\n LIMIT ");
+ sqlBuilder.append(rowBounds.getLimit());
+ } else {
+ sqlBuilder.append("\n LIMIT ");
+ sqlBuilder.append(rowBounds.getOffset());
+ sqlBuilder.append(",");
+ sqlBuilder.append(rowBounds.getLimit());
+ pageKey.update(rowBounds.getOffset());
+ }
+ pageKey.update(rowBounds.getLimit());
+ return sqlBuilder.toString();
+ }
+
+}
diff --git a/src/test/resources/xugu/mybatis-config-interceptor.xml b/src/test/resources/xugu/mybatis-config-interceptor.xml
new file mode 100644
index 00000000..cf3f3317
--- /dev/null
+++ b/src/test/resources/xugu/mybatis-config-interceptor.xml
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/test/resources/xugu/mybatis-config-pagesizezero.xml b/src/test/resources/xugu/mybatis-config-pagesizezero.xml
new file mode 100644
index 00000000..ae06b834
--- /dev/null
+++ b/src/test/resources/xugu/mybatis-config-pagesizezero.xml
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/test/resources/xugu/mybatis-config-reasonable.xml b/src/test/resources/xugu/mybatis-config-reasonable.xml
new file mode 100644
index 00000000..78b39c00
--- /dev/null
+++ b/src/test/resources/xugu/mybatis-config-reasonable.xml
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/test/resources/xugu/mybatis-config-rowbounds.xml b/src/test/resources/xugu/mybatis-config-rowbounds.xml
new file mode 100644
index 00000000..04588bd6
--- /dev/null
+++ b/src/test/resources/xugu/mybatis-config-rowbounds.xml
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/test/resources/xugu/mybatis-config.xml b/src/test/resources/xugu/mybatis-config.xml
new file mode 100644
index 00000000..cd6a94c5
--- /dev/null
+++ b/src/test/resources/xugu/mybatis-config.xml
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/test/resources/xugu/mysql.sql b/src/test/resources/xugu/mysql.sql
new file mode 100644
index 00000000..350f0878
--- /dev/null
+++ b/src/test/resources/xugu/mysql.sql
@@ -0,0 +1,195 @@
+CREATE DATABASE pagehelper CHARACTER SET utf8;
+
+USE pagehelper;
+DROP TABLE IF EXISTS `user`;
+
+CREATE TABLE `user` (
+ `id` int IDENTITY(1,1) NOT NULL,
+ `name` varchar(50) DEFAULT NULL,
+ `py` varchar(50) DEFAULT NULL,
+ PRIMARY KEY (`Id`)
+) ;
+
+insert into `user`(id, name, py) values('1','毕淑儒','BSR');
+insert into `user`(id, name, py) values('2','蔡兴熙','CXX');
+insert into `user`(id, name, py) values('3','曾三杰','ZSJ');
+insert into `user`(id, name, py) values('4','常元琴','CYQ');
+insert into `user`(id, name, py) values('5','陈栋芬','CDF');
+insert into `user`(id, name, py) values('6','陈宁婷','CNZ');
+insert into `user`(id, name, py) values('7','陈瑞','CR');
+insert into `user`(id, name, py) values('8','陈武宵','CWX');
+insert into `user`(id, name, py) values('9','陈晓丽','CXL');
+insert into `user`(id, name, py) values('10','陈翼涛','CYT');
+insert into `user`(id, name, py) values('11','陈宇然','CYR');
+insert into `user`(id, name, py) values('12','陈震','CZ');
+insert into `user`(id, name, py) values('13','程太君','CTJ');
+insert into `user`(id, name, py) values('14','程玉娜','CYN');
+insert into `user`(id, name, py) values('15','丛贺轩','CHX');
+insert into `user`(id, name, py) values('16','戴国宇','DGY');
+insert into `user`(id, name, py) values('17','戴杰亮','DJL');
+insert into `user`(id, name, py) values('18','丁玉华','DYH');
+insert into `user`(id, name, py) values('19','董秋明','DQM');
+insert into `user`(id, name, py) values('20','董政厚','DZH');
+insert into `user`(id, name, py) values('21','杜玉焱','DYZ');
+insert into `user`(id, name, py) values('22','段瑜芝','DZZ');
+insert into `user`(id, name, py) values('23','傅广友','FGY');
+insert into `user`(id, name, py) values('24','傅井飞','FJF');
+insert into `user`(id, name, py) values('25','高辉涛','GHT');
+insert into `user`(id, name, py) values('26','高龙飞','GLF');
+insert into `user`(id, name, py) values('27','高汝英','GRY');
+insert into `user`(id, name, py) values('28','高云天','GYT');
+insert into `user`(id, name, py) values('29','郭义民','GYM');
+insert into `user`(id, name, py) values('30','郭永洪','GYH');
+insert into `user`(id, name, py) values('31','韩国茜','HGZ');
+insert into `user`(id, name, py) values('32','韩龙康','HLK');
+insert into `user`(id, name, py) values('33','韩伟佳','HWJ');
+insert into `user`(id, name, py) values('34','韩扬谦','HYQ');
+insert into `user`(id, name, py) values('35','郝静生','HJS');
+insert into `user`(id, name, py) values('36','何柏红','HBH');
+insert into `user`(id, name, py) values('37','何彩智','HCZ');
+insert into `user`(id, name, py) values('38','何陶增','HTZ');
+insert into `user`(id, name, py) values('39','何薇','HZ');
+insert into `user`(id, name, py) values('40','何小凡','HXF');
+insert into `user`(id, name, py) values('41','何振平','HZP');
+insert into `user`(id, name, py) values('42','洪彩辉','HCH');
+insert into `user`(id, name, py) values('43','胡仕明','HSM');
+insert into `user`(id, name, py) values('44','黄建朋','HJP');
+insert into `user`(id, name, py) values('45','黄祥荣','HXR');
+insert into `user`(id, name, py) values('46','黄璇平','HZP');
+insert into `user`(id, name, py) values('47','贾茂飞','JMF');
+insert into `user`(id, name, py) values('48','李迪茹','LDR');
+insert into `user`(id, name, py) values('49','李桂博','LGB');
+insert into `user`(id, name, py) values('50','李国祯','LGZ');
+insert into `user`(id, name, py) values('51','李宏川','LHC');
+insert into `user`(id, name, py) values('52','李梅','LM');
+insert into `user`(id, name, py) values('53','李媚文','LMW');
+insert into `user`(id, name, py) values('54','李孟惠','LMH');
+insert into `user`(id, name, py) values('55','李南懋','LNZ');
+insert into `user`(id, name, py) values('56','李鹏龙','LPL');
+insert into `user`(id, name, py) values('57','李诗庸','LSY');
+insert into `user`(id, name, py) values('58','李姝勇','LZY');
+insert into `user`(id, name, py) values('59','李树鹏','LSP');
+insert into `user`(id, name, py) values('60','李薇红','LZH');
+insert into `user`(id, name, py) values('61','李文章','LWZ');
+insert into `user`(id, name, py) values('62','李星佳','LXJ');
+insert into `user`(id, name, py) values('63','李兴','LX');
+insert into `user`(id, name, py) values('64','李秀倩','LXZ');
+insert into `user`(id, name, py) values('65','李艳生','LYS');
+insert into `user`(id, name, py) values('66','李燕金','LYJ');
+insert into `user`(id, name, py) values('67','李玉彪','LYB');
+insert into `user`(id, name, py) values('68','李振峰','LZF');
+insert into `user`(id, name, py) values('69','梁斌芳','LBF');
+insert into `user`(id, name, py) values('70','梁国云','LGY');
+insert into `user`(id, name, py) values('71','梁巧爱','LQA');
+insert into `user`(id, name, py) values('72','梁照金','LZJ');
+insert into `user`(id, name, py) values('73','林婧美','LZM');
+insert into `user`(id, name, py) values('74','林沛寿','LPS');
+insert into `user`(id, name, py) values('75','林薇程','LZC');
+insert into `user`(id, name, py) values('76','林伟玉','LWY');
+insert into `user`(id, name, py) values('77','林艺玲','LYL');
+insert into `user`(id, name, py) values('78','刘睿','LR');
+insert into `user`(id, name, py) values('79','刘芊芊','LQQ');
+insert into `user`(id, name, py) values('80','刘海波','LHB');
+insert into `user`(id, name, py) values('81','刘斓琴','LZQ');
+insert into `user`(id, name, py) values('82','刘磊东','LLD');
+insert into `user`(id, name, py) values('83','刘明琪','LMZ');
+insert into `user`(id, name, py) values('84','刘铭恩','LME');
+insert into `user`(id, name, py) values('85','刘任恺','LRZ');
+insert into `user`(id, name, py) values('86','刘水秋','LSQ');
+insert into `user`(id, name, py) values('87','刘文萱','LWZ');
+insert into `user`(id, name, py) values('88','刘祥瑶','LXY');
+insert into `user`(id, name, py) values('89','刘薪坪','LXP');
+insert into `user`(id, name, py) values('90','刘秀涛','LXT');
+insert into `user`(id, name, py) values('91','刘彦利','LYL');
+insert into `user`(id, name, py) values('92','刘益存','LYC');
+insert into `user`(id, name, py) values('93','龙子苹','LZP');
+insert into `user`(id, name, py) values('94','卢秀剑','LXJ');
+insert into `user`(id, name, py) values('95','罗乔华','LQH');
+insert into `user`(id, name, py) values('96','罗希清','LXQ');
+insert into `user`(id, name, py) values('97','马家兰','MJL');
+insert into `user`(id, name, py) values('98','马莲莹','MLY');
+insert into `user`(id, name, py) values('99','马宁文','MNW');
+insert into `user`(id, name, py) values('100','马水鹏','MSP');
+insert into `user`(id, name, py) values('101','孟三云','MSY');
+insert into `user`(id, name, py) values('102','孟寿云','MSY');
+insert into `user`(id, name, py) values('103','聂伟元','NWY');
+insert into `user`(id, name, py) values('104','潘永飞','PYF');
+insert into `user`(id, name, py) values('105','彭健颖','PJY');
+insert into `user`(id, name, py) values('106','钱文松','QWS');
+insert into `user`(id, name, py) values('107','屈江珍','QJZ');
+insert into `user`(id, name, py) values('108','邵建林','SJL');
+insert into `user`(id, name, py) values('109','施家晖','SJZ');
+insert into `user`(id, name, py) values('110','施艺英','SYY');
+insert into `user`(id, name, py) values('111','孙常程','SCC');
+insert into `user`(id, name, py) values('112','谭佳盈','TJY');
+insert into `user`(id, name, py) values('113','唐春珊','TCS');
+insert into `user`(id, name, py) values('114','唐军霞','TJX');
+insert into `user`(id, name, py) values('115','唐里丽','TLL');
+insert into `user`(id, name, py) values('116','陶姐华','TJH');
+insert into `user`(id, name, py) values('117','万圻艳','WZY');
+insert into `user`(id, name, py) values('118','王傲凤','WAF');
+insert into `user`(id, name, py) values('119','王德英','WDY');
+insert into `user`(id, name, py) values('120','王鼎华','WDH');
+insert into `user`(id, name, py) values('121','王慧','WH');
+insert into `user`(id, name, py) values('122','王佳光','WJG');
+insert into `user`(id, name, py) values('123','王家胜','WJS');
+insert into `user`(id, name, py) values('124','王竞飞','WJF');
+insert into `user`(id, name, py) values('125','王科磊','WKL');
+insert into `user`(id, name, py) values('126','王丽章','WLZ');
+insert into `user`(id, name, py) values('127','王励苗','WLM');
+insert into `user`(id, name, py) values('128','王美东','WMD');
+insert into `user`(id, name, py) values('129','王美媛','WMZ');
+insert into `user`(id, name, py) values('130','王蕊颖','WRY');
+insert into `user`(id, name, py) values('131','王士成','WSC');
+insert into `user`(id, name, py) values('132','王熙斌','WXB');
+insert into `user`(id, name, py) values('133','王香军','WXJ');
+insert into `user`(id, name, py) values('134','王休娜','WXN');
+insert into `user`(id, name, py) values('135','王仪行','WYX');
+insert into `user`(id, name, py) values('136','王赢基','WYJ');
+insert into `user`(id, name, py) values('137','王云芯','WYX');
+insert into `user`(id, name, py) values('138','王郑林','WZL');
+insert into `user`(id, name, py) values('139','王治良','WZL');
+insert into `user`(id, name, py) values('140','王忠宇','WZY');
+insert into `user`(id, name, py) values('141','王子冰','WZB');
+insert into `user`(id, name, py) values('142','韦新裕','WXY');
+insert into `user`(id, name, py) values('143','魏复冉','WFR');
+insert into `user`(id, name, py) values('144','吴翰志','WHZ');
+insert into `user`(id, name, py) values('145','吴美森','WMS');
+insert into `user`(id, name, py) values('146','吴翔良','WXL');
+insert into `user`(id, name, py) values('147','吴艳伟','WYW');
+insert into `user`(id, name, py) values('148','吴钲辉','WZH');
+insert into `user`(id, name, py) values('149','向盼洛','XPL');
+insert into `user`(id, name, py) values('150','萧恩','XE');
+insert into `user`(id, name, py) values('151','萧军杰','XJJ');
+insert into `user`(id, name, py) values('152','萧圣梅','XSM');
+insert into `user`(id, name, py) values('153','谢辰吉','XCJ');
+insert into `user`(id, name, py) values('154','徐郎求','XLQ');
+insert into `user`(id, name, py) values('155','徐铭森','XMS');
+insert into `user`(id, name, py) values('156','徐蓉伟','XRW');
+insert into `user`(id, name, py) values('157','许为梧','XWW');
+insert into `user`(id, name, py) values('158','阎皓河','YZH');
+insert into `user`(id, name, py) values('159','阎思华','YSH');
+insert into `user`(id, name, py) values('160','杨爱秀','YAX');
+insert into `user`(id, name, py) values('161','杨昆飞','YKF');
+insert into `user`(id, name, py) values('162','杨良林','YLL');
+insert into `user`(id, name, py) values('163','杨少君','YSJ');
+insert into `user`(id, name, py) values('164','杨玉丽','YYL');
+insert into `user`(id, name, py) values('165','杨之安','YZA');
+insert into `user`(id, name, py) values('166','尤榕锋','YZF');
+insert into `user`(id, name, py) values('167','余俊珠','YJZ');
+insert into `user`(id, name, py) values('168','袁江蔓','YJM');
+insert into `user`(id, name, py) values('169','张必翰','ZBH');
+insert into `user`(id, name, py) values('170','张昌颜','ZCY');
+insert into `user`(id, name, py) values('171','张恩星','ZEX');
+insert into `user`(id, name, py) values('172','张飞强','ZFQ');
+insert into `user`(id, name, py) values('173','张凤焯','ZFZ');
+insert into `user`(id, name, py) values('174','张国强','ZGQ');
+insert into `user`(id, name, py) values('175','张计欣','ZJX');
+insert into `user`(id, name, py) values('176','张家颖','ZJY');
+insert into `user`(id, name, py) values('177','张金安','ZJA');
+insert into `user`(id, name, py) values('178','张莉','ZL');
+insert into `user`(id, name, py) values('179','张米龙','ZML');
+insert into `user`(id, name, py) values('180','张善渊','ZSY');
+insert into `user`(id, name, py) values('181','张万敏','ZWM');
+insert into `user`(id, name, py) values('182','张晓林','ZXL');
+insert into `user`(id, name, py) values('183','张秀高','ZXG');