crabc-源碼閱讀記錄

crabc 項目地址:

https://gitee.com/linebyte/crabc.git

一、接口地址匹配功能

控制器 匹配 /api/web 開頭的請求,參數通過 @RequestParam Map<String, Object> paramMap 來接收

@RestController
@RequestMapping("/api/web")
public class ApiServiceController {

    @Autowired
    private IBaseDataService baseDataService;

    /**
     * API GET請求方法
     *
     * @return
     */
    @RequestMapping(value = "/**", method = {RequestMethod.GET, RequestMethod.DELETE})
    public Result getService(@RequestParam Map<String, Object> paramMap) {
        ApiInfoDTO api = ApiThreadLocal.get();
        if (api == null) {
            return Result.error(ErrorStatusEnum.API_INVALID.getCode(), ErrorStatusEnum.API_INVALID.getMassage());
        }
        Object data = baseDataService.execute(api.getDatasourceId(), api.getSchemaName(), api.getSqlScript(), paramMap);
        return Result.success(data);
    }

    /**
     * API post請求
     *
     * @param paramMap
     * @param body
     * @return
     */
    @RequestMapping(value = "/**", method = {RequestMethod.POST, RequestMethod.PUT})
    public Result postService(@RequestParam Map<String, Object> paramMap, @RequestBody Object body) {
        ApiInfoDTO api = ApiThreadLocal.get();
        if (api == null) {
            return Result.error(ErrorStatusEnum.API_INVALID.getCode(), ErrorStatusEnum.API_INVALID.getMassage());
        }
        if (paramMap == null) {
            paramMap = new HashMap<>();
        }
        if (body instanceof Map) {
            Map<String, Object> map = (Map<String, Object>) body;
            paramMap.putAll(map);
        }
        Object data = baseDataService.execute(api.getDatasourceId(), api.getSchemaName(), api.getSqlScript(), paramMap);
        return Result.success(data);
    }
}

二、腳本支持Mybatis標籤功能

Crabc支持Mybatis標籤語法的SQL,可直接在編輯框中使用Mybatis標籤語法。

依靠 mybatis 提供的註解 SelectProvider  InsertProvider  UpdateProvider 來實現

1)測試類

 

@Autowired
private BaseDataHandleMapper baseDataHandleMapper;

    /**
     * 任務初始化
     */
    @Scheduled(fixedDelay = 2000)
    public void executeQuery() {
        List<Map<String, Object>> list = new ArrayList<>();
        Map<String, Object> paramsMap = new HashMap<>();
//        paramsMap.put(BaseConstant.BASE_SQL,"select * from agv ");
//        list = baseDataHandleMapper.executeQuery(paramsMap);
//        System.out.println(list);

        paramsMap.put(BaseConstant.BASE_SQL,"update \n" +
                "agv\n" +
                "set description = #{remark}\n" +
                "<where>\n" +
                " <if test=\"Id != null and Id !=''\"> and id =#{Id} </if> \n" +
                "</where>\n");
        paramsMap.put("Id","1612735377049174018");
        paramsMap.put("remark","zwhtest");
        int i = baseDataHandleMapper.executeUpdate(paramsMap);
        System.out.println(i);


    }

2)Mapper 類


import org.apache.ibatis.annotations.InsertProvider;
import org.apache.ibatis.annotations.SelectProvider;
import org.apache.ibatis.annotations.UpdateProvider;

import java.util.List;
import java.util.Map;

/**
 * 通用數據操作 Mapper
 *
 * @author yuqf
 */
public interface BaseDataHandleMapper {

    /**
     * 查詢類SQL
     * @param params
     * @return
     */
    @SelectProvider(type = BaseSelectProvider.class, method = "executeQuery")
    List<Map<String, Object>> executeQuery(Map<String, Object> params);

    /**
     * 新增類SQL
     * @param params
     * @return
     */
    @InsertProvider(type = BaseSelectProvider.class, method = "executeInsert")
    Integer executeInsert(Map<String, Object> params);

    /**
     * 修改類SQL
     * @param params
     * @return
     */
    @UpdateProvider(type = BaseSelectProvider.class, method = "executeUpdate")
    Integer executeUpdate(Map<String, Object> params);

    /**
     * 刪除類SQL
     * @param params
     * @return
     */
    @UpdateProvider(type = BaseSelectProvider.class, method = "executeDelete")
    Integer executeDelete(Map<String, Object> params);
}

三、 Provider 類


import java.util.Map;

/**
 * mybatis SQL提供器
 *
 * @author yuqf
 */
public class BaseSelectProvider {

    /**
     * 添加腳本標籤前綴
     * @param sql
     * @return
     */
    private String addScript(String sql){
        if (sql.contains("</if>") || sql.contains("</foreach>") || sql.contains("<where>") || sql.contains("<set>") || sql.contains("<choose>") || sql.contains("<when>") || sql.contains("</trim>")) {
            sql = "<script> " + sql + " </script>";
        }
        return sql;
    }

    /**
     * 查詢類
     * @param params
     * @return
     */
    public String executeQuery(Map<String, Object> params) {
        String sql = params.get(BaseConstant.BASE_SQL).toString();
        params.remove(BaseConstant.BASE_SQL);
        sql = this.addScript(sql);
        return sql;
    }


    /**
     * 新增類
     * @param params
     * @return
     */
    public String executeInsert(Map<String, Object> params) {
        String sql = params.get(BaseConstant.BASE_SQL).toString();
        params.remove(BaseConstant.BASE_SQL);
        sql = this.addScript(sql);
        return sql;
    }

    /**
     * 修改類
     * @param params
     * @return
     */
    public String executeUpdate(Map<String, Object> params) {
        String sql = params.get(BaseConstant.BASE_SQL).toString();
        params.remove(BaseConstant.BASE_SQL);
        sql = this.addScript(sql);
        return sql;
    }

    /**
     * 刪除類
     * @param params
     * @return
     */
    public String executeDelete(Map<String, Object> params) {
        String sql = params.get(BaseConstant.BASE_SQL).toString();
        params.remove(BaseConstant.BASE_SQL);
        sql = this.addScript(sql);
        return sql;
    }
}

4) 常量類


/**
 * 常量類
 *
 * @author yuqf
 */
public class BaseConstant {

    /**
     * SQL腳本
     */
    public final static String BASE_SQL = "base_sql";

    /**
     * 數據源ID
     */
    public final static String DATA_SOURCE_ID = "data_source_id";

    /**
     * 頁碼
     */
    public final static String PAGE_NUM = "pageNum";

    /**
     * 每頁大小
     */
    public final static String PAGE_SIZE = "pageSize";

    /**
     * 分頁設置
     */
    public final static String PAGE_SETUP = "pageSetup";

    /**
     * 分頁統計
     */
    public final static Integer PAGE_COUNT = 2;

    /**
     * 只分頁
     */
    public final static Integer PAGE_ONLY = 1;

    /**
     * redis
     */
    public final static String REDIS_CACHE = "redis";

    /**
     * API數據緩存
     */
    public static final String CACHE_API_DETAIL = "api_detail";

    public static final String CACHE_METADATA_CATALOG = "metadata_catalog:";
    /**
     * redis緩存schema
     */
    public static final String CACHE_METADATA_SCHEMA = "metadata_schema:";
    /**
     * redis緩存表
     */
    public static final String CACHE_METADATA_TABLE = "metadata_table:";
    /**
     * redis緩存字段
     */
    public static final String CACHE_METADATA_COLUMN = "metadata_column:";
    /**
     * SQL執行方式
     */
    public static final String BASE_API_EXEC_TYPE = "base_api_exec_type:";
}

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章