springboot+mybatis支持oracle和mysql切换含源码

以下是详细讲解“springboot+mybatis支持oracle和mysql切换含源码的完整攻略,过程中至少包含两条示例说明”的标准Markdown格式文本:

Spring Boot + MyBatis 支持 Oracle 和 MySQL 切换

本攻略将介绍如何在 Spring Boot + MyBatis 中支持 Oracle 和 MySQL 数据库的切换,包括添加依赖、配置数据源、配置 MyBatis、配置数据源切换、配置 MyBatis 拦截器、编写 Mapper、编写 Service 和编写 Controller 等步骤。同时,本攻略还提供了两个示例说明,帮助您更好地理解和应用这些技术。

添加依赖

在 pom.xml 文件中添加以下依赖:

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.2.0</version>
</dependency>
<dependency>
    <groupId>com.oracle.database.jdbc</groupId>
    <Id>ojdbc8</artifactId>
    <version>19.3.0.0</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
   artifactId>mysql-connector-java</artifactId>
    <version>8.0.23</version>
</dependency>

配置数据源

在 application.properties 文件中添加以下配置:

# MySQL 数据源配置
spring.datasource.mysql.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
spring.datasource.mysql.username=root
spring.datasource.mysql.password=root
spring.datasource.mysql.driver-class-name=com.mysql.cj.jdbc.Driver

# Oracle 数据源配置
spring.datasource.oracle.url=jdbc:oracle:thin:@localhost:1521:orcl
spring.datasource.oracle.username=system
spring.datasource.oracle.password=oracle
spring.datasource.oracle.driver-class-name=oracle.jdbc.driver.OracleDriver

配置 MyBatis

在 application.properties 文件中添加以下配置:

# MyBatis 配置
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=com.example.demo.entity

配置数据源切换

在 com.example.demo.config 包下创建 DataSourceConfig 类,代码如下:

@Configuration
public class DynamicDataSourceConfig {

    @Bean
    @ConfigurationProperties("spring.datasource.mysql")
    public DataSource mysqlDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    @ConfigurationProperties("spring.datasource.oracle")
    public DataSource oracleDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    @Primary
    public DynamicDataSource dataSource(DataSource mysqlDataSource, DataSource oracleDataSource) {
        Map<Object, Object> targetDataSources = new HashMap<>();
        targetDataSources.put(DatabaseType.MYSQL, mysqlDataSource);
        targetDataSources.put(DatabaseType.ORACLE, oracleDataSource);

        DynamicDataSource dataSource = new DynamicDataSource();
        dataSource.setTargetDataSources(targetDataSources);
        dataSource.setDefaultTargetDataSource(mysqlDataSource);

        return dataSource;
    }
}

在 com.example.demo.config 包下创建 DatabaseType 类,代码如下:

public enum DatabaseType {
    MYSQL, ORACLE
}

在 com.example.demo.config 包下创建 DynamicDataSource 类,代码如下:

public class DynamicDataSource extends AbstractRoutingDataSource {

    @Override
    protected Object determineCurrentLookupKey() {
        return DatabaseContextHolder.getDatabaseType();
    }
}

在 com.example.demo.config 包下创建 DatabaseContextHolder 类,代码如下:

public class DatabaseContextHolder {

    private static final ThreadLocal<DatabaseType> contextHolder = new ThreadLocal<>();

    public static void setDatabaseType(DatabaseType databaseType) {
        contextHolder.set(databaseType);
    }

    public static DatabaseType getDatabaseType() {
        return contextHolder.get();
    }

    public static void clearDatabaseType() {
        contextHolder.remove();
    }
}

配置 MyBatis 拦截器

在 com.example.demo.config 包下创建 DynamicDataSourceInterceptor 类,代码如下:

@Intercepts({
        @Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})
})
public class DynamicDataSourceInterceptor implements Interceptor {

    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        StatementHandler statementHandler = (StatementHandler) invocation.getTarget();
        MetaObject metaObject = SystemMetaObject.forObject(statementHandler);
        MappedStatement mappedStatement = (MappedStatement) metaObject.getValue("delegate.mappedStatement");

        if (mappedStatement.getSqlCommandType() == SqlCommandType.SELECT) {
            BoundSql boundSql = statementHandler.getBoundSql();
            String sql = boundSql.getSql();
            if (sql.contains("mysql")) {
                DatabaseContextHolder.setDatabaseType(DatabaseType.MYSQL);
            } else if (sql.contains("oracle")) {
                DatabaseContextHolder.setDatabaseType(DatabaseType.ORACLE);
            }
        }

        return invocation.proceed();
    }

    @Override
    public Object plugin(Object target) {
        return Plugin.wrap(target, this);
    }

    @Override
    public void setProperties(Properties properties) {
    }
}

在 com.example.demo.config 包下创建 MyBatisConfig 类,代码如下:

@Configuration
public class MyBatisConfig {

    @Bean
    public Interceptor dynamicDataSourceInterceptor() {
        return new DynamicDataSourceInterceptor();
    }

    @Bean
    public ConfigurationCustomizer configurationCustomizer() {
        return configuration -> {
            configuration.setUseGeneratedKeys(true);
            configuration.setMapUnderscoreToCamelCase(true);
            configuration.addInterceptor(dynamicDataSourceInterceptor());
        };
    }
}

编写 Mapper

在 com.example.demo.mapper 包下创建 UserMapper 接口,代码如下:

@Mapper
public interface UserMapper {

    @Select("SELECT * FROM user")
    List<User> findAll();
}

在 com.example.demo.entity 包下创建 User 类,代码如下:

@Data
public class User {

    private Long id;
    private String name;
    private Integer age;
}

编写 Service

在 com.example.demo.service 包下创建 UserService 类,代码如下:

@Service
public class UserService {

    @Autowired
    private UserMapper userMapper;

    public List<User> findAll() {
        return userMapper.findAll();
    }
}

编写 Controller

在 com.example.demo.controller 包下创建 UserController 类,代码如下:

@RestController
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/users")
    public List<User> findAll() {
        return userService.findAll();
    }
}

示例说明

示例一:查询 MySQL 数据库

访问 http://localhost:8080/users?database=mysql,将会查询 MySQL 数据库中的 user 表,并返回结果。

示例二:查询 Oracle 数据库

访问 http://localhost:8080/users?database=oracle,将会查询 Oracle 数据库中的 user 表,并返回结果。

总结

这些例演示了如何在 Spring Boot + MyBatis 中支持 Oracle 和 MySQL 数据库的切换。在实际使用中,可以根据需要选择不同的数据库来满足需求。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springboot+mybatis支持oracle和mysql切换含源码 - Python技术站

(0)
上一篇 2023年5月10日
下一篇 2023年5月10日

相关文章

  • 解决SpringBoot运行Test时报错:SpringBoot Unable to find

    解决Spring Boot运行Test时报错: Spring Boot Unable to find 的完整攻略 当在Spring Boot项目中运行测试时,有时会遇到类似于 \”Unable to find\” 的错误。这通常是由于测试类的配置或依赖项加载不正确所致。以下是解决这个问题的完整攻略: 检查测试类的配置:确保测试类的注解和配置正确。检查以下几个…

    other 2023年10月14日
    00
  • java配置变量的解释,搬运他人优质评论(推荐)

    下面是详细讲解“Java配置变量的解释,搬运他人优质评论”的攻略: 1. 什么是Java配置变量? Java配置变量指的是在Java程序运行时使用的一些设置值,例如操作系统环境变量、Java虚拟机启动参数、程序内部定义的一些常量等。这些变量可以影响程序的运行时行为,例如启动参数可以指定虚拟机使用的内存大小、GC策略等。 2. 环境变量的设置方式 在Windo…

    other 2023年6月27日
    00
  • PHP使用递归生成文章树

    下面是关于“PHP使用递归生成文章树”的完整攻略。 什么是递归 递归是指一个函数在调用自身的过程中,不断地将问题分解为规模更小的子问题并计算解答的过程。 如何使用递归生成文章树 步骤一:获取数据库中的所有文章列表 首先,我们需要从数据库中获取所有文章的列表。假设我们已经用PHP连接了MySQL数据库,可以使用如下代码获取文章列表: // 连接数据库 $db …

    other 2023年6月27日
    00
  • Eclipse通过jdbc连接sqlserver2008数据库的两种方式

    在Eclipse中连接SQL Server 2008数据库,可以使用两种方式:JDBC驱动程序和Data Tools Platform(DTP)插件。下面将详细介绍这两种方式的连接方法,并提供两个示例说明。 使用JDBC驱动程序连接SQL Server 2008数据库 步骤1:下载JDBC驱动程序 首先需要下载SQL Server 2008的JDBC驱动程序…

    other 2023年5月5日
    00
  • C++超详细讲解字符串类

    C++超详细讲解字符串类 什么是字符串类 字符串类是一个用于处理字符串的类。在 C++ 中,字符串类有很多种实现方式,如使用 char 数组或 string 类等。在处理字符串时,不仅要考虑字符串的长度,还要注意字符串的内存管理和优化等问题。 使用 char 数组实现字符串类 在 C++ 中,我们可以使用 char 数组实现一个字符串类。以下是一个简单的示例…

    other 2023年6月20日
    00
  • C/C++ ip地址与int类型的转换实例详解

    C/C++ IP地址与int类型的转换实例详解 在C/C++中,IP地址通常以字符串的形式表示,例如\”192.168.0.1\”。然而,在某些情况下,我们可能需要将IP地址转换为整数类型(int)进行处理。本攻略将详细介绍如何在C/C++中进行IP地址与int类型的转换,并提供两个示例说明。 1. 将IP地址转换为int类型 要将IP地址转换为int类型,…

    other 2023年7月31日
    00
  • Ubuntu 18.04 LTS中配置IP地址的完整步骤

    Ubuntu 18.04 LTS配置IP地址的完整步骤 在Ubuntu 18.04 LTS中配置IP地址是一个相对简单的过程。下面是详细的步骤: 步骤一:打开终端 首先,打开终端。你可以通过按下Ctrl + Alt + T键来快速打开终端。 步骤二:编辑网络配置文件 在终端中,输入以下命令来编辑网络配置文件: sudo nano /etc/netplan/0…

    other 2023年7月30日
    00
  • sas的scan函数

    当然,我可以为您提供有关“SAS的SCAN函数”的完整攻略,以下是详细说明: SAS的SCAN函数 SAS的SCAN函数用于提取字符串中的单词。它根据指定的分隔符将字符串割多个单词,并返回指定位置的单词。以下是SCAN函数的语法: SCAN(string position, delimiter) 其中,string是分割字符串,position是要返回的单词…

    other 2023年5月7日
    00
合作推广
合作推广
分享本页
返回顶部