"...main/resources/git@ustchcs.com:gujinli1118/eladmin.git" did not exist on "40c2c880ca76a27935c0c61ce43df7ca3ea97d68"
Commit f610086a authored by trumansdo's avatar trumansdo
Browse files

待提交文档

parent a3d658f6
DELIMITER_PLACEHOLDER_START=# DELIMITER_PLACEHOLDER_START=#
DELIMITER_PLACEHOLDER_END=# DELIMITER_PLACEHOLDER_END=#
DELIMITER_STATEMENT_START=--: DELIMITER_STATEMENT_START=>-
DELIMITER_STATEMENT_END= DELIMITER_STATEMENT_END=
#\u51FD\u6570\u6CE8\u518C #\u51FD\u6570\u6CE8\u518C
FN.isEmpty=org.beetl.ext.fn.EmptyExpressionFunction FN.isEmpty=org.beetl.ext.fn.EmptyExpressionFunction
......
...@@ -38,64 +38,15 @@ public class CustomBeanProcessorTest { ...@@ -38,64 +38,15 @@ public class CustomBeanProcessorTest {
@Autowired GroupTemplate template; @Autowired GroupTemplate template;
static JSONObject resultMappping;
@BeforeClass
public static void init() {
resultMappping = new JSONObject();
resultMappping.put("id", "core_route_map");
JSONObject routeMapping = new JSONObject();
routeMapping.put("id", "id");
routeMapping.put("parentId", "parent_id");
routeMapping.put("path", "path");
routeMapping.put("name", "name");
routeMapping.put("seq", "seq");
JSONObject metaMapping = new JSONObject();
metaMapping.put("title", "title");
metaMapping.put("icon", "icon");
JSONArray roles = new JSONArray();
JSONObject roleidMapping = new JSONObject();
roleidMapping.put("id", "role_id");
roles.add(roleidMapping);
metaMapping.put("roles", roles);
metaMapping.put("resultType", CoreRouteMeta.class.getCanonicalName());
JSONObject testMapping = new JSONObject();
testMapping.put("id", "test_id");
testMapping.put("username", "username");
testMapping.put("password", "password");
testMapping.put("resultType", entity.Test.class.getCanonicalName());
routeMapping.put("meta", metaMapping);
routeMapping.put("resultType", CoreRoute.class.getCanonicalName());
resultMappping.put("mapping", routeMapping);
}
@Before @Before
public void beanProcessor() { public void beanProcessor() {
JsonBeanProcessor jsonBeanProcessor = new JsonBeanProcessor(sqlManager); JsonBeanProcessor jsonBeanProcessor = new JsonBeanProcessor(sqlManager);
sqlManager.setDefaultBeanProcessors(jsonBeanProcessor); sqlManager.setDefaultBeanProcessors(jsonBeanProcessor);
Map<Class, JavaSqlTypeHandler> typeHandlerMap =
sqlManager.getDefaultBeanProcessors().getHandlers();
/*Java bean的属性类型处理器,从数据库类型转化到属性Date类型*/
typeHandlerMap.remove(Date.class);
typeHandlerMap.put(Date.class, new DateTypeHandler());
typeHandlerMap.put(ZonedDateTime.class, new ZonedDateTimeTypeHandler());
} }
@Test @Test
public void maptest() { public void maptest() {
GridMapping gridMapping = new GridMapping(resultMappping);
CacheUtil.put("Route_Mapping", gridMapping);
List<CoreRoute> routesList = coreFunctionDao.getAllRoutes(); List<CoreRoute> routesList = coreFunctionDao.getAllRoutes();
System.out.println(routesList); System.out.println(routesList);
System.out.println(JSONUtil.toJsonPrettyStr(resultMappping));
} }
} }
...@@ -33,7 +33,12 @@ public class JsonBeanProcessor extends BeanProcessor { ...@@ -33,7 +33,12 @@ public class JsonBeanProcessor extends BeanProcessor {
super(sm); super(sm);
} }
public void getResultSet(ResultSet resultSet) throws SQLException { /**
* 网格化输出结果集
* @param resultSet
* @throws SQLException
*/
public void printfResultSet(ResultSet resultSet) throws SQLException {
Map<String, List<Object>> map = MapUtil.<String, List<Object>>builder().build(); Map<String, List<Object>> map = MapUtil.<String, List<Object>>builder().build();
ResultSetMetaData metaData = resultSet.getMetaData(); ResultSetMetaData metaData = resultSet.getMetaData();
int count = metaData.getColumnCount(); int count = metaData.getColumnCount();
...@@ -80,10 +85,12 @@ public class JsonBeanProcessor extends BeanProcessor { ...@@ -80,10 +85,12 @@ public class JsonBeanProcessor extends BeanProcessor {
Map json = (Map) CacheUtil.get(sqlId); Map json = (Map) CacheUtil.get(sqlId);
GridMapping mapping = new GridMapping(json); GridMapping mapping = new GridMapping(json);
if (null == mapping) { if (null == mapping) {
/*无映射的情况下使用beetlsql默认自带的映射*/
do { do {
results.add(super.createBean(sqlId, rs, type, props, columnToProperty)); results.add(super.createBean(sqlId, rs, type, props, columnToProperty));
} while (rs.next()); } while (rs.next());
} else { } else {
/*复杂结果集映射,取消TailBean的便利性*/
rs.absolute(0); rs.absolute(0);
fillMappingRow(rs, mapping); fillMappingRow(rs, mapping);
results = convertMapping(mapping, type); results = convertMapping(mapping, type);
...@@ -162,12 +169,12 @@ public class JsonBeanProcessor extends BeanProcessor { ...@@ -162,12 +169,12 @@ public class JsonBeanProcessor extends BeanProcessor {
} }
} }
} }
/*TODO 重写,以便提供命名转换*/
BeanUtil.fillBeanWithMap(curObjCol.getBeanMap(), obj, false, true); BeanUtil.fillBeanWithMap(curObjCol.getBeanMap(), obj, true, true);
return obj; return obj;
} }
/** /**
* 填充整个网格映射mapping数据结构 * 填充整个网格映射mapping数据结构:通过网格头映射生成一个个网格行
* *
* @param resultSet * @param resultSet
* @param mapping * @param mapping
...@@ -184,9 +191,10 @@ public class JsonBeanProcessor extends BeanProcessor { ...@@ -184,9 +191,10 @@ public class JsonBeanProcessor extends BeanProcessor {
} }
} }
} }
/** 递归填充mapping结构中的每一行 */ /**
protected GridRow fillRowColumn(ResultSet resultSet, GridHeader header, GridColumn column) * 网格行中存在一个个网格列,也对应着相应的网格头结构
throws SQLException { * */
protected GridRow fillRowColumn(ResultSet resultSet, GridHeader header, GridColumn column) {
/*搜寻已经存在的row,如果没有,则插入一个*/ /*搜寻已经存在的row,如果没有,则插入一个*/
Map<String, Object> beanMap = extractMapFromRs(resultSet, header); Map<String, Object> beanMap = extractMapFromRs(resultSet, header);
Integer calculateKey = GridColumn.calculateKey(beanMap); Integer calculateKey = GridColumn.calculateKey(beanMap);
...@@ -212,6 +220,13 @@ public class JsonBeanProcessor extends BeanProcessor { ...@@ -212,6 +220,13 @@ public class JsonBeanProcessor extends BeanProcessor {
return row; return row;
} }
/**
* 遍历网格头,由网格头的信息从结果集中读取值。<br/>
* 这样做的好处是方便算法编写;坏处是失去了tailbean的处理,因为无法确定结果集列的读取状态。
* @param resultSet
* @param header
* @return
*/
private Map<String, Object> extractMapFromRs(ResultSet resultSet, GridHeader header) { private Map<String, Object> extractMapFromRs(ResultSet resultSet, GridHeader header) {
Map<String, Object> tempBeanMap = MapUtil.newHashMap(); Map<String, Object> tempBeanMap = MapUtil.newHashMap();
/*第一步、先处理当前可以处理的*/ /*第一步、先处理当前可以处理的*/
...@@ -221,7 +236,7 @@ public class JsonBeanProcessor extends BeanProcessor { ...@@ -221,7 +236,7 @@ public class JsonBeanProcessor extends BeanProcessor {
try { try {
tempBeanMap.put(entry.getKey(), resultSet.getObject(entry.getValue())); tempBeanMap.put(entry.getKey(), resultSet.getObject(entry.getValue()));
} catch (SQLException e) { } catch (SQLException e) {
/*普遍错误从resultset中获取一个不存在的列,但可以忽视*/ /*普遍错误从resultset中获取一个不存在的列,但可以忽视*/
} }
} }
return tempBeanMap; return tempBeanMap;
......
...@@ -19,6 +19,7 @@ import com.ibeetl.admin.core.util.beetl.SysFunctionTreeFunction; ...@@ -19,6 +19,7 @@ import com.ibeetl.admin.core.util.beetl.SysFunctionTreeFunction;
import com.ibeetl.admin.core.util.beetl.UUIDFunction; import com.ibeetl.admin.core.util.beetl.UUIDFunction;
import com.ibeetl.admin.core.util.beetl.XXSDefenderFormat; import com.ibeetl.admin.core.util.beetl.XXSDefenderFormat;
import com.ibeetl.admin.core.web.query.QueryParser; import com.ibeetl.admin.core.web.query.QueryParser;
import com.ibeetl.starter.BeetlSqlMutipleSourceCustomize;
import com.ibeetl.starter.BeetlTemplateCustomize; import com.ibeetl.starter.BeetlTemplateCustomize;
import com.ibeetl.starter.ObjectMapperJsonUtil; import com.ibeetl.starter.ObjectMapperJsonUtil;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
...@@ -27,14 +28,20 @@ import java.util.Date; ...@@ -27,14 +28,20 @@ import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import org.apache.commons.jexl2.internal.MapGetExecutor;
import org.beetl.core.Context; import org.beetl.core.Context;
import org.beetl.core.Function; import org.beetl.core.Function;
import org.beetl.core.GroupTemplate; import org.beetl.core.GroupTemplate;
import org.beetl.ext.simulate.WebSimulate; import org.beetl.ext.simulate.WebSimulate;
import org.beetl.sql.core.Interceptor;
import org.beetl.sql.core.InterceptorContext; import org.beetl.sql.core.InterceptorContext;
import org.beetl.sql.core.SQLManager; import org.beetl.sql.core.SQLManager;
import org.beetl.sql.core.engine.SQLPlaceholderST;
import org.beetl.sql.core.mapping.type.JavaSqlTypeHandler; import org.beetl.sql.core.mapping.type.JavaSqlTypeHandler;
import org.beetl.sql.ext.DebugInterceptor; import org.beetl.sql.ext.DebugInterceptor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.Marker;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.AutoConfigureAfter;
...@@ -82,15 +89,18 @@ public class BeetlConf { ...@@ -82,15 +89,18 @@ public class BeetlConf {
} }
@Bean @Bean
public SQLManager sqlManager( public BeetlSqlMutipleSourceCustomize beetlSqlMutipleSourceCustomize(){
@Qualifier("baseDataSourceSqlManagerFactoryBean") SQLManager sqlManager) { SQLPlaceholderST.textFunList.add("mapping");
Map<Class, JavaSqlTypeHandler> typeHandlerMap = return (dataSource, manager) -> {
sqlManager.getDefaultBeanProcessors().getHandlers(); Map<Class, JavaSqlTypeHandler> typeHandlerMap =
/*Java bean的属性类型处理器,从数据库类型转化到属性Date类型*/ manager.getDefaultBeanProcessors().getHandlers();
typeHandlerMap.remove(Date.class); /*Java bean的属性类型处理器,从数据库类型转化到属性Date类型*/
typeHandlerMap.put(Date.class, new DateTypeHandler()); typeHandlerMap.remove(Date.class);
typeHandlerMap.put(ZonedDateTime.class, new ZonedDateTimeTypeHandler()); typeHandlerMap.put(Date.class, new DateTypeHandler());
return sqlManager; typeHandlerMap.put(ZonedDateTime.class, new ZonedDateTimeTypeHandler());
manager.setInters(new Interceptor[]{new StarterDebugInterceptor()});
};
} }
@Bean @Bean
...@@ -167,6 +177,8 @@ public class BeetlConf { ...@@ -167,6 +177,8 @@ public class BeetlConf {
} }
static class StarterDebugInterceptor extends DebugInterceptor { static class StarterDebugInterceptor extends DebugInterceptor {
private Logger logger= LoggerFactory.getLogger("beetlsql");
@Override @Override
protected boolean isSimple(String sqlId) { protected boolean isSimple(String sqlId) {
if (sqlId.indexOf("_gen_") != -1) { if (sqlId.indexOf("_gen_") != -1) {
...@@ -177,8 +189,8 @@ public class BeetlConf { ...@@ -177,8 +189,8 @@ public class BeetlConf {
} }
@Override @Override
protected void simpleOut(InterceptorContext ctx) { protected void println(String str) {
return; logger.info(str);
} }
} }
} }
...@@ -24,6 +24,11 @@ public class MappingFunction implements Function { ...@@ -24,6 +24,11 @@ public class MappingFunction implements Function {
@Override @Override
public Object call(Object[] paras, Context ctx) { public Object call(Object[] paras, Context ctx) {
String currentSqlId = ctx.getGlobal("_id").toString();
Object cache = CacheUtil.get(currentSqlId);
if(ObjectUtil.isNotNull(cache)){
return StrUtil.EMPTY;
}
String sqlSegmentId = (String) paras[0]; String sqlSegmentId = (String) paras[0];
Map inputParas = ctx.globalVar; Map inputParas = ctx.globalVar;
if (paras.length == 2) { if (paras.length == 2) {
...@@ -39,7 +44,7 @@ public class MappingFunction implements Function { ...@@ -39,7 +44,7 @@ public class MappingFunction implements Function {
String file = this.getParentId(ctx); String file = this.getParentId(ctx);
SQLResult result; SQLResult result;
if(sqlSegmentId.indexOf(".")==-1){ if(sqlSegmentId.indexOf(".")==-1){
/*证明是同一个md文件的sql段*/ /*同一个md文件的sql段*/
result = sm.getSQLResult(file + "." + sqlSegmentId, inputParas, ctx); result = sm.getSQLResult(file + "." + sqlSegmentId, inputParas, ctx);
}else { }else {
/*另一个md文件的sql段*/ /*另一个md文件的sql段*/
...@@ -56,7 +61,7 @@ public class MappingFunction implements Function { ...@@ -56,7 +61,7 @@ public class MappingFunction implements Function {
result.jdbcSql, inputParas, STRING_WRITER, STRING_TEMPLATE_RESOURCE_LOADER); result.jdbcSql, inputParas, STRING_WRITER, STRING_TEMPLATE_RESOURCE_LOADER);
if (MapUtil.isNotEmpty(rsMap)) { if (MapUtil.isNotEmpty(rsMap)) {
String currentSqlId = ctx.getGlobal("_id").toString(); /*TODO 待移到非测试代码中,重写为保持GridMapping,而不是保持Map*/
CacheUtil.put(currentSqlId, rsMap.values().stream().findFirst().get()); CacheUtil.put(currentSqlId, rsMap.values().stream().findFirst().get());
} }
......
...@@ -14,8 +14,9 @@ select router.id, ...@@ -14,8 +14,9 @@ select router.id,
from core_function router from core_function router
left join core_menu menu on menu.FUNCTION_ID = router.ID left join core_menu menu on menu.FUNCTION_ID = router.ID
left join core_role_menu crm on crm.MENU_ID = menu.id left join core_role_menu crm on crm.MENU_ID = menu.id
order by router.ID #text(mapping("RouteMapping"))# order by router.ID
``` ```
>- mapping("RouteMapping");
RouteMapping RouteMapping
=== ===
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment