فهرست منبع

新增分页插件

周浩 9 سال پیش
والد
کامیت
a3c80ed786

+ 13 - 0
hsweb-web-dao-impl-mybatis/src/main/java/org/hsweb/web/mybatis/plgins/pager/PagerHelper.java

@@ -0,0 +1,13 @@
+package org.hsweb.web.mybatis.plgins.pager;
+
+import org.hsweb.web.bean.common.QueryParam;
+
+/**
+ * Created by zhouhao on 16-4-13.
+ */
+public interface PagerHelper {
+
+    String getDialect();
+
+    String doPaging(QueryParam param, String sql);
+}

+ 88 - 0
hsweb-web-dao-impl-mybatis/src/main/java/org/hsweb/web/mybatis/plgins/pager/PagerInterceptor.java

@@ -0,0 +1,88 @@
+package org.hsweb.web.mybatis.plgins.pager;
+
+import org.apache.ibatis.executor.Executor;
+import org.apache.ibatis.executor.statement.StatementHandler;
+import org.apache.ibatis.mapping.MappedStatement;
+import org.apache.ibatis.plugin.*;
+import org.apache.ibatis.reflection.MetaObject;
+import org.apache.ibatis.reflection.SystemMetaObject;
+import org.apache.ibatis.session.ResultHandler;
+import org.apache.ibatis.session.RowBounds;
+import org.hsweb.web.bean.common.QueryParam;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.ApplicationContext;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+
+//@Intercepts({ @Signature(type = Executor.class, method = "query", args = { MappedStatement.class, Object.class,
+//        RowBounds.class, ResultHandler.class }) })
+//@Component
+//@ConfigurationProperties(
+//        prefix = "spring.datasource"
+//)
+public class PagerInterceptor implements Interceptor {
+    protected Logger logger = LoggerFactory.getLogger(this.getClass());
+    protected Map<String, PagerHelper> pagerHelperBase = new HashMap<>();
+
+    protected String dialect = null;
+    @Autowired
+    private ApplicationContext context;
+    @Autowired
+    private DataSourceProperties properties;
+
+    @Override
+    public Object intercept(Invocation target) throws Throwable {
+        return target.proceed();
+    }
+
+    @Override
+    public Object plugin(Object target) {
+        if (target instanceof StatementHandler) {
+            StatementHandler statementHandler = (StatementHandler) target;
+            MetaObject metaStatementHandler = SystemMetaObject.forObject(statementHandler);
+            String sql = statementHandler.getBoundSql().getSql();
+            Object obj = statementHandler.getParameterHandler().getParameterObject();
+            if (obj instanceof QueryParam) {
+                QueryParam param = (QueryParam) obj;
+                PagerHelper helper = pagerHelperBase.get(dialect);
+                if (helper != null) {
+                    String newSql = helper.doPaging(param, sql);
+                    metaStatementHandler.setValue("delegate.boundSql.sql", newSql);
+                }
+            }
+        }
+        return Plugin.wrap(target,this);
+    }
+
+    @Override
+    public void setProperties(Properties properties) {
+
+    }
+
+    @PostConstruct
+    public void init() {
+        Map<String, PagerHelper> helperMap = context.getBeansOfType(PagerHelper.class);
+        helperMap.forEach((name, helper) -> pagerHelperBase.put(helper.getDialect(), helper));
+        dialect = getDialect();
+    }
+
+    public String getDialect() {
+        String url = properties.getDriverClassName();
+        if (url.contains("mysql")) {
+            return "mysql";
+        }
+        if (url.contains("oracle")) {
+            return "oracle";
+        }
+        logger.error("mybaits pager dialect not found!");
+        return "undefine";
+    }
+}

+ 40 - 0
hsweb-web-dao-impl-mybatis/src/main/java/org/hsweb/web/mybatis/plgins/pager/dialect/MysqlPagerHelper.java

@@ -0,0 +1,40 @@
+package org.hsweb.web.mybatis.plgins.pager.dialect;
+
+import org.hsweb.web.bean.common.QueryParam;
+import org.hsweb.web.mybatis.plgins.pager.PagerHelper;
+import org.springframework.stereotype.Component;
+import org.webbuilder.utils.common.StringUtils;
+
+/**
+ * Created by zhouhao on 16-4-13.
+ */
+@Component
+public class MysqlPagerHelper implements PagerHelper {
+    @Override
+    public String doPaging(QueryParam param, String sql) {
+        StringBuilder builder = new StringBuilder();
+        builder.append(buildSortSql(param, sql)); //sql格式化
+        if (param.isPaging())
+            builder.append(" limit ")
+                    .append(param.getPageSize() * param.getPageIndex())
+                    .append(",")
+                    .append(param.getPageSize() * (param.getPageIndex() + 1));
+        return builder.toString();
+    }
+
+    protected String buildSortSql(QueryParam param, String sql) {
+        StringBuilder builder = new StringBuilder(sql);
+        if (!StringUtils.isNullOrEmpty(param.getSortField())) {
+            builder.append(" order by ").append(param.getSortField());
+            if (!StringUtils.isNullOrEmpty(param.getSortOrder())) {
+                builder.append(" ").append(param.getSortOrder());
+            }
+        }
+        return builder.toString();
+    }
+
+    @Override
+    public String getDialect() {
+        return "mysql";
+    }
+}

+ 45 - 0
hsweb-web-dao-impl-mybatis/src/main/java/org/hsweb/web/mybatis/plgins/pager/dialect/OraclePagerHelper.java

@@ -0,0 +1,45 @@
+package org.hsweb.web.mybatis.plgins.pager.dialect;
+
+import org.hsweb.web.bean.common.QueryParam;
+import org.hsweb.web.mybatis.plgins.pager.PagerHelper;
+import org.springframework.stereotype.Component;
+import org.webbuilder.utils.common.StringUtils;
+
+/**
+ * Created by zhouhao on 16-4-13.
+ */
+@Component
+public class OraclePagerHelper implements PagerHelper {
+    @Override
+    public String doPaging(QueryParam param, String sql) {
+        if (!param.isPaging()) {
+            return buildSortSql(param, sql);
+        }
+        int startWith = param.getPageSize() * (param.getPageIndex() + 1);
+        StringBuilder builder = new StringBuilder()
+                .append("select * from ( select row_.*, rownum rownum_ from (")
+                .append(buildSortSql(param, sql))
+                .append(") row_ )")
+                .append("where rownum_ <= ")
+                .append(startWith)
+                .append(" and rownum_ > ")
+                .append(param.getPageSize() * param.getPageIndex());
+        return builder.toString();
+    }
+
+    protected String buildSortSql(QueryParam param, String sql) {
+        StringBuilder builder = new StringBuilder(sql);
+        if (!StringUtils.isNullOrEmpty(param.getSortField())) {
+            builder.append(" order by ").append(param.getSortField());
+            if (!StringUtils.isNullOrEmpty(param.getSortOrder())) {
+                builder.append(" ").append(param.getSortOrder());
+            }
+        }
+        return builder.toString();
+    }
+
+    @Override
+    public String getDialect() {
+        return "oracle";
+    }
+}