Browse Source

多数据源智能切换全部ok,包括直接调用动态代理的mapper方法

NorthLan 7 years ago
parent
commit
12f159288d
36 changed files with 847 additions and 344 deletions
  1. 12 9
      build.gradle
  2. 0 2
      settings.gradle
  3. 1 1
      zen-admin/build.gradle
  4. 44 21
      zen-admin/src/main/kotlin/com/gxzc/zen/A.java
  5. 1 1
      zen-admin/src/main/kotlin/com/gxzc/zen/MainApplication.kt
  6. 32 5
      zen-admin/src/main/kotlin/com/gxzc/zen/controller/ExampleController.kt
  7. 1 1
      zen-admin/src/main/resources/application.yml
  8. 3 1
      zen-api/src/main/kotlin/com/gxzc/zen/api/rec/mapper/SysDicMapper.kt
  9. 24 16
      zen-api/src/main/kotlin/com/gxzc/zen/api/rec/model/SysDic.kt
  10. 3 1
      zen-api/src/main/kotlin/com/gxzc/zen/api/rec/service/ISysDicService.kt
  11. 5 2
      zen-api/src/main/kotlin/com/gxzc/zen/api/rec/service/impl/SysDicServiceImpl.kt
  12. 4 4
      zen-api/src/main/kotlin/com/gxzc/zen/api/sys/mapper/SysDeptMapper.kt
  13. 28 20
      zen-api/src/main/kotlin/com/gxzc/zen/api/sys/model/SysDept.kt
  14. 5 5
      zen-api/src/main/kotlin/com/gxzc/zen/api/sys/service/ISysDeptService.kt
  15. 10 9
      zen-api/src/main/kotlin/com/gxzc/zen/api/sys/service/impl/SysDeptServiceImpl.kt
  16. 16 0
      zen-api/src/main/kotlin/com/gxzc/zen/api/usage/mapper/SysParamMapper.kt
  17. 36 0
      zen-api/src/main/kotlin/com/gxzc/zen/api/usage/model/SysParam.kt
  18. 14 0
      zen-api/src/main/kotlin/com/gxzc/zen/api/usage/service/ISysParamService.kt
  19. 19 0
      zen-api/src/main/kotlin/com/gxzc/zen/api/usage/service/impl/SysParamServiceImpl.kt
  20. 5 1
      zen-api/src/main/resources/mapping/rec/SysDicMapper.xml
  21. 1 1
      zen-api/src/main/resources/mapping/sys/SysDeptMapper.xml
  22. 19 0
      zen-api/src/main/resources/mapping/usage/SysParamMapper.xml
  23. 2 4
      zen-orm/build.gradle
  24. 55 0
      zen-orm/src/main/java/a/A.java
  25. 3 3
      zen-orm/src/main/kotlin/com/gxzc/zen/Generator.kt
  26. 44 0
      zen-orm/src/main/kotlin/com/gxzc/zen/orm/DataSourceSwitchAspect.kt
  27. 35 0
      zen-orm/src/main/kotlin/com/gxzc/zen/orm/DataSourceSwitchMethodInterceptor.kt
  28. 0 46
      zen-orm/src/main/kotlin/com/gxzc/zen/orm/DruidViewConfig.kt
  29. 12 0
      zen-orm/src/main/kotlin/com/gxzc/zen/orm/DynamicDataSource.kt
  30. 31 0
      zen-orm/src/main/kotlin/com/gxzc/zen/orm/DynamicMultipleDataSource.kt
  31. 84 0
      zen-orm/src/main/kotlin/com/gxzc/zen/orm/MultipleDataSourceConfig.kt
  32. 64 69
      zen-orm/src/main/kotlin/com/gxzc/zen/orm/RecDataSourceConfig.kt
  33. 68 74
      zen-orm/src/main/kotlin/com/gxzc/zen/orm/SysDataSourceConfig.kt
  34. 69 0
      zen-orm/src/main/kotlin/com/gxzc/zen/orm/UsageDataSourceConfig.kt
  35. 97 46
      zen-orm/src/main/resources/application-orm.yml
  36. 0 2
      zen-umps/build.gradle

+ 12 - 9
build.gradle

@@ -58,22 +58,22 @@ subprojects {
 
         compile('org.springframework.boot:spring-boot-starter')
         compile('org.springframework.boot:spring-boot-starter-web')
+        compile('org.springframework.boot:spring-boot-starter-aop')
         testCompile('org.springframework.boot:spring-boot-starter-test')
         testCompile("junit:junit:4.12")
 
         compile("commons-io:commons-io:$commons_io_version")
 //        compile("commons-logging:commons-logging:$commons_logging_version")
         compile("org.apache.commons:commons-lang3:$commons_lang3_version")
-        compile group: 'commons-codec', name: 'commons-codec', version: '1.10'
-        compile group: 'commons-fileupload', name: 'commons-fileupload', version: '1.3.2'
-        compile group: 'commons-beanutils', name: 'commons-beanutils', version: '1.9.3'
-//        compile group: 'log4j', name: 'log4j', version: '1.2.17'
-        compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.25'
+        compile("commons-codec:commons-codec:1.10")
+        compile("commons-fileupload:commons-fileupload:1.3.2")
+        compile("commons-beanutils:commons-beanutils:1.9.3")
+        compile("javax.servlet:javax.servlet-api:3.1.0")
+        compile("javax.servlet:servlet-api:2.5")
+        compile("org.slf4j:slf4j-api:1.7.25")
         // compile group: 'org.slf4j', name: 'slf4j-log4j12', version: '1.7.25'
+//        compile group: 'log4j', name: 'log4j', version: '1.2.17'
 
-        // https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api
-        compile group: 'javax.servlet', name: 'javax.servlet-api', version: '3.1.0'
-        compile group: 'javax.servlet', name: 'servlet-api', version: '2.5'
 //        compile group: 'javax.servlet', name: 'jstl', version: '1.2'
 //        compile group: 'javax.servlet.jsp', name: 'jsp-api', version: '2.1'
 //
@@ -84,7 +84,7 @@ subprojects {
 //        compile ("org.springframework.data:spring-data-jpa:$spring_data_version")
 //        compile ("org.springframework.data:spring-data-elasticsearch:$spring_data_elasticsearch_version")
 //
-        compile("com.alibaba:druid:$alidruid_version")
+//        compile("com.alibaba:druid:$alidruid_version")
         compile("org.ehcache:ehcache:$ehcache_version")
         compile("org.activiti:activiti-engine:$activiti_version")
         compile("org.activiti:activiti-spring:$activiti_version")
@@ -108,5 +108,8 @@ subprojects {
         compile("io.jsonwebtoken:jjwt:0.7.0")
         compile("org.projectlombok:lombok:1.16.18")
         compile("org.apache.velocity:velocity-engine-core:2.0")
+
+//        compile("io.shardingjdbc:sharding-jdbc-core-spring-boot-starter:2.0.2")
+        compile("com.alibaba:druid-spring-boot-starter:1.1.6")
     }
 }

+ 0 - 2
settings.gradle

@@ -1,7 +1,5 @@
 rootProject.name = 'zen'
 include 'zen-common'
-include 'zen-log'
-include 'zen-config'
 include 'zen-umps'
 include 'zen-orm'
 include 'zen-api'

+ 1 - 1
zen-admin/build.gradle

@@ -2,6 +2,6 @@ apply plugin: 'war'
 
 dependencies {
     compile project(":zen-ui")
-    compile project(":zen-orm")
+//    compile project(":zen-orm")
     compile project(":zen-api")
 }

+ 44 - 21
zen-admin/src/main/kotlin/com/gxzc/zen/A.java

@@ -4,19 +4,20 @@ import com.gxzc.zen.orm.DynamicDataSource;
 import com.gxzc.zen.orm.DynamicMultipleDataSource;
 import kotlin.TypeCastException;
 import kotlin.jvm.internal.Intrinsics;
-import org.apache.ibatis.binding.MapperProxy;
+import org.apache.commons.lang3.StringUtils;
 import org.aspectj.lang.JoinPoint;
 import org.aspectj.lang.Signature;
 import org.aspectj.lang.annotation.Aspect;
 import org.aspectj.lang.annotation.Before;
 import org.aspectj.lang.reflect.MethodSignature;
-import org.aspectj.lang.reflect.SourceLocation;
 import org.jetbrains.annotations.NotNull;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Component;
 
+import java.lang.reflect.Field;
 import java.lang.reflect.Method;
-import java.lang.reflect.Proxy;
 import java.util.Objects;
 
 @Aspect
@@ -24,30 +25,52 @@ import java.util.Objects;
 @Component
 public class A {
 
-    @Before("execution(* com.gxzc.zen.api.sys..*Service.*(..))")
-    public void sysService(@NotNull JoinPoint joinPoint) {
-        this.setDataSource(joinPoint, "sysDataSource");
-    }
+    private static final Logger logger = LoggerFactory.getLogger(A.class);
+
+//    @Before("execution(* com.gxzc.zen.api.sys..*Service.*(..))")
+//    public void sysService(@NotNull JoinPoint joinPoint) {
+//        setDataSource(joinPoint, "sysDataSource");
+//    }
 
-    @Before("execution(* com.baomidou.mybatisplus..*Service.*(..)) || execution(* com.baomidou.mybatisplus..*Mapper.*(..))")
+    @Before("execution(* com.baomidou.mybatisplus..*Service.*(..)) || execution(* com.baomidou.mybatisplus..*Mapper.*(..)) || execution(* com.gxzc.zen.api..*Service.*(..))")
     public void dataSourceSys2(@NotNull JoinPoint joinPoint) {
-        SourceLocation a = joinPoint.getSourceLocation();
-        Class b = a.getWithinType();
-        String k = joinPoint.getKind();
         Object o = joinPoint.getTarget();
-        Class cs = o.getClass();
-        JoinPoint.StaticPart s = joinPoint.getStaticPart();
-        String packageName = joinPoint.getTarget().getClass().getPackage().getName();
-        if (packageName.contains("com.gxzc.zen.api.sys")) {
-            sysService(joinPoint);
-        } else if (packageName.contains("com.gxzc.zen.api.rec")) {
-            recService(joinPoint);
+
+        String packageName = null;
+        try {
+            Field h = o.getClass().getSuperclass().getDeclaredField("h");
+            h.setAccessible(true);
+            Object mapperProxy = h.get(o);
+
+            Field mapperInterface = mapperProxy.getClass().getDeclaredField("mapperInterface");
+            mapperInterface.setAccessible(true);
+
+            Class<?> clazz = (Class<?>) mapperInterface.get(mapperProxy);
+
+            packageName = clazz.getPackage().getName();
+        } catch (Exception e) {
+            logger.debug("get packageName of MapperProxy error, ignore this info if nothing happened!");
+        } finally {
+            if (StringUtils.isBlank(packageName)) {
+                logger.debug("get packageName of target...");
+                packageName = joinPoint.getTarget().getClass().getPackage().getName();
+            }
         }
+
+        matchDataSource(joinPoint, packageName);
     }
 
-    @Before("execution(* com.gxzc.zen.api.rec..*Service.*(..))")
-    public void recService(@NotNull JoinPoint joinPoint) {
-        this.setDataSource(joinPoint, "recDataSource");
+//    @Before("execution(* com.gxzc.zen.api.rec..*Service.*(..))")
+//    public void recService(@NotNull JoinPoint joinPoint) {
+//        setDataSource(joinPoint, "recDataSource");
+//    }
+
+    private void matchDataSource(JoinPoint joinPoint, String packageName) {
+        if (packageName.contains("com.gxzc.zen.api.sys")) {
+            setDataSource(joinPoint, "sysDataSource");
+        } else if (packageName.contains("com.gxzc.zen.api.rec")) {
+            setDataSource(joinPoint, "recDataSource");
+        }
     }
 
     private void setDataSource(JoinPoint joinPoint, String defaultKey) {

+ 1 - 1
zen-admin/src/main/kotlin/com/gxzc/zen/MainApplication.kt

@@ -6,7 +6,7 @@ import org.springframework.boot.builder.SpringApplicationBuilder
 import org.springframework.boot.web.support.SpringBootServletInitializer
 
 
-@SpringBootApplication
+@SpringBootApplication//(exclude = [DataSourceAutoConfiguration::class])
 class MainApplication : SpringBootServletInitializer() {
     override fun configure(builder: SpringApplicationBuilder?): SpringApplicationBuilder? {
         return builder?.sources(MainApplication::class.java)

+ 32 - 5
zen-admin/src/main/kotlin/com/gxzc/zen/controller/ExampleController.kt

@@ -2,8 +2,10 @@ package com.gxzc.zen.controller
 
 import com.gxzc.zen.api.rec.model.SysDic
 import com.gxzc.zen.api.rec.service.ISysDicService
+import com.gxzc.zen.api.sys.mapper.SysDeptMapper
 import com.gxzc.zen.api.sys.model.SysDept
 import com.gxzc.zen.api.sys.service.ISysDeptService
+import com.gxzc.zen.api.usage.model.SysParam
 import org.slf4j.LoggerFactory
 import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.stereotype.Controller
@@ -21,16 +23,27 @@ class ExampleController {
     lateinit var sysDeptService: ISysDeptService
 
     @Autowired
-    val sysDicService: ISysDicService? = null
+    lateinit var sysDicService: ISysDicService
+
+    @Autowired
+    lateinit var sysDeptMapper: SysDeptMapper
+
+//    @Autowired
+//    lateinit var sysParamService: ISysParamService
 
     @RequestMapping("/test")
     fun test() {
         val dept = SysDept().also {
             it.deptName = "test"
             it.principal = "create"
-            it.sort = 1
+            it.sort = Integer(1)
         }
-        logger.info("c {}", sysDeptService.custom())
+//        for (i in 1..1000) {
+//            sysDeptService.insert(dept)
+//        }
+        sysDeptMapper.insert(dept)
+
+        logger.info("count: {}", sysDeptService.custom())
     }
 
     @RequestMapping("/test2")
@@ -38,9 +51,23 @@ class ExampleController {
         val sysDic = SysDic().also {
             it.key = "hehe"
             it.value = "hehe"
-            it.sort = 1
+            it.sort = Integer(1)
+        }
+//        for (i in 1..1000) {
+//            sysDicService.insert(sysDic)
+//        }
+        sysDicService.insert(sysDic)
+//        logger.info("count: {}", sysDicService.custom())
+    }
+
+    @RequestMapping("/test3")
+    fun test3() {
+        val sysParam = SysParam().also {
+            it.key = "a"
+            it.value = "b"
+            it.sort = Integer(1)
         }
 
-        sysDicService?.insert(sysDic)
+//        sysParamService.insert(sysParam)
     }
 }

+ 1 - 1
zen-admin/src/main/resources/application.yml

@@ -21,4 +21,4 @@ spring:
     proxy-target-class: true #false为启用jdk默认动态代理,true为cglib动态代理
     auto: true
 logging:
-  level: debug
+  level: info

+ 3 - 1
zen-api/src/main/kotlin/com/gxzc/zen/api/rec/mapper/SysDicDao.kt → zen-api/src/main/kotlin/com/gxzc/zen/api/rec/mapper/SysDicMapper.kt

@@ -13,4 +13,6 @@ import org.springframework.stereotype.Repository
  * @since 2018-01-27
  */
 @Repository
-interface SysDicDao : BaseMapper<SysDic>
+interface SysDicMapper : BaseMapper<SysDic>{
+    fun custom(): Long
+}

+ 24 - 16
zen-api/src/main/kotlin/com/gxzc/zen/api/rec/model/SysDic.kt

@@ -1,6 +1,5 @@
 package com.gxzc.zen.api.rec.model;
 
-import com.baomidou.mybatisplus.annotations.TableName
 import com.gxzc.zen.common.base.BaseModel;
 
 /**
@@ -11,18 +10,27 @@ import com.gxzc.zen.common.base.BaseModel;
  * @author NorthLan123
  * @since 2018-01-27
  */
-@TableName("sys_dic")
-data class SysDic(
-        /**
-         * 字典代码
-         */
-        var key: String? = null,
-        /**
-         * 字典值
-         */
-        var value: String? = null,
-        /**
-         * 排序号
-         */
-        var sort: Int? = null
-) : BaseModel()
+class SysDic : BaseModel() {
+
+    /**
+     * 字典代码
+     */
+    var key: String? = null
+    /**
+     * 字典值
+     */
+    var value: String? = null
+    /**
+     * 排序号
+     */
+    var sort: Integer? = null
+
+
+    override fun toString(): String {
+        return "SysDic{" +
+        ", key=" + key +
+        ", value=" + value +
+        ", sort=" + sort +
+        "}"
+    }
+}

+ 3 - 1
zen-api/src/main/kotlin/com/gxzc/zen/api/rec/service/ISysDicService.kt

@@ -11,4 +11,6 @@ import com.gxzc.zen.common.base.BaseService;
  * @author NorthLan123
  * @since 2018-01-27
  */
-interface ISysDicService : BaseService<SysDic>
+interface ISysDicService : BaseService<SysDic>{
+    fun custom(): Long
+}

+ 5 - 2
zen-api/src/main/kotlin/com/gxzc/zen/api/rec/service/impl/SysDicServiceImpl.kt

@@ -1,7 +1,7 @@
 package com.gxzc.zen.api.rec.service.impl;
 
 import com.gxzc.zen.api.rec.model.SysDic;
-import com.gxzc.zen.api.rec.mapper.SysDicDao;
+import com.gxzc.zen.api.rec.mapper.SysDicMapper;
 import com.gxzc.zen.api.rec.service.ISysDicService;
 import com.baomidou.mybatisplus.service.impl.ServiceImpl;
 import org.springframework.stereotype.Service;
@@ -15,6 +15,9 @@ import org.springframework.stereotype.Service;
  * @since 2018-01-27
  */
 @Service
-open class SysDicServiceImpl : ServiceImpl<SysDicDao, SysDic>(), ISysDicService {
+open class SysDicServiceImpl : ServiceImpl<SysDicMapper, SysDic>(), ISysDicService {
+    override fun custom(): Long {
+        return baseMapper.custom()
+    }
 
 }

+ 4 - 4
zen-api/src/main/kotlin/com/gxzc/zen/api/sys/mapper/SysDeptDao.kt → zen-api/src/main/kotlin/com/gxzc/zen/api/sys/mapper/SysDeptMapper.kt

@@ -1,7 +1,7 @@
 package com.gxzc.zen.api.sys.mapper;
 
-import com.baomidou.mybatisplus.mapper.BaseMapper
 import com.gxzc.zen.api.sys.model.SysDept
+import com.gxzc.zen.common.base.BaseMapper
 import org.springframework.stereotype.Repository
 
 /**
@@ -9,10 +9,10 @@ import org.springframework.stereotype.Repository
  * 部门管理 Mapper 接口
  * </p>
  *
- * @author NorthLan
- * @since 2018-01-26
+ * @author NorthLan123
+ * @since 2018-01-27
  */
 @Repository
-interface SysDeptDao : BaseMapper<SysDept> {
+interface SysDeptMapper : BaseMapper<SysDept> {
     fun custom(): Long
 }

+ 28 - 20
zen-api/src/main/kotlin/com/gxzc/zen/api/sys/model/SysDept.kt

@@ -1,28 +1,36 @@
-package com.gxzc.zen.api.sys.model
+package com.gxzc.zen.api.sys.model;
 
-import com.baomidou.mybatisplus.annotations.TableName
-import com.gxzc.zen.common.base.BaseModel
+import com.gxzc.zen.common.base.BaseModel;
 
 /**
  * <p>
  * 部门管理
  * </p>
  *
- * @author NorthLan
- * @since 2018-01-26
+ * @author NorthLan123
+ * @since 2018-01-27
  */
-@TableName("sys_dept")
-data class SysDept(
-        /**
-         * 部门名称
-         */
-        var deptName: String? = null,
-        /**
-         * 负责人
-         */
-        var principal: String? = null,
-        /**
-         * 排序号
-         */
-        var sort: Int? = null
-) : BaseModel()
+class SysDept : BaseModel() {
+
+    /**
+     * 部门名称
+     */
+    var deptName: String? = null
+    /**
+     * 负责人
+     */
+    var principal: String? = null
+    /**
+     * 排序号
+     */
+    var sort: Integer? = null
+
+
+    override fun toString(): String {
+        return "SysDept{" +
+        ", deptName=" + deptName +
+        ", principal=" + principal +
+        ", sort=" + sort +
+        "}"
+    }
+}

+ 5 - 5
zen-api/src/main/kotlin/com/gxzc/zen/api/sys/service/ISysDeptService.kt

@@ -1,16 +1,16 @@
 package com.gxzc.zen.api.sys.service;
 
-import com.baomidou.mybatisplus.service.IService
-import com.gxzc.zen.api.sys.model.SysDept
+import com.gxzc.zen.api.sys.model.SysDept;
+import com.gxzc.zen.common.base.BaseService;
 
 /**
  * <p>
  * 部门管理 服务类
  * </p>
  *
- * @author NorthLan
- * @since 2018-01-26
+ * @author NorthLan123
+ * @since 2018-01-27
  */
-interface ISysDeptService : IService<SysDept> {
+interface ISysDeptService : BaseService<SysDept> {
     fun custom(): Long
 }

+ 10 - 9
zen-api/src/main/kotlin/com/gxzc/zen/api/sys/service/impl/SysDeptServiceImpl.kt

@@ -1,22 +1,23 @@
 package com.gxzc.zen.api.sys.service.impl;
 
-import com.baomidou.mybatisplus.service.impl.ServiceImpl
-import com.gxzc.zen.api.sys.mapper.SysDeptDao
-import com.gxzc.zen.api.sys.model.SysDept
-import com.gxzc.zen.api.sys.service.ISysDeptService
-import org.springframework.stereotype.Service
+import com.gxzc.zen.api.sys.model.SysDept;
+import com.gxzc.zen.api.sys.mapper.SysDeptMapper;
+import com.gxzc.zen.api.sys.service.ISysDeptService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
 
 /**
  * <p>
  * 部门管理 服务实现类
  * </p>
  *
- * @author NorthLan
- * @since 2018-01-26
+ * @author NorthLan123
+ * @since 2018-01-27
  */
 @Service
-class SysDeptServiceImpl : ISysDeptService, ServiceImpl<SysDeptDao, SysDept>() {
+open class SysDeptServiceImpl : ServiceImpl<SysDeptMapper, SysDept>(), ISysDeptService {
     override fun custom(): Long {
         return baseMapper.custom()
     }
-}
+
+}

+ 16 - 0
zen-api/src/main/kotlin/com/gxzc/zen/api/usage/mapper/SysParamMapper.kt

@@ -0,0 +1,16 @@
+package com.gxzc.zen.api.usage.mapper;
+
+import com.gxzc.zen.api.usage.model.SysParam;
+import com.gxzc.zen.common.base.BaseMapper;
+import org.springframework.stereotype.Repository
+
+/**
+ * <p>
+ * 系统参数表 Mapper 接口
+ * </p>
+ *
+ * @author NorthLan123
+ * @since 2018-01-27
+ */
+@Repository
+interface SysParamMapper : BaseMapper<SysParam>

+ 36 - 0
zen-api/src/main/kotlin/com/gxzc/zen/api/usage/model/SysParam.kt

@@ -0,0 +1,36 @@
+package com.gxzc.zen.api.usage.model;
+
+import com.gxzc.zen.common.base.BaseModel;
+
+/**
+ * <p>
+ * 系统参数表
+ * </p>
+ *
+ * @author NorthLan123
+ * @since 2018-01-27
+ */
+class SysParam : BaseModel() {
+
+    /**
+     * 参数key
+     */
+    var key: String? = null
+    /**
+     * 参数值
+     */
+    var value: String? = null
+    /**
+     * 排序号
+     */
+    var sort: Integer? = null
+
+
+    override fun toString(): String {
+        return "SysParam{" +
+        ", key=" + key +
+        ", value=" + value +
+        ", sort=" + sort +
+        "}"
+    }
+}

+ 14 - 0
zen-api/src/main/kotlin/com/gxzc/zen/api/usage/service/ISysParamService.kt

@@ -0,0 +1,14 @@
+package com.gxzc.zen.api.usage.service;
+
+import com.gxzc.zen.api.usage.model.SysParam;
+import com.gxzc.zen.common.base.BaseService;
+
+/**
+ * <p>
+ * 系统参数表 服务类
+ * </p>
+ *
+ * @author NorthLan123
+ * @since 2018-01-27
+ */
+interface ISysParamService : BaseService<SysParam>

+ 19 - 0
zen-api/src/main/kotlin/com/gxzc/zen/api/usage/service/impl/SysParamServiceImpl.kt

@@ -0,0 +1,19 @@
+package com.gxzc.zen.api.usage.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl
+import com.gxzc.zen.api.usage.mapper.SysParamMapper
+import com.gxzc.zen.api.usage.model.SysParam
+import com.gxzc.zen.api.usage.service.ISysParamService
+
+/**
+ * <p>
+ * 系统参数表 服务实现类
+ * </p>
+ *
+ * @author NorthLan123
+ * @since 2018-01-27
+ */
+//@Service
+open class SysParamServiceImpl : ServiceImpl<SysParamMapper, SysParam>(), ISysParamService {
+
+}

+ 5 - 1
zen-api/src/main/resources/mapping/rec/SysDicDao.xml → zen-api/src/main/resources/mapping/rec/SysDicMapper.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.gxzc.zen.api.rec.mapper.SysDicDao">
+<mapper namespace="com.gxzc.zen.api.rec.mapper.SysDicMapper">
 
     <!-- 通用查询映射结果 -->
     <resultMap id="BaseResultMap" type="com.gxzc.zen.api.rec.model.SysDic">
@@ -16,4 +16,8 @@
         <result column="sort" property="sort"/>
     </resultMap>
 
+    <select id="custom" resultType="java.lang.Long">
+        SELECT count(*) from sys_dic
+    </select>
+
 </mapper>

+ 1 - 1
zen-api/src/main/resources/mapping/sys/SysDeptDao.xml → zen-api/src/main/resources/mapping/sys/SysDeptMapper.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.gxzc.zen.api.sys.mapper.SysDeptDao">
+<mapper namespace="com.gxzc.zen.api.sys.mapper.SysDeptMapper">
 
     <!-- 通用查询映射结果 -->
     <resultMap id="BaseResultMap" type="com.gxzc.zen.api.sys.model.SysDept">

+ 19 - 0
zen-api/src/main/resources/mapping/usage/SysParamMapper.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.gxzc.zen.api.usage.mapper.SysParamMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.gxzc.zen.api.usage.model.SysParam">
+    <result column="id" property="id" />
+    <result column="enable" property="enable" />
+    <result column="remark" property="remark" />
+    <result column="create_time" property="createTime" />
+    <result column="create_by" property="createBy" />
+    <result column="update_time" property="updateTime" />
+    <result column="update_by" property="updateBy" />
+        <result column="key" property="key" />
+        <result column="value" property="value" />
+        <result column="sort" property="sort" />
+    </resultMap>
+
+</mapper>

+ 2 - 4
zen-orm/build.gradle

@@ -1,6 +1,4 @@
 dependencies {
     compile project(":zen-common")
-    compile project(":zen-config")
-    compile project(":zen-log")
-    compile project(":zen-api")
-}
+//    compile project(":zen-api")
+}

+ 55 - 0
zen-orm/src/main/java/a/A.java

@@ -0,0 +1,55 @@
+package a;
+
+import com.gxzc.zen.orm.DynamicDataSource;
+import com.gxzc.zen.orm.DynamicMultipleDataSource;
+import kotlin.TypeCastException;
+import kotlin.jvm.internal.Intrinsics;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.Signature;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.jetbrains.annotations.NotNull;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+
+import java.lang.reflect.Method;
+import java.util.Objects;
+
+@Aspect
+@Order(-1)
+@Component
+public class A {
+
+    @Before("execution(* com.gxzc.zen.api.sys.*.*Service.*(..))")
+    public void dataSourceSys(@NotNull JoinPoint joinPoint) {
+        Intrinsics.checkParameterIsNotNull(joinPoint, "joinPoint");
+        this.setDataSource(joinPoint, "sysDataSource");
+    }
+
+    @Before("execution(* com.gxzc.zen.api.rec.*.*Service.*(..))")
+    public void dataSourceRec(@NotNull JoinPoint joinPoint) {
+        Intrinsics.checkParameterIsNotNull(joinPoint, "joinPoint");
+        this.setDataSource(joinPoint, "recDataSource");
+    }
+
+    private void setDataSource(JoinPoint joinPoint, String defaultKey) {
+        DynamicDataSource dynamicDataSource = this.currentMethod(joinPoint).getAnnotation(DynamicDataSource.class);
+        if (Objects.isNull(dynamicDataSource)) {
+            DynamicMultipleDataSource.Companion.setDataSource(defaultKey);
+        } else {
+            DynamicMultipleDataSource.Companion.setDataSource(dynamicDataSource.value());
+        }
+    }
+
+    private Method currentMethod(JoinPoint joinPoint) {
+        Signature var10000 = joinPoint.getSignature();
+        if (var10000 == null) {
+            throw new TypeCastException("null cannot be cast to non-null type org.aspectj.lang.reflect.MethodSignature");
+        } else {
+            Method var2 = ((MethodSignature) var10000).getMethod();
+            Intrinsics.checkExpressionValueIsNotNull(var2, "(joinPoint.signature as MethodSignature).method");
+            return var2;
+        }
+    }
+}

+ 3 - 3
zen-orm/src/main/kotlin/com/gxzc/zen/Generator.kt

@@ -26,12 +26,12 @@ fun main(args: Array<String>) {
         isFileOverride = true
         isActiveRecord = false
         isEnableCache = false
-        isOpen = true
+        isOpen = false
         author = "NorthLan"
         isKotlin = true
         isBaseResultMap = true
-        mapperName = "%sDao"
-        xmlName = "%sDao"
+        mapperName = "%sMapper"
+        xmlName = "%sMapper"
         serviceName = "I%sService"
         serviceImplName = "%sServiceImpl"
     }

+ 44 - 0
zen-orm/src/main/kotlin/com/gxzc/zen/orm/DataSourceSwitchAspect.kt

@@ -0,0 +1,44 @@
+package com.gxzc.zen.orm
+
+import org.aspectj.lang.JoinPoint
+import org.aspectj.lang.annotation.Aspect
+import org.aspectj.lang.annotation.Before
+import org.aspectj.lang.reflect.MethodSignature
+import org.springframework.core.annotation.Order
+import java.lang.reflect.Method
+import java.util.*
+
+/**
+ *
+ * @author NorthLan at 2018/1/29
+ */
+@Aspect
+@Order(-1)
+class DataSourceSwitchAspect {
+
+    @Before("execution(* com.gxzc.zen.api.sys.*.*Service.*(..))")
+    fun dataSourceSys(joinPoint: JoinPoint) {
+        setDataSource(joinPoint, MultipleDataSourceConfig.DS_KEY_SYS)
+    }
+
+    @Before("execution(* com.gxzc.zen.api.rec.*.*Service.*(..))")
+    fun dataSourceRec(joinPoint: JoinPoint) {
+        setDataSource(joinPoint, MultipleDataSourceConfig.DS_KEY_REC)
+    }
+
+    /**
+     * 设置数据源key
+     */
+    private fun setDataSource(joinPoint: JoinPoint, defaultKey: String) {
+        val dynamicDataSource = currentMethod(joinPoint).getAnnotation(DynamicDataSource::class.java)
+        if (Objects.isNull(dynamicDataSource)) {
+            DynamicMultipleDataSource.setDataSource(defaultKey)
+            return
+        }
+        DynamicMultipleDataSource.setDataSource(dynamicDataSource.value)
+    }
+
+    private fun currentMethod(joinPoint: JoinPoint): Method {
+        return (joinPoint.signature as MethodSignature).method
+    }
+}

+ 35 - 0
zen-orm/src/main/kotlin/com/gxzc/zen/orm/DataSourceSwitchMethodInterceptor.kt

@@ -0,0 +1,35 @@
+//package com.gxzc.zen.orm
+//
+//import org.aopalliance.intercept.MethodInterceptor
+//import org.aopalliance.intercept.MethodInvocation
+//import java.lang.reflect.Method
+//import java.util.*
+//
+///**
+// *
+// * @author NorthLan at 2018/1/29
+// */
+//
+//class DataSourceSwitchMethodInterceptor : MethodInterceptor {
+//    override fun invoke(invocation: MethodInvocation): Any {
+//        val packageName = invocation.`this`.javaClass.`package`.name
+//        if ("api.sys" in packageName) {
+//            setDataSourceKey(invocation.method, MultipleDataSourceConfig.DS_KEY_SYS)
+//        } else if ("api.rec" in packageName) {
+//            setDataSourceKey(invocation.method, MultipleDataSourceConfig.DS_KEY_REC)
+//        }
+//        return invocation.proceed()
+//    }
+//
+//    /**
+//     * 设置数据源key
+//     */
+//    private fun setDataSourceKey(method: Method, defaultKey: String) {
+//        val dynamicDataSource = method.getAnnotation(DynamicDataSource::class.java)
+//        if (Objects.isNull(dynamicDataSource)) {
+//            DynamicMultipleDataSource.setDataSource(defaultKey)
+//            return
+//        }
+//        DynamicMultipleDataSource.setDataSource(dynamicDataSource.value)
+//    }
+//}

+ 0 - 46
zen-orm/src/main/kotlin/com/gxzc/zen/orm/DruidViewConfig.kt

@@ -1,46 +0,0 @@
-package com.gxzc.zen.orm
-
-import com.alibaba.druid.support.http.StatViewServlet
-import com.alibaba.druid.support.http.WebStatFilter
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty
-import org.springframework.boot.context.properties.ConfigurationProperties
-import org.springframework.boot.web.servlet.FilterRegistrationBean
-import org.springframework.boot.web.servlet.ServletRegistrationBean
-import org.springframework.context.annotation.Bean
-import org.springframework.context.annotation.Configuration
-
-/**
- *
- * @author NorthLan at 2018/1/26
- */
-@Configuration
-@ConfigurationProperties(prefix = "druid.view")
-@ConditionalOnProperty(prefix = "druid.view", name = ["enable"], havingValue = "true", matchIfMissing = true)
-class DruidViewConfig {
-    var username: String? = null
-    var password: String? = null
-    var slowSql: String? = null
-
-    @Bean
-//    @ConditionalOnProperty(prefix = "druid.view", name = ["enable"], havingValue = "true", matchIfMissing = true)
-    fun druidServlet(): ServletRegistrationBean {
-        return ServletRegistrationBean().also {
-            it.setServlet(StatViewServlet())
-            it.addUrlMappings("/druid/*")
-            it.addInitParameter("loginUsername", username)
-            it.addInitParameter("loginPassword", password)
-            it.addInitParameter("logSlowSql", slowSql)
-        }
-    }
-
-    @Bean
-//    @ConditionalOnProperty(prefix = "druid.view", name = ["enable"], havingValue = "true", matchIfMissing = true)
-    fun filterRegistrationBean(): FilterRegistrationBean {
-        return FilterRegistrationBean().also {
-            it.filter = WebStatFilter()
-            it.addUrlPatterns("/*")
-            it.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*")
-            it.addInitParameter("profileEnable", "true")
-        }
-    }
-}

+ 12 - 0
zen-orm/src/main/kotlin/com/gxzc/zen/orm/DynamicDataSource.kt

@@ -0,0 +1,12 @@
+package com.gxzc.zen.orm
+
+import org.springframework.core.annotation.AliasFor
+
+/**
+ *
+ * @author NorthLan at 2018/1/29
+ */
+@Retention(AnnotationRetention.RUNTIME)
+@Target(AnnotationTarget.FUNCTION, AnnotationTarget.TYPE)
+annotation class DynamicDataSource(@get:AliasFor("dataSource") val value: String = "",
+                                   @get:AliasFor("value") val dataSource: String = "")

+ 31 - 0
zen-orm/src/main/kotlin/com/gxzc/zen/orm/DynamicMultipleDataSource.kt

@@ -0,0 +1,31 @@
+package com.gxzc.zen.orm
+
+import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource
+
+/**
+ *
+ * @author NorthLan at 2018/1/29
+ */
+class DynamicMultipleDataSource : AbstractRoutingDataSource() {
+    init {
+        DATA_SOURCE_KEY.set(MultipleDataSourceConfig.DS_KEY_SYS)
+    }
+
+    companion object {
+        private val DATA_SOURCE_KEY = ThreadLocal<String>()
+
+        fun setDataSource(key: String) {
+            DATA_SOURCE_KEY.set(key)
+        }
+
+        fun clear() {
+            DATA_SOURCE_KEY.remove()
+        }
+    }
+
+    override fun determineCurrentLookupKey(): Any {
+        val lookupKey = DATA_SOURCE_KEY.get()
+        clear()
+        return lookupKey
+    }
+}

+ 84 - 0
zen-orm/src/main/kotlin/com/gxzc/zen/orm/MultipleDataSourceConfig.kt

@@ -0,0 +1,84 @@
+package com.gxzc.zen.orm
+
+import com.alibaba.druid.pool.DruidDataSource
+import com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean
+import com.baomidou.mybatisplus.spring.boot.starter.MybatisPlusProperties
+import com.baomidou.mybatisplus.spring.boot.starter.SpringBootVFS
+import org.mybatis.spring.annotation.MapperScan
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.beans.factory.annotation.Qualifier
+import org.springframework.boot.context.properties.ConfigurationProperties
+import org.springframework.boot.context.properties.EnableConfigurationProperties
+import org.springframework.context.annotation.Bean
+import org.springframework.context.annotation.Configuration
+import org.springframework.context.annotation.Primary
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver
+import org.springframework.jdbc.datasource.DataSourceTransactionManager
+import javax.sql.DataSource
+
+/**
+ *
+ * @author NorthLan at 2018/1/29
+ */
+@Configuration
+@EnableConfigurationProperties(MybatisPlusProperties::class)
+@MapperScan("com.gxzc.zen.api.*.mapper")
+class MultipleDataSourceConfig {
+    companion object {
+        const val DS_KEY_SYS = "sysDataSource"
+        const val DS_KEY_REC = "recDataSource"
+    }
+
+    @Autowired
+    private lateinit var properties: MybatisPlusProperties
+
+    private val mapperLocation: String = "classpath:/mapping/*/*.xml"
+
+
+    @Bean(DS_KEY_SYS)
+    @ConfigurationProperties(prefix = "datasource.sys")
+    @Primary
+    fun dataSourceSys(): DataSource {
+        return DruidDataSource()
+    }
+
+    @Bean(DS_KEY_REC)
+    @ConfigurationProperties(prefix = "datasource.rec")
+    fun dataSourceRec(): DataSource {
+        return DruidDataSource()
+    }
+
+    @Bean
+    fun multipleDataSource(@Qualifier(DS_KEY_SYS) dataSourceSys: DataSource,
+                           @Qualifier(DS_KEY_REC) dataSourceRec: DataSource): DynamicMultipleDataSource {
+        return DynamicMultipleDataSource().also {
+            it.setTargetDataSources(mapOf(Pair(DS_KEY_SYS, dataSourceSys), Pair(DS_KEY_REC, dataSourceRec)))
+            it.setDefaultTargetDataSource(dataSourceSys)
+        }
+    }
+
+    @Bean
+    fun transactionManager(dynamicMultipleDataSource: DynamicMultipleDataSource): DataSourceTransactionManager {
+        return DataSourceTransactionManager(dynamicMultipleDataSource)
+    }
+
+    @Bean
+    @Primary
+    fun mybatisSqlSessionFactoryBean(dynamicMultipleDataSource: DynamicMultipleDataSource): MybatisSqlSessionFactoryBean {
+        return MybatisSqlSessionFactoryBean().also {
+            it.setDataSource(dynamicMultipleDataSource)
+            it.vfs = SpringBootVFS::class.java
+            it.setConfiguration(properties.configuration)
+            it.setGlobalConfig(properties.globalConfig?.convertGlobalConfiguration())
+            it.setMapperLocations(PathMatchingResourcePatternResolver().getResources(mapperLocation))
+        }
+    }
+
+//    @Bean
+//    fun sqlSessionFactory(dynamicMultipleDataSource: DynamicMultipleDataSource): SqlSessionFactory {
+//        return SqlSessionFactoryBean().let {
+//            it.setDataSource(dynamicMultipleDataSource)
+//            it.`object`
+//        }
+//    }
+}

+ 64 - 69
zen-orm/src/main/kotlin/com/gxzc/zen/orm/RecDataSourceConfig.kt

@@ -1,69 +1,64 @@
-package com.gxzc.zen.orm
-
-import com.alibaba.druid.pool.DruidDataSource
-import com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean
-import com.baomidou.mybatisplus.spring.boot.starter.MybatisPlusProperties
-import com.baomidou.mybatisplus.spring.boot.starter.SpringBootVFS
-import org.apache.ibatis.session.SqlSessionFactory
-import org.mybatis.spring.SqlSessionTemplate
-import org.mybatis.spring.annotation.MapperScan
-import org.slf4j.Logger
-import org.slf4j.LoggerFactory
-import org.springframework.beans.factory.annotation.Autowired
-import org.springframework.beans.factory.annotation.Qualifier
-import org.springframework.boot.context.properties.ConfigurationProperties
-import org.springframework.context.annotation.Bean
-import org.springframework.context.annotation.Configuration
-import org.springframework.core.io.support.PathMatchingResourcePatternResolver
-import org.springframework.jdbc.datasource.DataSourceTransactionManager
-import javax.sql.DataSource
-
-/**
- * Rec 数据源配置<br>
- * 扫描路径为 com.gxzc.zen.*.rec
- * @author NorthLan at 2018/1/26
- */
-@Configuration
-@MapperScan(basePackages = ["com.gxzc.zen.api.rec.mapper"], sqlSessionTemplateRef = RecDataSourceConfig.SQL_SESSION_TEMPLATE_NAME)
-class RecDataSourceConfig {
-    companion object {
-        const val DATASOURCE_NAME: String = "recDataSource"
-        const val TRANSACTION_MANAGER_NAME: String = "recTransactionManager"
-        const val SQL_SESSION_FACTORY_NAME: String = "recSqlSessionFactory"
-        const val SQL_SESSION_TEMPLATE_NAME: String = "recSqlSessionTemplate"
-        val logger: Logger = LoggerFactory.getLogger(RecDataSourceConfig::class.java)
-    }
-
-    @Autowired
-    private lateinit var properties: MybatisPlusProperties
-
-    private val mapperLocation: String = "classpath:/mapping/rec/*.xml"
-
-    @Bean(DATASOURCE_NAME)
-    @ConfigurationProperties(prefix = "druid.datasource.rec")
-    fun dataSource(): DataSource {
-        return DruidDataSource()
-    }
-
-    @Bean(TRANSACTION_MANAGER_NAME)
-    fun transactionManager(@Qualifier(DATASOURCE_NAME) dataSource: DataSource): DataSourceTransactionManager {
-        return DataSourceTransactionManager(dataSource)
-    }
-
-    @Bean(SQL_SESSION_FACTORY_NAME)
-    fun sqlSessionFactory(@Qualifier(DATASOURCE_NAME) dataSource: DataSource): SqlSessionFactory {
-        return MybatisSqlSessionFactoryBean().let {
-            it.setDataSource(dataSource)
-            it.vfs = SpringBootVFS::class.java
-            it.setConfiguration(properties.configuration)
-            it.setGlobalConfig(properties.globalConfig.convertGlobalConfiguration())
-            it.setMapperLocations(PathMatchingResourcePatternResolver().getResources(mapperLocation))
-            it.`object`
-        }
-    }
-
-    @Bean(SQL_SESSION_TEMPLATE_NAME)
-    fun sqlSessionTemplate(@Qualifier(SQL_SESSION_FACTORY_NAME) sqlSessionFactory: SqlSessionFactory): SqlSessionTemplate {
-        return SqlSessionTemplate(sqlSessionFactory)
-    }
-}
+//package com.gxzc.zen.orm
+//
+//import com.alibaba.druid.pool.DruidDataSource
+//import com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean
+//import com.baomidou.mybatisplus.spring.boot.starter.MybatisPlusProperties
+//import com.baomidou.mybatisplus.spring.boot.starter.SpringBootVFS
+//import org.apache.ibatis.session.SqlSessionFactory
+//import org.mybatis.spring.annotation.MapperScan
+//import org.slf4j.Logger
+//import org.slf4j.LoggerFactory
+//import org.springframework.beans.factory.annotation.Autowired
+//import org.springframework.beans.factory.annotation.Qualifier
+//import org.springframework.boot.context.properties.ConfigurationProperties
+//import org.springframework.boot.context.properties.EnableConfigurationProperties
+//import org.springframework.context.annotation.Bean
+//import org.springframework.context.annotation.Configuration
+//import org.springframework.core.io.support.PathMatchingResourcePatternResolver
+//import org.springframework.jdbc.datasource.DataSourceTransactionManager
+//import javax.sql.DataSource
+//
+///**
+// * Rec 数据源配置<br>
+// * 扫描路径为 com.gxzc.zen.*.rec
+// * @author NorthLan at 2018/1/26
+// */
+//@Configuration
+//@EnableConfigurationProperties(MybatisPlusProperties::class)
+//@MapperScan(basePackages = ["com.gxzc.zen.api.rec.mapper"], sqlSessionFactoryRef = RecDataSourceConfig.SQL_SESSION_FACTORY_NAME)
+//class RecDataSourceConfig {
+//    companion object {
+//        const val DATASOURCE_NAME: String = "recDataSource"
+//        const val TRANSACTION_MANAGER_NAME: String = "recTransactionManager"
+//        const val SQL_SESSION_FACTORY_NAME: String = "recSqlSessionFactory"
+//        val logger: Logger = LoggerFactory.getLogger(RecDataSourceConfig::class.java)
+//    }
+//
+//    @Autowired
+//    private lateinit var properties: MybatisPlusProperties
+//
+//    private val mapperLocation: String = "classpath:/mapping/rec/*.xml"
+//
+////    @Bean(DATASOURCE_NAME)
+////    @ConfigurationProperties(prefix = "datasource.rec")
+////    fun dataSource(): DataSource {
+////        return DruidDataSource()
+////    }
+//
+//    @Bean(TRANSACTION_MANAGER_NAME)
+//    fun transactionManager(@Qualifier(DATASOURCE_NAME) dataSource: DataSource): DataSourceTransactionManager {
+//        return DataSourceTransactionManager(dataSource)
+//    }
+//
+//    @Bean(SQL_SESSION_FACTORY_NAME)
+//    fun sqlSessionFactory(@Qualifier(DATASOURCE_NAME) dataSource: DataSource): SqlSessionFactory {
+//        return MybatisSqlSessionFactoryBean().let {
+//            it.setDataSource(dataSource)
+//            it.vfs = SpringBootVFS::class.java
+//            it.setConfiguration(properties.configuration)
+//            it.setGlobalConfig(properties.globalConfig?.convertGlobalConfiguration())
+//            it.setMapperLocations(PathMatchingResourcePatternResolver().getResources(mapperLocation))
+//            it.`object`
+//        }
+//    }
+//}

+ 68 - 74
zen-orm/src/main/kotlin/com/gxzc/zen/orm/SysDataSourceConfig.kt

@@ -1,74 +1,68 @@
-package com.gxzc.zen.orm
-
-import com.alibaba.druid.pool.DruidDataSource
-import com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean
-import com.baomidou.mybatisplus.spring.boot.starter.MybatisPlusProperties
-import com.baomidou.mybatisplus.spring.boot.starter.SpringBootVFS
-import org.apache.ibatis.session.SqlSessionFactory
-import org.mybatis.spring.SqlSessionTemplate
-import org.mybatis.spring.annotation.MapperScan
-import org.slf4j.Logger
-import org.slf4j.LoggerFactory
-import org.springframework.beans.factory.annotation.Autowired
-import org.springframework.beans.factory.annotation.Qualifier
-import org.springframework.boot.context.properties.ConfigurationProperties
-import org.springframework.context.annotation.Bean
-import org.springframework.context.annotation.Configuration
-import org.springframework.context.annotation.Primary
-import org.springframework.core.io.support.PathMatchingResourcePatternResolver
-import org.springframework.jdbc.datasource.DataSourceTransactionManager
-import javax.sql.DataSource
-
-/**
- * Sys 数据源配置<br>
- * 扫描路径为 com.gxzc.zen.*.sys
- * @author NorthLan at 2018/1/26
- */
-@Configuration
-@MapperScan(basePackages = ["com.gxzc.zen.api.sys.mapper"], sqlSessionTemplateRef = SysDataSourceConfig.SQL_SESSION_TEMPLATE_NAME)
-class SysDataSourceConfig {
-    companion object {
-        const val DATASOURCE_NAME: String = "sysDataSource"
-        const val TRANSACTION_MANAGER_NAME: String = "sysTransactionManager"
-        const val SQL_SESSION_FACTORY_NAME: String = "sysSqlSessionFactory"
-        const val SQL_SESSION_TEMPLATE_NAME: String = "sysSqlSessionTemplate"
-        val logger: Logger = LoggerFactory.getLogger(SysDataSourceConfig::class.java)
-    }
-
-    @Autowired
-    private lateinit var properties: MybatisPlusProperties
-
-    private val mapperLocation: String = "classpath:/mapping/sys/*.xml"
-
-    @Bean(DATASOURCE_NAME)
-    @ConfigurationProperties(prefix = "druid.datasource.sys")
-    @Primary
-    fun dataSource(): DataSource {
-        return DruidDataSource()
-    }
-
-    @Bean(TRANSACTION_MANAGER_NAME)
-    @Primary
-    fun transactionManager(@Qualifier(DATASOURCE_NAME) dataSource: DataSource): DataSourceTransactionManager {
-        return DataSourceTransactionManager(dataSource)
-    }
-
-    @Bean(SQL_SESSION_FACTORY_NAME)
-    @Primary
-    fun sqlSessionFactory(@Qualifier(DATASOURCE_NAME) dataSource: DataSource): SqlSessionFactory {
-        return MybatisSqlSessionFactoryBean().let {
-            it.setDataSource(dataSource)
-            it.vfs = SpringBootVFS::class.java
-            it.setConfiguration(properties.configuration)
-            it.setGlobalConfig(properties.globalConfig.convertGlobalConfiguration())
-            it.setMapperLocations(PathMatchingResourcePatternResolver().getResources(mapperLocation))
-            it.`object`
-        }
-    }
-
-    @Bean(SQL_SESSION_TEMPLATE_NAME)
-    @Primary
-    fun sqlSessionTemplate(@Qualifier(SQL_SESSION_FACTORY_NAME) sqlSessionFactory: SqlSessionFactory): SqlSessionTemplate {
-        return SqlSessionTemplate(sqlSessionFactory)
-    }
-}
+//package com.gxzc.zen.orm
+//
+//import com.alibaba.druid.pool.DruidDataSource
+//import com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean
+//import com.baomidou.mybatisplus.spring.boot.starter.MybatisPlusProperties
+//import com.baomidou.mybatisplus.spring.boot.starter.SpringBootVFS
+//import org.apache.ibatis.session.SqlSessionFactory
+//import org.mybatis.spring.annotation.MapperScan
+//import org.slf4j.Logger
+//import org.slf4j.LoggerFactory
+//import org.springframework.beans.factory.annotation.Autowired
+//import org.springframework.beans.factory.annotation.Qualifier
+//import org.springframework.boot.context.properties.ConfigurationProperties
+//import org.springframework.boot.context.properties.EnableConfigurationProperties
+//import org.springframework.context.annotation.Bean
+//import org.springframework.context.annotation.Configuration
+//import org.springframework.context.annotation.Primary
+//import org.springframework.core.io.support.PathMatchingResourcePatternResolver
+//import org.springframework.jdbc.datasource.DataSourceTransactionManager
+//import javax.sql.DataSource
+//
+///**
+// * Sys 数据源配置<br>
+// * 扫描路径为 com.gxzc.zen.*.sys
+// * @author NorthLan at 2018/1/26
+// */
+//@Configuration
+//@EnableConfigurationProperties(MybatisPlusProperties::class)
+//@MapperScan(basePackages = ["com.gxzc.zen.api.sys.mapper"], sqlSessionFactoryRef = SysDataSourceConfig.SQL_SESSION_FACTORY_NAME)
+//class SysDataSourceConfig {
+//    companion object {
+//        const val DATASOURCE_NAME: String = "sysDataSource"
+//        const val TRANSACTION_MANAGER_NAME: String = "sysTransactionManager"
+//        const val SQL_SESSION_FACTORY_NAME: String = "sysSqlSessionFactory"
+//        val logger: Logger = LoggerFactory.getLogger(SysDataSourceConfig::class.java)
+//    }
+//
+//    @Autowired
+//    private lateinit var properties: MybatisPlusProperties
+//
+//    private val mapperLocation: String = "classpath:/mapping/sys/*.xml"
+//
+////    @Bean(DATASOURCE_NAME)
+////    @ConfigurationProperties(prefix = "datasource.sys")
+////    @Primary
+////    fun dataSource(): DataSource {
+////        return DruidDataSource()
+////    }
+//
+//    @Bean(TRANSACTION_MANAGER_NAME)
+//    @Primary
+//    fun transactionManager(@Qualifier(DATASOURCE_NAME) dataSource: DataSource): DataSourceTransactionManager {
+//        return DataSourceTransactionManager(dataSource)
+//    }
+//
+//    @Bean(SQL_SESSION_FACTORY_NAME)
+//    @Primary
+//    fun sqlSessionFactory(@Qualifier(DATASOURCE_NAME) dataSource: DataSource): SqlSessionFactory {
+//        return MybatisSqlSessionFactoryBean().let {
+//            it.setDataSource(dataSource)
+//            it.vfs = SpringBootVFS::class.java
+//            it.setConfiguration(properties.configuration)
+//            it.setGlobalConfig(properties.globalConfig?.convertGlobalConfiguration())
+//            it.setMapperLocations(PathMatchingResourcePatternResolver().getResources(mapperLocation))
+//            it.`object`
+//        }
+//    }
+//}

+ 69 - 0
zen-orm/src/main/kotlin/com/gxzc/zen/orm/UsageDataSourceConfig.kt

@@ -0,0 +1,69 @@
+//package com.gxzc.zen.orm
+//
+//import com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean
+//import com.baomidou.mybatisplus.spring.boot.starter.MybatisPlusProperties
+//import com.baomidou.mybatisplus.spring.boot.starter.SpringBootVFS
+//import org.apache.ibatis.session.SqlSessionFactory
+//import org.mybatis.spring.SqlSessionTemplate
+//import org.mybatis.spring.annotation.MapperScan
+//import org.slf4j.Logger
+//import org.slf4j.LoggerFactory
+//import org.springframework.beans.factory.annotation.Autowired
+//import org.springframework.beans.factory.annotation.Qualifier
+//import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder
+//import org.springframework.boot.context.properties.ConfigurationProperties
+//import org.springframework.context.annotation.Bean
+//import org.springframework.context.annotation.Configuration
+//import org.springframework.core.io.support.PathMatchingResourcePatternResolver
+//import org.springframework.jdbc.datasource.DataSourceTransactionManager
+//import javax.sql.DataSource
+//
+///**
+// * Usage 数据源配置<br>
+// * 扫描路径为 com.gxzc.zen.*.usage
+// * @author NorthLan at 2018/1/26
+// */
+//@Configuration
+//@MapperScan(basePackages = ["com.gxzc.zen.api.usage.mapper"], sqlSessionTemplateRef = UsageDataSourceConfig.SQL_SESSION_TEMPLATE_NAME)
+//class UsageDataSourceConfig {
+//    companion object {
+//        const val DATASOURCE_NAME: String = "usageDataSource"
+//        const val TRANSACTION_MANAGER_NAME: String = "usageTransactionManager"
+//        const val SQL_SESSION_FACTORY_NAME: String = "usageSqlSessionFactory"
+//        const val SQL_SESSION_TEMPLATE_NAME: String = "usageSqlSessionTemplate"
+//        val logger: Logger = LoggerFactory.getLogger(UsageDataSourceConfig::class.java)
+//    }
+//
+//    @Autowired
+//    private lateinit var properties: MybatisPlusProperties
+//
+//    private val mapperLocation: String = "classpath:/mapping/usage/*.xml"
+//
+//    @Bean(DATASOURCE_NAME)
+//    @ConfigurationProperties(prefix = "druid.datasource.usage")
+//    fun dataSource(): DataSource {
+//        return DataSourceBuilder.create().build()
+//    }
+//
+//    @Bean(TRANSACTION_MANAGER_NAME)
+//    fun transactionManager(@Qualifier(DATASOURCE_NAME) dataSource: DataSource): DataSourceTransactionManager {
+//        return DataSourceTransactionManager(dataSource)
+//    }
+//
+//    @Bean(SQL_SESSION_FACTORY_NAME)
+//    fun sqlSessionFactory(@Qualifier(DATASOURCE_NAME) dataSource: DataSource): SqlSessionFactory {
+//        return MybatisSqlSessionFactoryBean().let {
+//            it.setDataSource(dataSource)
+//            it.vfs = SpringBootVFS::class.java
+//            it.setConfiguration(properties.configuration)
+//            it.setGlobalConfig(properties.globalConfig.convertGlobalConfiguration())
+//            it.setMapperLocations(PathMatchingResourcePatternResolver().getResources(mapperLocation))
+//            it.`object`
+//        }
+//    }
+//
+//    @Bean(SQL_SESSION_TEMPLATE_NAME)
+//    fun sqlSessionTemplate(@Qualifier(SQL_SESSION_FACTORY_NAME) sqlSessionFactory: SqlSessionFactory): SqlSessionTemplate {
+//        return SqlSessionTemplate(sqlSessionFactory)
+//    }
+//}

+ 97 - 46
zen-orm/src/main/resources/application-orm.yml

@@ -4,7 +4,8 @@
 
 ###################  mybatis-plus配置  ###################
 mybatis-plus:
-#  mapper-locations: classpath:/mapping/*/*.xml
+#  mapper-locations: classpath*:mapping/**/*.xml
+#  type-aliases-package: com.gxzc.zen.api.rec.mapper,com.gxzc.zen.api.sys.mapper #,com.gxzc.zen.api.useage.mapper
   global-config:
     id-type: 0  #0:数据库ID自增   1:用户输入id  2:全局唯一id(IdWorker)  3:全局唯一ID(uuid)
     db-column-underline: true
@@ -20,50 +21,100 @@ mybatis-plus:
 
 
 ################## Alibaba Druid 配置 ##################
-druid:
-  view:
-    enable: true
+spring:
+  datasource:
+    druid:
+      stat-view-servlet:
+        enabled: true
+        login-username: root
+        login-password: root
+        reset-enable: false
+
+datasource:
+  sys:
+    mapper-location: classpath:mapping/sys/*.xml
+    name: archives_sys
+    url: jdbc:mysql://127.0.0.1:3306/archives_sys?useUnicode=true&characterEncoding=utf-8&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&zeroDateTimeBehavior=convertToNull
     username: root
     password: root
-    slowSql: true
-  datasource:
-    sys:
-      mapper-location: classpath:mapper/sys/*.xml
-      name: archives_sys
-      url: jdbc:mysql://127.0.0.1:3306/archives_sys?useUnicode=true&characterEncoding=utf-8&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&zeroDateTimeBehavior=convertToNull
-      username: root
-      password: root
-      testWhileIdle: true
-      testOnBorrow: false
-      testOnReturn: false
-      validationQuery: SELECT 1
-      asyncInit: false # 异步初始化
-      filters: log4j,wall,mergeStat
-      keepAlive: false
-      driver-class-name: com.mysql.jdbc.Driver
-      initialize: false #指定初始化数据源,是否用data.sql来初始化,默认: true
-      initialSize: 5
-      minIdle: 5
-      maxActive: 20
-      timeBetweenEvictionRunsMillis: 60000
-      minEvictableIdleTimeMillis: 30000
-    rec:
-      mapper-location: classpath:mapper/rec/*.xml
-      name: archives_rec
-      url: jdbc:mysql://127.0.0.1:3306/archives_rec?useUnicode=true&characterEncoding=utf-8&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&zeroDateTimeBehavior=convertToNull
-      username: root
-      password: root
-      testWhileIdle: true
-      testOnBorrow: false
-      testOnReturn: false
-      validationQuery: SELECT 1
-      asyncInit: false # 异步初始化
-      filters: log4j,wall,mergeStat
-      keepAlive: false
-      driver-class-name: com.mysql.jdbc.Driver
-      initialize: false #指定初始化数据源,是否用data.sql来初始化,默认: true
-      initialSize: 5
-      minIdle: 5
-      maxActive: 20
-      timeBetweenEvictionRunsMillis: 60000
-      minEvictableIdleTimeMillis: 30000
+    testWhileIdle: true
+    testOnBorrow: false
+    testOnReturn: false
+    validationQuery: SELECT 1
+    asyncInit: false # 异步初始化
+    filters: log4j,wall,mergeStat
+    keepAlive: false
+    driver-class-name: com.mysql.jdbc.Driver
+    initialize: false #指定初始化数据源,是否用data.sql来初始化,默认: true
+    initialSize: 5
+    minIdle: 5
+    maxActive: 20
+    timeBetweenEvictionRunsMillis: 60000
+    minEvictableIdleTimeMillis: 30000
+  rec:
+    mapper-location: classpath:mapping/rec/*.xml
+    name: archives_rec
+    url: jdbc:mysql://127.0.0.1:3306/archives_rec?useUnicode=true&characterEncoding=utf-8&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&zeroDateTimeBehavior=convertToNull
+    username: root
+    password: root
+    testWhileIdle: true
+    testOnBorrow: false
+    testOnReturn: false
+    validationQuery: SELECT 1
+    asyncInit: false # 异步初始化
+    filters: log4j,wall,mergeStat
+    keepAlive: false
+    driver-class-name: com.mysql.jdbc.Driver
+    initialize: false #指定初始化数据源,是否用data.sql来初始化,默认: true
+    initialSize: 5
+    minIdle: 5
+    maxActive: 20
+    timeBetweenEvictionRunsMillis: 60000
+    minEvictableIdleTimeMillis: 30000
+  usage:
+    mapper-location: classpath:mapping/usage/*.xml
+    name: archives_usage
+    url: jdbc:mysql://127.0.0.1:3306/archives_usage?useUnicode=true&characterEncoding=utf-8&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&zeroDateTimeBehavior=convertToNull
+    username: root
+    password: root
+    testWhileIdle: true
+    testOnBorrow: false
+    testOnReturn: false
+    validationQuery: SELECT 1
+    asyncInit: false # 异步初始化
+    filters: log4j,wall,mergeStat
+    keepAlive: false
+    driver-class-name: com.mysql.jdbc.Driver
+    initialize: false #指定初始化数据源,是否用data.sql来初始化,默认: true
+    initialSize: 5
+    minIdle: 5
+    maxActive: 20
+    timeBetweenEvictionRunsMillis: 60000
+    minEvictableIdleTimeMillis: 30000
+
+##sharding-jdbc
+#sharding:
+#  jdbc:
+#    datasource:
+#      names: ds_sys,ds_rec
+#      ds_sys:
+#        type: com.alibaba.druid.pool.DruidDataSource
+#        driver-class-name: com.mysql.jdbc.Driver
+#        url: jdbc:mysql://127.0.0.1:3306/archives_sys?useUnicode=true&characterEncoding=utf-8&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&zeroDateTimeBehavior=convertToNull
+#        username: root
+#        password: root
+#        maxActive: 20
+#      ds_rec:
+#        type: com.alibaba.druid.pool.DruidDataSource
+#        driver-class-name: com.mysql.jdbc.Driver
+#        url: jdbc:mysql://127.0.0.1:3306/archives_rec?useUnicode=true&characterEncoding=utf-8&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&zeroDateTimeBehavior=convertToNull
+#        username: root
+#        password: root
+#        maxActive: 20
+#    config:
+#      sharding:
+#        tables:
+#          sys_dept:
+#            actualDataNodes: 'ds_sys
+#          sys_dic:
+#          sys_param:

+ 0 - 2
zen-umps/build.gradle

@@ -1,5 +1,3 @@
 dependencies {
     compile project(":zen-common")
-    compile project(":zen-config")
-    compile project(":zen-log")
 }