From d32bddf1c109b5f4dc7eb9711df16477cd429e14 Mon Sep 17 00:00:00 2001 From: noear Date: Tue, 18 Apr 2023 14:39:57 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=96=B0=E7=9A=84?= =?UTF-8?q?=E9=9B=86=E6=88=90=20dbvisitor-solon-plugin?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dbvisitor-solon-plugin/README.md | 95 +++++++++++++++++++ .../dbvisitor-solon-plugin/pom.xml | 34 +++++++ .../java/net/hasor/dbvisitor/solon/Db.java | 22 +++++ .../integration/DynamicConnectionImpl.java | 32 +++++++ .../solon/integration/XPluginImp.java | 95 +++++++++++++++++++ .../net.hasor.dbvisitor.solon.properties | 2 + pom.xml | 1 + 7 files changed, 281 insertions(+) create mode 100644 dbvisitor-integration/dbvisitor-solon-plugin/README.md create mode 100644 dbvisitor-integration/dbvisitor-solon-plugin/pom.xml create mode 100644 dbvisitor-integration/dbvisitor-solon-plugin/src/main/java/net/hasor/dbvisitor/solon/Db.java create mode 100644 dbvisitor-integration/dbvisitor-solon-plugin/src/main/java/net/hasor/dbvisitor/solon/integration/DynamicConnectionImpl.java create mode 100644 dbvisitor-integration/dbvisitor-solon-plugin/src/main/java/net/hasor/dbvisitor/solon/integration/XPluginImp.java create mode 100644 dbvisitor-integration/dbvisitor-solon-plugin/src/main/resources/META-INF/solon/net.hasor.dbvisitor.solon.properties diff --git a/dbvisitor-integration/dbvisitor-solon-plugin/README.md b/dbvisitor-integration/dbvisitor-solon-plugin/README.md new file mode 100644 index 00000000..64c469eb --- /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 00000000..0535681c --- /dev/null +++ b/dbvisitor-integration/dbvisitor-solon-plugin/pom.xml @@ -0,0 +1,34 @@ + + + 4.0.0 + + + net.hasor + dbvisitor-parent + 5.3.1-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 00000000..6278d255 --- /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 00000000..b01ed8dd --- /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 00000000..3034bb01 --- /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 00000000..df5b2aab --- /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 c662afa2..89fa4466 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 -- Gitee From f59775ad5275b8d30527ba5d4058da7a81d3c25e Mon Sep 17 00:00:00 2001 From: noear Date: Tue, 18 Apr 2023 14:43:20 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=96=B0=E7=9A=84?= =?UTF-8?q?=E9=9B=86=E6=88=90=20dbvisitor-solon-plugin?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dbvisitor-integration/dbvisitor-solon-plugin/pom.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/dbvisitor-integration/dbvisitor-solon-plugin/pom.xml b/dbvisitor-integration/dbvisitor-solon-plugin/pom.xml index 0535681c..b08236bc 100644 --- a/dbvisitor-integration/dbvisitor-solon-plugin/pom.xml +++ b/dbvisitor-integration/dbvisitor-solon-plugin/pom.xml @@ -3,11 +3,10 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - net.hasor dbvisitor-parent - 5.3.1-SNAPSHOT + 5.3.2-SNAPSHOT ../../pom.xml -- Gitee