Browse Source

数据库引擎

xuezizhuo 2 years ago
parent
commit
ad93b4b2ea

+ 96 - 0
customer.iml

@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
+  <component name="FacetManager">
+    <facet type="web" name="Web">
+      <configuration>
+        <webroots />
+        <sourceRoots>
+          <root url="file://$MODULE_DIR$/src/main/java" />
+          <root url="file://$MODULE_DIR$/src/main/resources" />
+        </sourceRoots>
+      </configuration>
+    </facet>
+    <facet type="Spring" name="Spring">
+      <configuration />
+    </facet>
+  </component>
+  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
+    <output url="file://$MODULE_DIR$/target/classes" />
+    <output-test url="file://$MODULE_DIR$/target/test-classes" />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
+      <excludeFolder url="file://$MODULE_DIR$/target" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web:2.7.8" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.7.8" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.7.8" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.7.8" level="project" />
+    <orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.11" level="project" />
+    <orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.11" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.17.2" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.17.2" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.36" level="project" />
+    <orderEntry type="library" name="Maven: jakarta.annotation:jakarta.annotation-api:1.3.5" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-core:5.3.25" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.3.25" level="project" />
+    <orderEntry type="library" name="Maven: org.yaml:snakeyaml:1.30" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-json:2.7.8" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.13.4.2" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.13.4" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.13.4" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.13.4" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.13.4" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.13.4" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-tomcat:2.7.8" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-core:9.0.71" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-el:9.0.71" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:9.0.71" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-web:5.3.25" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-beans:5.3.25" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.3.25" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-aop:5.3.25" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-context:5.3.25" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-expression:5.3.25" level="project" />
+    <orderEntry type="library" name="Maven: com.mysql:mysql-connector-j:8.0.32" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-boot-starter:3.5.2" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus:3.5.2" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-extension:3.5.2" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-core:3.5.2" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-annotation:3.5.2" level="project" />
+    <orderEntry type="library" name="Maven: com.github.jsqlparser:jsqlparser:4.4" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis:mybatis:3.5.10" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis:mybatis-spring:2.0.7" level="project" />
+    <orderEntry type="library" name="Maven: org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21" level="project" />
+    <orderEntry type="library" name="Maven: org.jetbrains.kotlin:kotlin-stdlib:1.6.21" level="project" />
+    <orderEntry type="library" name="Maven: org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21" level="project" />
+    <orderEntry type="library" name="Maven: org.jetbrains:annotations:13.0" level="project" />
+    <orderEntry type="library" name="Maven: org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.6.21" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.7.8" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-jdbc:2.7.8" level="project" />
+    <orderEntry type="library" name="Maven: com.zaxxer:HikariCP:4.0.3" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.36" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-jdbc:5.3.25" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-tx:5.3.25" level="project" />
+    <orderEntry type="library" name="Maven: org.projectlombok:lombok:1.18.24" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:druid:1.1.13" level="project" />
+    <orderEntry type="library" name="Maven: com.microsoft.sqlserver:mssql-jdbc:10.2.3.jre8" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:dynamic-datasource-spring-boot-starter:3.5.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-aop:2.7.8" level="project" />
+    <orderEntry type="library" name="Maven: org.aspectj:aspectjweaver:1.9.7" level="project" />
+    <orderEntry type="library" name="Maven: com.oracle:ojdbc6:11.2.0.3" level="project" />
+    <orderEntry type="module-library">
+      <library name="Maven: com.dm:DmJdbcDriver18:1.8">
+        <CLASSES>
+          <root url="jar://$MODULE_DIR$/src/main/resources/lib/DmJdbcDriver18.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="library" name="Maven: com.alibaba:fastjson:1.2.60" level="project" />
+  </component>
+</module>

+ 99 - 0
pom.xml

@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         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">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.customer</groupId>
+    <artifactId>customer</artifactId>
+    <version>1.0-SNAPSHOT</version>
+
+    <parent>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <groupId>org.springframework.boot</groupId>
+        <version>2.7.8</version>
+    </parent>
+
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.mysql</groupId>
+            <artifactId>mysql-connector-j</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <version>3.5.2</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+
+        <!-- alibaba 数据连接池 -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid</artifactId>
+            <version>1.1.13</version>
+        </dependency>
+
+        <!-- sqlserver 驱动 -->
+        <dependency>
+            <groupId>com.microsoft.sqlserver</groupId>
+            <artifactId>mssql-jdbc</artifactId>
+        </dependency>
+
+        <!-- 多数据源 -->
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
+            <version>3.5.0</version>
+        </dependency>
+
+        <!-- oracle 驱动 -->
+        <dependency>
+            <groupId>com.oracle</groupId>
+            <artifactId>ojdbc6</artifactId>
+            <version>11.2.0.3</version>
+        </dependency>
+
+        <!-- 达梦驱动 -->
+        <!-- 达梦数据库驱动 -->
+        <dependency>
+            <groupId>com.dm</groupId>
+            <artifactId>DmJdbcDriver18</artifactId>
+            <version>1.8</version>
+            <scope>system</scope>
+            <systemPath>${project.basedir}/src/main/resources/lib/DmJdbcDriver18.jar</systemPath>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.60</version>
+        </dependency>
+
+
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 16 - 0
src/main/java/com/customer/CustomerApplication.java

@@ -0,0 +1,16 @@
+package com.customer;
+
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+
+@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})
+@MapperScan(basePackages = "com.customer.mapper")
+public class CustomerApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(CustomerApplication.class,args);
+    }
+}

+ 20 - 0
src/main/java/com/customer/config/CrosConfig.java

@@ -0,0 +1,20 @@
+package com.customer.config;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.CorsRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+@Configuration
+public class CrosConfig implements WebMvcConfigurer {
+
+    static final String ORIGINS[] = new String[] { "GET", "POST", "PUT", "DELETE" };
+
+    @Override
+    public void addCorsMappings(CorsRegistry registry) {
+        registry.addMapping("/**") // 所有的当前站点的请求地址,都支持跨域访问。
+                .allowedOriginPatterns("*") // 所有的外部域都可跨域访问。 如果是localhost则很难配置,因为在跨域请求的时候,外部域的解析可能是localhost、127.0.0.1、主机名
+                .allowCredentials(true) // 是否支持跨域用户凭证
+                .allowedMethods(ORIGINS) // 当前站点支持的跨域请求类型是什么
+                .maxAge(3600); // 超时时长设置为1小时。 时间单位是秒。
+    }
+}

+ 51 - 0
src/main/java/com/customer/config/DataSourceConfig.java

@@ -0,0 +1,51 @@
+package com.customer.config;
+
+
+import com.alibaba.druid.pool.DruidDataSource;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+import java.util.HashMap;
+import java.util.Map;
+
+//数据源默认配置类
+@Configuration
+//事务管理,数据库连接这里涉及到事务的提交
+@EnableTransactionManagement
+public class DataSourceConfig {
+
+    // 动态注入数据库信息
+    @Value("${spring.datasource.url}")
+    private String url;
+    @Value("${spring.datasource.username}")
+    private String username;
+    @Value("${spring.datasource.password}")
+    private String password;
+    @Value("${spring.datasource.driver-class-name}")
+    private String driverClassName;
+    @Value("${spring.datasource.dbtype}")
+    private String dataType;
+
+    // 创建DynamicDataSource的bean交给SpringIOC容器管理
+    @Bean(name = "dynamicDataSource")
+    public DynamicDataSource dataSource() {
+        // 配置默认数据源
+        DruidDataSource datasource = new DruidDataSource();
+        datasource.setUrl(url);
+        datasource.setUsername(username);
+        datasource.setPassword(password);
+        datasource.setDriverClassName(driverClassName);
+        datasource.setTestWhileIdle(false);
+        datasource.setName("default");
+
+        DynamicDataSource dynamicDataSource = new DynamicDataSource();
+        Map<Object, Object> targetDataSources = new HashMap<>();
+        targetDataSources.put("defaultDataSource",datasource);
+        dynamicDataSource.setTargetDataSources(targetDataSources);
+        // 将该数据源设置成默认数据源
+        dynamicDataSource.setDefaultTargetDataSource(datasource);
+        return dynamicDataSource;
+    }
+}

+ 150 - 0
src/main/java/com/customer/config/DynamicDataSource.java

@@ -0,0 +1,150 @@
+package com.customer.config;
+
+import com.alibaba.druid.pool.DruidDataSource;
+import com.alibaba.druid.util.StringUtils;
+import org.apache.ibatis.mapping.Environment;
+import org.apache.ibatis.session.Configuration;
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+import java.lang.reflect.Field;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+import java.util.HashMap;
+import java.util.Map;
+
+//动态切换数据源具体实现类
+@EnableTransactionManagement //涉及到数据源一定要加事务管理注解
+public class DynamicDataSource extends AbstractRoutingDataSource {
+
+    // 通过ThreadLocal线程隔离的优势线程存储线程,当前线程只能操作当前线程的局部变量
+    private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();
+    // 把已有的数据源封装在Map里
+    private Map<Object, Object> dynamicTargetDataSources = new HashMap<>();
+
+    //通过重写AbstractRoutingDataSource的内置函数,来通过当前连接的数据源的key,进行数据源的获取
+    @Override
+    protected Object determineCurrentLookupKey() {
+        if (StringUtils.isEmpty(getDataSource())) {
+            return "default";
+        }
+        return getDataSource();
+    }
+
+    // 设置默认数据源(必须要有,否则无法启动)
+    @Override
+    public void setDefaultTargetDataSource(Object defaultTargetDataSource) {
+        super.setDefaultTargetDataSource(defaultTargetDataSource);
+    }
+
+    // 通过设置数据源
+    @Override
+    public void setTargetDataSources(Map<Object, Object> targetDataSources) {
+        super.setTargetDataSources(targetDataSources);
+    }
+
+    // 切换数据源,更改ThreadLocal中的局部变量
+    public static void setDataSource(String dataSource) {
+        contextHolder.set(dataSource);
+    }
+
+    // 获取数据源
+    public static String getDataSource() {
+        return contextHolder.get();
+    }
+
+    // 删除数据源(每次切换数据源的时候都应先移除已有数据源)
+    public static void clearDataSource() {
+        contextHolder.remove();
+    }
+
+
+    /**
+     * 创建一个新的数据源连接,并且设置此数据源为我们要用的数据源
+     *
+     * @param genConfig
+     * @return
+     * @throws NoSuchFieldException
+     * @throws IllegalAccessException
+     */
+    public boolean changeDataSource(GenConfig genConfig) throws NoSuchFieldException, IllegalAccessException {
+        String url = genConfig.url;
+        String driverClassName = genConfig.driverClassName;
+        String username = genConfig.username;
+        String password = genConfig.password;
+        String dbtype = genConfig.dbtype;
+        String dbName;
+
+        if ("oracle".equals(dbtype)) {
+            dbName = url.substring(url.lastIndexOf(":") + 1);
+        }else if("sqlserver".equals(dbtype)){
+            dbName = url.substring(url.indexOf("DatabaseName=") + 13);
+            url += ";encrypt=true;trustServerCertificate=true";
+        }else if("dm".equals(dbtype)){
+            dbName = url.substring(url.lastIndexOf("=") + 1);
+        } else {
+            dbName = url.substring(url.lastIndexOf("/") + 1);
+        }
+        // 测试连接
+        testConnection(driverClassName, url, username, password);
+
+        // 通过Druid数据库连接池连接数据库
+        DruidDataSource dataSource = new DruidDataSource();
+        //接收前端传递的参数并且注入进去
+        dataSource.setName(dbName);
+        dataSource.setUrl(url);
+        dataSource.setUsername(username);
+        dataSource.setPassword(password);
+        dataSource.setDriverClassName(driverClassName);
+        // 设置最大连接等待时间
+        dataSource.setMaxWait(4000);
+        // 数据源初始化
+        try {
+            dataSource.init();
+        } catch (SQLException e) {
+            // 创建失败则抛出异常
+            throw new RuntimeException();
+        }
+        //获取当前数据源的键值对存入Map
+        this.dynamicTargetDataSources.put(dbtype, dataSource);
+        // 设置数据源
+        this.setTargetDataSources(this.dynamicTargetDataSources);
+        // 解析数据源
+        super.afterPropertiesSet();
+        // 切换数据源
+        setDataSource(dbtype);
+        /*
+         ** 修改mybatis的数据源
+         * !!!重要,不修改mybatis的数据源的话,
+         * 即使切换了数据源之后还是会出现默认数据源的情况
+         */
+        SqlSessionFactory sqlSessionFactory = (SqlSessionFactory)SpringContextUtils.getBean(SqlSessionFactory.class);
+        Configuration configuration = sqlSessionFactory.getConfiguration();
+        /*
+         * !!!重要,设置databaseId,用于在mapper.xml中找到对应的_databaseId,
+         * 此处不设置databaseId,即使数据源切换了,但是在mapper.xml中还是对应不上
+         */
+        configuration.setDatabaseId(dbtype);
+        Environment environment = configuration.getEnvironment();
+        Field dataSourceField = environment.getClass().getDeclaredField("dataSource");
+        //跳过检验
+        dataSourceField.setAccessible(true);
+        //修改mybatis的数据源
+        dataSourceField.set(environment, dataSource);
+        //修改完成后所有线程使用此数据源
+        return true;
+    }
+
+    // 测试数据源连接的方法
+    public void testConnection(String driveClass, String url, String username, String password) {
+        try {
+            Class.forName(driveClass);
+            DriverManager.getConnection(url, username, password);
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException();
+        }
+    }
+
+}

+ 34 - 0
src/main/java/com/customer/config/GenConfig.java

@@ -0,0 +1,34 @@
+package com.customer.config;
+
+import lombok.Data;
+
+@Data
+public class GenConfig {
+
+    /**
+     * driver-class
+     */
+    public String driverClassName;
+
+    /**
+     * 数据库url
+     */
+    public String url;
+
+    /**
+     * 数据库用户名
+     */
+    public String username;
+
+    /**
+     * 数据库密码
+     */
+    public String password;
+    /**
+     * 数据库类型:mysql、oracle、dm、kingbasees、h2、sqlserver、postgresql等
+     */
+    public String dbtype;
+
+
+
+}

+ 40 - 0
src/main/java/com/customer/config/SpringContextUtils.java

@@ -0,0 +1,40 @@
+package com.customer.config;
+
+import org.springframework.beans.BeansException;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.stereotype.Component;
+
+/*
+ * 获取spring容器中bean工具类
+ */
+//这个注解的目的是为了把的SpringContextUtils的实例化交给Spring容器管理
+@Component("springContextUtils")
+@Configuration
+public class SpringContextUtils implements ApplicationContextAware {
+
+    private static ApplicationContext applicationContext = null;
+
+    public static ApplicationContext getApplicationContext() {
+        return applicationContext;
+    }
+
+    @SuppressWarnings("unchecked")
+    public static <T> T getBean(String beanId) {
+        return (T) applicationContext.getBean(beanId);
+    }
+
+    public static <T> T getBean(Class<T> requiredType) {
+        return (T) applicationContext.getBean(requiredType);
+    }
+
+    /*
+     * Spring容器启动后,会把 applicationContext 给自动注入进来,然后我们把 applicationContext 赋值到静态变量中,方便后续拿到容器对象
+     * @see org.springframework.context.ApplicationContextAware#setApplicationContext(org.springframework.context.ApplicationContext)
+     */
+    @Override
+    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
+        SpringContextUtils.applicationContext = applicationContext;
+    }
+}

+ 93 - 0
src/main/java/com/customer/controller/CustomerController.java

@@ -0,0 +1,93 @@
+package com.customer.controller;
+
+
+import com.customer.config.DynamicDataSource;
+import com.customer.config.GenConfig;
+import com.customer.pojo.Customer;
+import com.customer.service.ICustomerService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * <p>
+ * 客户表 前端控制器
+ * </p>
+ *
+ * @author xue
+ * @since 2023-06-05
+ */
+@RestController
+@RequestMapping("/customer")
+public class CustomerController {
+
+    @Resource
+    private ICustomerService customerService;
+
+    @Autowired
+    private DynamicDataSource dynamicDataSource;
+
+    @GetMapping("/list")
+    public List<Customer> list(@RequestParam("databaseType") String databaseType) throws Exception {
+        if(databaseType.equals("mysql")){
+            GenConfig genConfig = new GenConfig();
+            genConfig.setDbtype("mysql");
+            genConfig.setDriverClassName("com.mysql.cj.jdbc.Driver");
+            genConfig.setUrl("jdbc:mysql://localhost:3306/test1");
+            genConfig.setUsername("root");
+            genConfig.setPassword("root");
+            //切换数据源之前先清空
+            DynamicDataSource.clearDataSource();
+            //切换数据源
+            dynamicDataSource.changeDataSource(genConfig);
+            System.err.println("当前数据源:" + dynamicDataSource.getConnection());
+        }else if(databaseType.equals("sqlServer")){
+            GenConfig genConfig = new GenConfig();
+            genConfig.setDbtype("sqlserver");
+            genConfig.setDriverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
+            genConfig.setUrl("jdbc:sqlserver://localhost:1433;DatabaseName=test");
+            genConfig.setUsername("sa");
+            genConfig.setPassword("root1234");
+            //切换数据源之前先清空
+            DynamicDataSource.clearDataSource();
+            //切换数据源
+            dynamicDataSource.changeDataSource(genConfig);
+            System.err.println("当前数据源:" + dynamicDataSource.getConnection());
+        }else if(databaseType.equals("oracle")){
+            GenConfig genConfig = new GenConfig();
+            genConfig.setDbtype("oracle");
+            genConfig.setDriverClassName("oracle.jdbc.driver.OracleDriver");
+            genConfig.setUrl("jdbc:oracle:thin:@localhost:1521:orcl");
+            genConfig.setUsername("scott");
+            genConfig.setPassword("123456");
+            //切换数据源之前先清空
+            DynamicDataSource.clearDataSource();
+            //切换数据源
+            dynamicDataSource.changeDataSource(genConfig);
+            System.err.println("当前数据源:" + dynamicDataSource.getConnection());
+        }else if(databaseType.equals("dm")){
+            GenConfig genConfig = new GenConfig();
+            genConfig.setDbtype("dm");
+            genConfig.setDriverClassName("dm.jdbc.driver.DmDriver");
+            genConfig.setUrl("jdbc:dm://localhost:5236?schema=test1");
+            genConfig.setUsername("SYSDBA");
+            genConfig.setPassword("sysdba1234");
+            //切换数据源之前先清空
+            DynamicDataSource.clearDataSource();
+            //切换数据源
+            dynamicDataSource.changeDataSource(genConfig);
+            System.err.println("当前数据源:" + dynamicDataSource.getConnection());
+        }
+        return customerService.list();
+
+
+    }
+
+    @GetMapping("/test")
+    public List<Customer> test(){
+        return customerService.list();
+    }
+
+}

+ 22 - 0
src/main/java/com/customer/controller/TestController.java

@@ -0,0 +1,22 @@
+package com.customer.controller;
+
+
+import com.customer.pojo.TestA;
+import com.customer.service.ITestService;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+public class TestController {
+
+    @Resource
+    private ITestService testService;
+
+    @PostMapping("/createDatabase")
+    public void crateDatabase(@RequestBody Map<String, Object> map){
+         testService.createDataBase(map);
+    }
+}

+ 17 - 0
src/main/java/com/customer/mapper/CustomerMapper.java

@@ -0,0 +1,17 @@
+package com.customer.mapper;
+
+import com.customer.pojo.Customer;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 客户表 Mapper 接口
+ * </p>
+ *
+ * @author xue
+ * @since 2023-06-05
+ */
+public interface CustomerMapper extends BaseMapper<Customer> {
+
+}

+ 19 - 0
src/main/java/com/customer/mapper/TestMapper.java

@@ -0,0 +1,19 @@
+package com.customer.mapper;
+
+
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface TestMapper {
+
+    /**
+     * 创建数据库
+     * @param dataBaseName
+     */
+    void createDataBase(String dataBaseName);
+
+    void useDataBase(String dataBaseName);
+
+    void createTable(@Param("tableName") String tableName,@Param("filedList") List<String> filedList);
+}

+ 47 - 0
src/main/java/com/customer/pojo/Customer.java

@@ -0,0 +1,47 @@
+package com.customer.pojo;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 客户表
+ * </p>
+ *
+ * @author xue
+ * @since 2023-06-05
+ */
+@Data
+@Accessors(chain = true)
+@TableName("customer")
+public class Customer implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 客户编号
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 客户名称
+     */
+    private String name;
+
+    /**
+     * 地址
+     */
+    private String address;
+
+    /**
+     * 电话
+     */
+    private String phone;
+
+
+}

+ 24 - 0
src/main/java/com/customer/pojo/TestA.java

@@ -0,0 +1,24 @@
+package com.customer.pojo;
+
+import lombok.Data;
+
+@Data
+public class TestA {
+
+    /** 字段名称 */
+    private String fieldName;
+
+    /** 字段类型 */
+    private String fieldType;
+
+    /** 是否为空 */
+    private Boolean isNull;
+
+    /** 是否为主键 */
+    private Boolean isPrimary;
+
+    /** 字段描述 */
+    private String filedDescription;
+
+
+}

+ 24 - 0
src/main/java/com/customer/service/ICustomerService.java

@@ -0,0 +1,24 @@
+package com.customer.service;
+
+import com.customer.pojo.Customer;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 客户表 服务类
+ * </p>
+ *
+ * @author xue
+ * @since 2023-06-05
+ */
+public interface ICustomerService extends IService<Customer> {
+
+//    List<Customer> mysqlList();
+//
+//    List<Customer> sqlServerList();
+//
+//    List<Customer> oracleList();
+
+}

+ 9 - 0
src/main/java/com/customer/service/ITestService.java

@@ -0,0 +1,9 @@
+package com.customer.service;
+
+import java.util.List;
+import java.util.Map;
+
+public interface ITestService {
+
+    void createDataBase(Map<String,Object> map);
+}

+ 45 - 0
src/main/java/com/customer/service/impl/CustomerServiceImpl.java

@@ -0,0 +1,45 @@
+package com.customer.service.impl;
+
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.customer.pojo.Customer;
+import com.customer.mapper.CustomerMapper;
+import com.customer.service.ICustomerService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * <p>
+ * 客户表 服务实现类
+ * </p>
+ *
+ * @author xue
+ * @since 2023-06-05
+ */
+@Service
+public class CustomerServiceImpl extends ServiceImpl<CustomerMapper, Customer> implements ICustomerService {
+
+//    @Resource
+//    private CustomerMapper customerMapper;
+//
+//    @Override
+//    @DS("master")
+//    public List<Customer> mysqlList() {
+//        return customerMapper.selectList(new LambdaQueryWrapper<>());
+//    }
+//
+//    @Override
+//    @DS("slave_1")
+//    public List<Customer> sqlServerList() {
+//        return customerMapper.selectList(new LambdaQueryWrapper<>());
+//    }
+//
+//    @Override
+//    @DS("slave_2")
+//    public List<Customer> oracleList() {
+//        return customerMapper.selectList(new LambdaQueryWrapper<>());
+//    }
+}

+ 48 - 0
src/main/java/com/customer/service/impl/TestServiceImpl.java

@@ -0,0 +1,48 @@
+package com.customer.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.customer.mapper.TestMapper;
+import com.customer.pojo.TestA;
+import com.customer.service.ITestService;
+import org.springframework.stereotype.Service;
+import com.customer.service.ITestService;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Service
+public class TestServiceImpl implements ITestService {
+
+    @Resource
+    private TestMapper testMapper;
+
+    @Override
+    @Transactional
+    public void createDataBase(Map<String,Object> map) {
+        String dataBaseName = (String) map.get("dataBaseName");
+        testMapper.createDataBase(dataBaseName);
+        testMapper.useDataBase(dataBaseName);
+        String tableName = (String) map.get("tableName");
+        List<TestA> filedList = JSON.parseArray(JSON.toJSONString(map.get("filed")), TestA.class);
+
+        List<String> list= filedList.stream().map(filed->{
+            StringBuilder stringBuilder = new StringBuilder();
+            stringBuilder.append(filed.getFieldName()+" ")
+                    .append(filed.getFieldType()+" ");
+            if(filed.getIsNull()){
+                stringBuilder.append("NOT NULL ");
+            }
+            if(filed.getIsPrimary()){
+                stringBuilder.append("PRIMARY KEY ");
+            }
+            stringBuilder.append("COMMENT '"+filed.getFiledDescription()+"'");
+            return stringBuilder.toString();
+        }).collect(Collectors.toList());
+        testMapper.createTable(tableName,list);
+    }
+}

+ 18 - 0
src/main/resources/application.yml

@@ -0,0 +1,18 @@
+server:
+  port: 8081
+spring:
+  application:
+    name: permission
+  datasource:
+    dbtype: mysql
+    driver-class-name: com.mysql.jdbc.Driver
+    url: jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
+    username: root
+    password: root
+logging:
+  level:
+    com.hdax.mapper : debug
+mybatis-plus:
+  mapper-locations: classpath:mapper/*.xml
+  configuration:
+    cache-enabled: true

+ 35 - 0
src/main/resources/bootstrap.properties

@@ -0,0 +1,35 @@
+
+
+
+#################################  多数据源配置  #########################################
+#参考:https://www.cnblogs.com/viwofer/p/13149863.html (Oracle数据源的配置使用默认的即可)
+#如果同时配置了MySQL和SqlServer的数据源,并同时启动MySQL和SqlServer的数据源配置,注意是两个数据源的都同时启动,可能会出现如下错误并给出提示信息:
+#错误:Field transactionManager in dump.pspaceTodb.base.aspect.TransactionAdviceConfig required a single bean, but 2 were found:
+#提示信息:Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed
+
+#问题的原因:MySQL和SqlServer数据库的配置类没有分主次,所以导致启动失败;
+#解决方法:在MySQL或SqlServer配置类的每个方法上都加上@Primary,注意只能在其中一个数据源上添加@Primary注解,在加了@Primary注解的配置类上,
+# 执行的sql也会优先使用加了@Primary注解的配置类,所以数据只会优先出现在有@Primary注解对应的数据库中;
+
+#MySQL数据库连接配置
+spring.datasource.mysql.type=com.alibaba.druid.pool.DruidDataSource
+spring.datasource.mysql.driver-class-name=com.mysql.cj.jdbc.Driver
+#注意是jdbc-url不是url,否则报jdbcUrl is required with driverClassName错误
+spring.datasource.mysql.jdbc-url=jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=utf8&useSSL=false&useTimezone=true&serverTimezone=GMT%2B8
+spring.datasource.mysql.username=root
+spring.datasource.mysql.password=root
+
+#SqlServer数据库连接配置
+spring.datasource.mssql.type=com.alibaba.druid.pool.DruidDataSource
+spring.datasource.mssql.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver
+#注意是jdbc-url不是url,否则报jdbcUrl is required with driverClassName错误
+spring.datasource.mssql.jdbc-url=jdbc:sqlserver://localhost:1433;databasename=test
+spring.datasource.mssql.username=sa
+spring.datasource.mssql.password=root1234
+
+#Oracle数据库连接配置
+#spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
+#spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
+#spring.datasource.url=jdbc:oracle:thin:@192.168.18.200:1521:orcl
+#spring.datasource.username=root
+#spring.datasource.password=admin123

BIN
src/main/resources/lib/DmJdbcDriver18.jar


+ 5 - 0
src/main/resources/mapper/CustomerMapper.xml

@@ -0,0 +1,5 @@
+<?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.customer.mapper.CustomerMapper">
+
+</mapper>

+ 21 - 0
src/main/resources/mapper/TestMapper.xml

@@ -0,0 +1,21 @@
+<?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.customer.mapper.TestMapper">
+
+    <update id="createDataBase" parameterType="string">
+        CREATE database IF NOT EXISTS `${dataBaseName}`
+    </update>
+
+    <update id="useDataBase">
+        use `${dataBaseName}`
+    </update>
+
+    <update id="createTable">
+        CREATE TABLE IF NOT EXISTS `${tableName}`
+        (
+            <foreach collection="filedList" item="filed" separator=",">
+                ${filed}
+            </foreach>
+            )
+    </update>
+</mapper>