diff --git a/dbvisitor-integration/dbvisitor-solon-plugin/README.md b/dbvisitor-integration/dbvisitor-solon-plugin/README.md new file mode 100644 index 0000000000000000000000000000000000000000..64c469eb9cdd207b155496b066ce3726b072ca5d --- /dev/null +++ b/dbvisitor-integration/dbvisitor-solon-plugin/README.md @@ -0,0 +1,95 @@ +#### 1、描述 + +数据扩展插件,为 Solon Data 提供基于 dbvisitor([代码仓库](https://gitee.com/zycgit/dbvisitor))的框架适配,以提供ORM支持。(原 hasordb 更名为:dbvisitor) + +#### 2、强调多数据源支持 + +* 强调多数据源的配置。例:demo.db1...,demo.db2... +* 强调带 name 的 DataSource Bean +* 强调使用 @Db("name") 的数据源注解 + + +@Db 可注入类型: + +| 支持类型 | 说明 | +| -------- | -------- | +| Mapper.class | 注入 Mapper。例:`@Db("db1") UserMapper userMapper` | +| LambdaTemplate | 注入 LambdaTemplate。例:`@Db("db1") LambdaTemplate db1` | +| JdbcTemplate | 注入 JdbcTemplate。例:`@Db("db1") JdbcTemplate db1` | +| DalSession | 注入 DalSession。例:`@Db("db1") LambdaTemplate db1`(不推荐直接使用) | + + +#### 3、应用示例 + +* 数据源配置 + +```yml +demo.db1: + schema: rock + jdbcUrl: jdbc:mysql://localhost:3306/rock?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=true + driverClassName: com.mysql.cj.jdbc.Driver + username: root + password: 123456 +``` + + +* 代码应用 + +```java +//配置数据源 +@Configuration +public class Config { + // typed=true,表示默认数据源。@Db 可不带名字注入 + @Bean(name = "db1", typed = true) + public DataSource db1(@Inject("${demo.db1}") HikariDataSource ds) { + return ds; + } + + @Bean("db2") + public DataSource db2(@Inject("${demo.db2}") HikariDataSource ds) { + return ds; + } +} + +//Mapper +@RefMapper("/demo4072/dso/mapper/AppxMapper.xml") +public interface AppxMapper { + Appx appx_get(); + List appx_get_page(Page pageInfo); + Appx appx_get2(int app_id); + void appx_add(); + Integer appx_add2(int v1); + + @Query("SELECT * FROM INFORMATION_SCHEMA.TABLES") + List listTables(); +} + + +//应用 +@ProxyComponent +public class AppService{ + //可用 @Db 或 @Db("db1") 注入 + @Db + AppxMapper appMapper; //xml sql mapper + + @Db + JdbcTemplate jdbcTemplate; + + @Db + LambdaTemplate lambdaTemplate; + + public void test(){ + //三种不同接口的样例 + App app1 = appMapper.getAppById(12); + + // + jdbcTemplate.queryForMap("select * from appx where id=12"); + } +} +``` + +**具体可参考:** + +[https://gitee.com/noear/solon-examples/tree/main/4.Solon-Data/demo4072-dbvisitor](https://gitee.com/noear/solon-examples/tree/main/4.Solon-Data/demo4072-dbvisitor) + +[https://www.dbvisitor.net/](https://www.dbvisitor.net/) diff --git a/dbvisitor-integration/dbvisitor-solon-plugin/pom.xml b/dbvisitor-integration/dbvisitor-solon-plugin/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..b08236bc7ad639d3003a1fa3506959247212462b --- /dev/null +++ b/dbvisitor-integration/dbvisitor-solon-plugin/pom.xml @@ -0,0 +1,33 @@ + + + 4.0.0 + + net.hasor + dbvisitor-parent + 5.3.2-SNAPSHOT + ../../pom.xml + + + dbvisitor-solon-plugin + jar + + + 2.2.12 + + + + + org.noear + solon.data + ${solon.version} + + + + net.hasor + dbvisitor + + + + \ No newline at end of file diff --git a/dbvisitor-integration/dbvisitor-solon-plugin/src/main/java/net/hasor/dbvisitor/solon/Db.java b/dbvisitor-integration/dbvisitor-solon-plugin/src/main/java/net/hasor/dbvisitor/solon/Db.java new file mode 100644 index 0000000000000000000000000000000000000000..6278d255d754417f8d5b1824d9df3d195af0f119 --- /dev/null +++ b/dbvisitor-integration/dbvisitor-solon-plugin/src/main/java/net/hasor/dbvisitor/solon/Db.java @@ -0,0 +1,22 @@ +package net.hasor.dbvisitor.solon; + +import java.lang.annotation.*; + +/** + * 数据工厂注解 + * + * 例: + * @Db("db1") + * + * @author noear + * @since 1.6 + * */ +@Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface Db { + /** + * datsSource bean name + * */ + String value() default ""; +} diff --git a/dbvisitor-integration/dbvisitor-solon-plugin/src/main/java/net/hasor/dbvisitor/solon/integration/DynamicConnectionImpl.java b/dbvisitor-integration/dbvisitor-solon-plugin/src/main/java/net/hasor/dbvisitor/solon/integration/DynamicConnectionImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..b01ed8dd96d97e0e927af2feaf806f70e6ab6a8f --- /dev/null +++ b/dbvisitor-integration/dbvisitor-solon-plugin/src/main/java/net/hasor/dbvisitor/solon/integration/DynamicConnectionImpl.java @@ -0,0 +1,32 @@ +package net.hasor.dbvisitor.solon.integration; + +import net.hasor.dbvisitor.jdbc.DynamicConnection; +import org.noear.solon.data.tran.TranUtils; + +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.SQLException; + +/** + * @author noear + * @see 1.8 + */ +public class DynamicConnectionImpl implements DynamicConnection { + private DataSource dataSource; + + public DynamicConnectionImpl(DataSource dataSource) { + this.dataSource = dataSource; + } + + @Override + public Connection getConnection() throws SQLException { + return TranUtils.getConnection(dataSource); + } + + @Override + public void releaseConnection(Connection conn) throws SQLException { + if (TranUtils.inTrans() == false) { + conn.close(); + } + } +} diff --git a/dbvisitor-integration/dbvisitor-solon-plugin/src/main/java/net/hasor/dbvisitor/solon/integration/XPluginImp.java b/dbvisitor-integration/dbvisitor-solon-plugin/src/main/java/net/hasor/dbvisitor/solon/integration/XPluginImp.java new file mode 100644 index 0000000000000000000000000000000000000000..3034bb018e123b2b210b8039a75531cd6310a7c4 --- /dev/null +++ b/dbvisitor-integration/dbvisitor-solon-plugin/src/main/java/net/hasor/dbvisitor/solon/integration/XPluginImp.java @@ -0,0 +1,95 @@ +package net.hasor.dbvisitor.solon.integration; + +import net.hasor.dbvisitor.dal.mapper.BaseMapper; +import net.hasor.dbvisitor.dal.repository.DalRegistry; +import net.hasor.dbvisitor.dal.repository.RefMapper; +import net.hasor.dbvisitor.dal.session.DalSession; +import net.hasor.dbvisitor.jdbc.core.JdbcTemplate; +import net.hasor.dbvisitor.lambda.LambdaTemplate; +import net.hasor.dbvisitor.solon.Db; +import org.noear.solon.Utils; +import org.noear.solon.core.*; + +import javax.sql.DataSource; + +/** + * @author noear + * @since 1.8 + */ +public class XPluginImp implements Plugin { + DalRegistry dalRegistry = new DalRegistry(); + + @Override + public void start(AopContext context) { + context.beanInjectorAdd(Db.class, (varH, anno) -> { + if (Utils.isEmpty(anno.value())) { + varH.context().getWrapAsync(DataSource.class, (dsBw) -> { + inject0(varH, dsBw); + }); + } else { + varH.context().getWrapAsync(anno.value(), (dsBw) -> { + if (dsBw.raw() instanceof DataSource) { + inject0(varH, dsBw); + } + }); + } + }); + + context.beanBuilderAdd(RefMapper.class, (clz, bw, anno) -> { + dalRegistry.loadMapper(clz); + }); + } + + private void inject0(VarHolder varH, BeanWrap dsBw) { + try { + inject1(varH, dsBw); + } catch (RuntimeException e) { + throw e; + } catch (Throwable e) { + throw new RuntimeException(e); + } + } + + private void inject1(VarHolder varH, BeanWrap dsBw) throws Exception { + DataSource ds = dsBw.get(); + Class clz = varH.getType(); + + //@Db("db1") LambdaTemplate ; //顺序别乱变 + if (LambdaTemplate.class.isAssignableFrom(varH.getType())) { + LambdaTemplate accessor = new LambdaTemplate(new DynamicConnectionImpl(ds)); + + varH.setValue(accessor); + return; + } + + //@Db("db1") JdbcTemplate ; + if (JdbcTemplate.class.isAssignableFrom(varH.getType())) { + JdbcTemplate accessor = new JdbcTemplate(new DynamicConnectionImpl(ds)); + + varH.setValue(accessor); + return; + } + + //@Db("db1") DalSession ; + if (DalSession.class.isAssignableFrom(varH.getType())) { + DalSession accessor = new DalSession(new DynamicConnectionImpl(ds)); + + varH.setValue(accessor); + return; + } + + //@Db("db1") UserMapper ; + if (varH.getType().isInterface()) { + DalSession accessor = new DalSession(new DynamicConnectionImpl(ds), dalRegistry); + + if (clz == BaseMapper.class) { + Object obj = accessor.createBaseMapper((Class) varH.getGenericType().getActualTypeArguments()[0]); + varH.setValue(obj); + } else { + Object mapper = accessor.createMapper(varH.getType()); + varH.setValue(mapper); + } + return; + } + } +} diff --git a/dbvisitor-integration/dbvisitor-solon-plugin/src/main/resources/META-INF/solon/net.hasor.dbvisitor.solon.properties b/dbvisitor-integration/dbvisitor-solon-plugin/src/main/resources/META-INF/solon/net.hasor.dbvisitor.solon.properties new file mode 100644 index 0000000000000000000000000000000000000000..df5b2aabeb5f4a976b5b50cf8e711925f5202f7c --- /dev/null +++ b/dbvisitor-integration/dbvisitor-solon-plugin/src/main/resources/META-INF/solon/net.hasor.dbvisitor.solon.properties @@ -0,0 +1,2 @@ +solon.plugin=net.hasor.dbvisitor.solon.integration.XPluginImp +solon.plugin.priority=1 \ No newline at end of file diff --git a/pom.xml b/pom.xml index 16e8730a67baf028bbbefe13e482561bff4a6b24..724afa1c37d10976cf248129e1601d86b47eb013 100755 --- a/pom.xml +++ b/pom.xml @@ -51,6 +51,7 @@ dbvisitor-integration/dbvisitor-spring-starter dbvisitor-integration/dbvisitor-hasor dbvisitor-integration/dbvisitor-guice + dbvisitor-integration/dbvisitor-solon-plugin