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:";
}