From 6c331f733b0160b0754bb402f72d800c87256a34 Mon Sep 17 00:00:00 2001 From: redkale Date: Tue, 9 Jan 2024 14:39:27 +0800 Subject: [PATCH] DataSqlMapper --- .../java/org/redkale/asm/AsmMethodBoost.java | 4 ++ .../org/redkale/source/DataNativeSqlInfo.java | 47 +++++++++++++++++++ .../redkale/source/DataNativeSqlParser.java | 4 +- .../source/DataNativeSqlStatement.java | 6 +++ .../source/spi/DataSqlMapperBuilder.java | 12 ++--- .../source/spi/SourceModuleEngine.java | 22 ++++++++- 6 files changed, 86 insertions(+), 9 deletions(-) create mode 100644 src/main/java/org/redkale/source/DataNativeSqlInfo.java diff --git a/src/main/java/org/redkale/asm/AsmMethodBoost.java b/src/main/java/org/redkale/asm/AsmMethodBoost.java index 996a40ff7..a86bbc791 100644 --- a/src/main/java/org/redkale/asm/AsmMethodBoost.java +++ b/src/main/java/org/redkale/asm/AsmMethodBoost.java @@ -74,6 +74,10 @@ public abstract class AsmMethodBoost { return rs; } + public static String getMethodBeanKey(Method method) { + return method.getName() + ":" + Type.getMethodDescriptor(method); + } + /** * 获取需屏蔽的方法上的注解 * diff --git a/src/main/java/org/redkale/source/DataNativeSqlInfo.java b/src/main/java/org/redkale/source/DataNativeSqlInfo.java new file mode 100644 index 000000000..402714149 --- /dev/null +++ b/src/main/java/org/redkale/source/DataNativeSqlInfo.java @@ -0,0 +1,47 @@ +/* + * + */ +package org.redkale.source; + +import java.util.ArrayList; +import java.util.List; +import org.redkale.convert.ConvertDisabled; + +/** + * + * 原生的sql解析基本信息对象
+ * + *

+ * 详情见: https://redkale.org + * + * @author zhangjx + * @since 2.8.0 + */ +public class DataNativeSqlInfo { + + //原始sql语句 + protected String rawSql; + + //jdbc版的sql语句, 只有numberSignNames为空时才有值 + protected String jdbcSql; + + protected final List rootParamNames = new ArrayList<>(); + + @ConvertDisabled + public boolean isDynamic() { + return jdbcSql == null; + } + + public String getRawSql() { + return rawSql; + } + + public String getJdbcSql() { + return jdbcSql; + } + + public List getRootParamNames() { + return rootParamNames; + } + +} diff --git a/src/main/java/org/redkale/source/DataNativeSqlParser.java b/src/main/java/org/redkale/source/DataNativeSqlParser.java index c8326d243..d8e3da3cd 100644 --- a/src/main/java/org/redkale/source/DataNativeSqlParser.java +++ b/src/main/java/org/redkale/source/DataNativeSqlParser.java @@ -24,7 +24,9 @@ import org.redkale.util.RedkaleClassLoader; */ public interface DataNativeSqlParser { - DataNativeSqlStatement parse(IntFunction signFunc, String dbtype, String rawSql, Map params); + public DataNativeSqlInfo parse(IntFunction signFunc, String dbtype, String rawSql); + + public DataNativeSqlStatement parse(IntFunction signFunc, String dbtype, String rawSql, Map params); public static DataNativeSqlParser loadFirst() { if (DataNativeSqlStatement._first_parser != DataNativeSqlStatement.PARSER_NIL) { diff --git a/src/main/java/org/redkale/source/DataNativeSqlStatement.java b/src/main/java/org/redkale/source/DataNativeSqlStatement.java index 11d5b1d13..629ece20e 100644 --- a/src/main/java/org/redkale/source/DataNativeSqlStatement.java +++ b/src/main/java/org/redkale/source/DataNativeSqlStatement.java @@ -22,10 +22,16 @@ import org.redkale.convert.json.JsonConvert; public class DataNativeSqlStatement { static final DataNativeSqlParser PARSER_NIL = new DataNativeSqlParser() { + @Override + public DataNativeSqlInfo parse(IntFunction signFunc, String dbtype, String rawSql) { + throw new UnsupportedOperationException("Not supported yet."); + } + @Override public DataNativeSqlStatement parse(IntFunction signFunc, String dbtype, String rawSql, Map params) { throw new UnsupportedOperationException("Not supported yet."); } + }; static DataNativeSqlParser _first_parser = PARSER_NIL; diff --git a/src/main/java/org/redkale/source/spi/DataSqlMapperBuilder.java b/src/main/java/org/redkale/source/spi/DataSqlMapperBuilder.java index 2ee005156..0b0e4bc8c 100644 --- a/src/main/java/org/redkale/source/spi/DataSqlMapperBuilder.java +++ b/src/main/java/org/redkale/source/spi/DataSqlMapperBuilder.java @@ -3,19 +3,17 @@ */ package org.redkale.source.spi; -import java.lang.reflect.Field; -import org.redkale.inject.ResourceFactory; -import org.redkale.inject.ResourceTypeLoader; +import org.redkale.source.DataNativeSqlParser; +import org.redkale.source.DataSqlMapper; +import org.redkale.source.DataSqlSource; /** * * @author zhangjx */ -public class DataSqlMapperBuilder implements ResourceTypeLoader { +public final class DataSqlMapperBuilder { - @Override - public Object load(ResourceFactory factory, String srcResourceName, Object srcObj, String resourceName, Field field, Object attachment) { + public static > M createMapper(DataNativeSqlParser nativeSqlParser, DataSqlSource source, Class mapperType) { return null; } - } diff --git a/src/main/java/org/redkale/source/spi/SourceModuleEngine.java b/src/main/java/org/redkale/source/spi/SourceModuleEngine.java index ee7fba212..6895a6894 100644 --- a/src/main/java/org/redkale/source/spi/SourceModuleEngine.java +++ b/src/main/java/org/redkale/source/spi/SourceModuleEngine.java @@ -137,7 +137,7 @@ public class SourceModuleEngine extends ModuleEngine implements SourceManager { //--------------------------------- 注册 DataSource、CacheSource --------------------------------- resourceFactory.register(new DataSourceLoader(), DataSource.class); resourceFactory.register(new CacheSourceLoader(), CacheSource.class); - resourceFactory.register(new DataSqlMapperBuilder(), DataSqlMapper.class); + resourceFactory.register(new DataSqlMapperLoader(), DataSqlMapper.class); } /** @@ -508,6 +508,26 @@ public class SourceModuleEngine extends ModuleEngine implements SourceManager { return conf; } + private class DataSqlMapperLoader implements ResourceTypeLoader { + + @Override + public Object load(ResourceFactory rf, String srcResourceName, final Object srcObj, final String resourceName, Field field, final Object attachment) { + try { + if ((srcObj instanceof Service) && Sncp.isRemote((Service) srcObj)) { + return null; //远程模式不得注入 + } + DataSource source = loadDataSource(resourceName, false); + Class mapperType = field.getType(); + DataSqlMapper mapper = DataSqlMapperBuilder.createMapper(nativeSqlParser, (DataSqlSource) source, mapperType); + field.set(srcObj, mapper); + return mapper; + } catch (Exception e) { + logger.log(Level.SEVERE, DataSqlMapper.class.getSimpleName() + " inject to " + srcObj + " error", e); + return null; + } + } + } + private class DataSourceLoader implements ResourceTypeLoader { @Override