浏览代码

增加Java接口

mxd 5 年之前
父节点
当前提交
69af6be30a

+ 5 - 0
pom.xml

@@ -46,6 +46,11 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
         </dependency>
+        <dependency>
+            <groupId>commons-beanutils</groupId>
+            <artifactId>commons-beanutils</artifactId>
+            <version>1.9.3</version>
+        </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>

+ 18 - 0
src/main/java/org/ssssssss/magicapi/context/RequestContext.java

@@ -5,6 +5,7 @@ import org.springframework.web.context.request.RequestAttributes;
 import org.springframework.web.context.request.ServletWebRequest;
 import org.springframework.web.servlet.HandlerMapping;
 import org.ssssssss.magicapi.expression.ExpressionEngine;
+import org.ssssssss.magicapi.model.Page;
 import org.ssssssss.magicapi.session.Statement;
 
 import javax.servlet.http.HttpServletRequest;
@@ -28,6 +29,19 @@ public class RequestContext extends HashMap<String, Object> {
 
     private Statement statement;
 
+    private Page page;
+
+    public RequestContext(Map<String, Object> params, ExpressionEngine engine) {
+        putAll(params);
+        this.engine = engine;
+    }
+
+    public RequestContext(Map<String, Object> params, Page page, ExpressionEngine engine) {
+        putAll(params);
+        this.page = page;
+        this.engine = engine;
+    }
+
     public RequestContext(HttpServletRequest request, ExpressionEngine engine) {
         this.request = request;
         this.engine = engine;
@@ -111,4 +125,8 @@ public class RequestContext extends HashMap<String, Object> {
     public void setStatement(Statement statement) {
         this.statement = statement;
     }
+
+    public Page getPage() {
+        return page;
+    }
 }

+ 4 - 2
src/main/java/org/ssssssss/magicapi/executor/StatementExecutor.java

@@ -148,8 +148,10 @@ public class StatementExecutor {
         if (sqlStatement.isPagination()) {  //判断是否是分页语句
             // 获取要执行的SQL
             String sql = sqlStatement.getSqlNode().getSql(context).trim();
-            // 从Request中提取Page对象
-            Page page = pageProvider.getPage(context.getRequest());
+            // 获取Page对象
+            Page page = context.getPage();
+            // 当Page对象为空时,从Request中提取Page对象
+            page = page == null ? pageProvider.getPage(context.getRequest()) : page;
             // 获取数据库方言
             Dialect dialect = sqlExecutor.getDialect(sqlStatement.getDataSourceName());
             PageResult<Object> pageResult = new PageResult<>();

+ 128 - 0
src/main/java/org/ssssssss/magicapi/service/DefaultMagicAPIService.java

@@ -0,0 +1,128 @@
+package org.ssssssss.magicapi.service;
+
+import org.apache.commons.beanutils.BeanUtils;
+import org.ssssssss.magicapi.context.RequestContext;
+import org.ssssssss.magicapi.exception.MagicAPIException;
+import org.ssssssss.magicapi.executor.StatementExecutor;
+import org.ssssssss.magicapi.expression.ExpressionEngine;
+import org.ssssssss.magicapi.model.Page;
+import org.ssssssss.magicapi.model.PageResult;
+import org.ssssssss.magicapi.session.Configuration;
+import org.ssssssss.magicapi.session.Statement;
+import org.ssssssss.magicapi.utils.Assert;
+
+import java.lang.reflect.InvocationTargetException;
+import java.sql.SQLException;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+public class DefaultMagicAPIService implements MagicAPIService {
+
+    private Configuration configuration;
+
+    private StatementExecutor statementExecutor;
+
+    private ExpressionEngine expressionEngine;
+
+    public DefaultMagicAPIService(Configuration configuration, StatementExecutor statementExecutor, ExpressionEngine expressionEngine) {
+        this.configuration = configuration;
+        this.statementExecutor = statementExecutor;
+        this.expressionEngine = expressionEngine;
+    }
+
+    private Statement getStatement(String statementId) {
+        Statement statement = configuration.getStatementById(statementId);
+        Assert.isNotNull(statement, String.format("找不到%s", statementId));
+        return statement;
+    }
+
+    private RequestContext createRequestContext(Map<String, Object> params) {
+        return new RequestContext(params, this.expressionEngine);
+    }
+
+    private RequestContext createRequestContext(Map<String, Object> params, Page page) {
+        return new RequestContext(params, page, this.expressionEngine);
+    }
+
+    private <T> T convertToObject(Object source, Class<T> clazz) {
+        try {
+            if (source == null) {
+                return null;
+            }
+            if (clazz.isAssignableFrom(String.class)) {
+                return (T) source.toString();
+            } else if (source instanceof Map) {
+                T target = clazz.newInstance();
+                Map<String, ? extends Object> sourceMap = (Map<String, ? extends Object>) source;
+                BeanUtils.populate(target, sourceMap);
+                return target;
+            }
+            return (T) source;
+        } catch (InvocationTargetException | IllegalAccessException | InstantiationException e) {
+            throw new MagicAPIException("类型转换失败", e);
+        }
+    }
+
+
+    @Override
+    public Object execute(String statementId, Map<String, Object> params) {
+        try {
+            return this.statementExecutor.execute(getStatement(statementId), createRequestContext(params));
+        } catch (SQLException | ClassNotFoundException e) {
+            throw new MagicAPIException("执行出错", e);
+        }
+    }
+
+    @Override
+    public <T> T queryForObject(String statementId, Map<String, Object> params, Class<T> clazz) {
+        try {
+            Object object = this.statementExecutor.execute(getStatement(statementId), createRequestContext(params));
+            return convertToObject(object, clazz);
+        } catch (SQLException | ClassNotFoundException e) {
+            throw new MagicAPIException("执行出错", e);
+        }
+    }
+
+    @Override
+    public <T> List<T> queryForList(String statementId, Map<String, Object> params, Class<T> clazz) {
+        try {
+            Object object = this.statementExecutor.execute(getStatement(statementId), createRequestContext(params));
+            if (object == null) {
+                return null;
+            }
+            Assert.isTrue(object instanceof List, String.format("%s返回值类型为%s,应为List", statementId, object.getClass()));
+            return ((List<Object>) object).stream().map(item -> convertToObject(item, clazz)).collect(Collectors.toList());
+        } catch (SQLException | ClassNotFoundException e) {
+            throw new MagicAPIException("执行出错", e);
+        }
+    }
+
+    @Override
+    public <T> PageResult<T> queryForPage(String statementId, Page page, Map<String, Object> params, Class<T> clazz) {
+        try {
+            Object object = this.statementExecutor.execute(getStatement(statementId), createRequestContext(params, page));
+            if (object == null) {
+                return new PageResult<>(0, Collections.emptyList());
+            }
+            Assert.isTrue(object instanceof PageResult, String.format("%s返回值类型为%s,应为PageResult", statementId, object.getClass()));
+            PageResult<Object> pageResult = (PageResult<Object>) object;
+            return new PageResult<>(pageResult.getTotal(), pageResult.getList().stream().map(item -> convertToObject(item, clazz)).collect(Collectors.toList()));
+        } catch (SQLException | ClassNotFoundException e) {
+            throw new MagicAPIException("执行出错", e);
+        }
+    }
+
+    @Override
+    public int update(String statementId, Map<String, Object> params) {
+        try {
+            Object object = this.statementExecutor.execute(getStatement(statementId), createRequestContext(params));
+            Assert.isTrue(object != null, String.format("%s返回值为null,应为Number", statementId));
+            Assert.isTrue(object instanceof Number, String.format("%s返回值类型为%s,应为Number", statementId, object.getClass()));
+            return ((Number) object).intValue();
+        } catch (SQLException | ClassNotFoundException e) {
+            throw new MagicAPIException("执行出错", e);
+        }
+    }
+}

+ 42 - 0
src/main/java/org/ssssssss/magicapi/service/MagicAPIService.java

@@ -0,0 +1,42 @@
+package org.ssssssss.magicapi.service;
+
+import org.ssssssss.magicapi.model.Page;
+import org.ssssssss.magicapi.model.PageResult;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+public interface MagicAPIService {
+
+    default Object execute(String statementId) {
+        return execute(statementId, Collections.emptyMap());
+    }
+
+    Object execute(String statementId, Map<String, Object> params);
+
+    default <T> T queryForObject(String statementId, Class<T> clazz) {
+        return queryForObject(statementId, Collections.emptyMap(), clazz);
+    }
+
+    <T> T queryForObject(String statementId, Map<String, Object> params, Class<T> clazz);
+
+    default <T> List<T> queryForList(String statementId, Class<T> clazz) {
+        return queryForList(statementId, Collections.emptyMap(), clazz);
+    }
+
+    <T> List<T> queryForList(String statementId, Map<String, Object> params, Class<T> clazz);
+
+    default <T> PageResult<T> queryForPage(String statementId, Page page, Class<T> clazz) {
+        return queryForPage(statementId, page, Collections.emptyMap(), clazz);
+    }
+
+    <T> PageResult<T> queryForPage(String statementId, Page page, Map<String, Object> params, Class<T> clazz);
+
+    default int update(String statementId) {
+        return update(statementId, Collections.emptyMap());
+    }
+
+    int update(String statementId, Map<String, Object> params);
+
+}