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

yizhihongxing

以下是详细讲解“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日

相关文章

  • Python基础语法之变量与数据类型详解

    下面是对“Python基础语法之变量与数据类型详解”这一话题的完整攻略。 一、变量 1.什么是变量? 变量是程序中最基本的存储单元。它是一个指向存储在计算机内部的值的名称,且该值可以在程序执行中改变。在Python中,我们不需要声明一个变量,而是在赋值时创建变量,可以根据需要给变量赋不同的值。 2.变量的命名规则和规范 在Python中,变量名只能包含字母、…

    other 2023年6月27日
    00
  • VSCode报错:Vetur can’t find ‘tsconfig.json’ or ‘jsconfig.json’解决办法

    当使用VSCode进行Vue项目开发时,可能会出现“Vetur can’t find ‘tsconfig.json’ or ‘jsconfig.json’”的报错,这是因为Vetur插件需要找到项目的配置文件来进行正确的语法检查和代码提示。下面是解决这个问题的完整攻略。 1. 确认项目中是否存在配置文件 首先,需要确认在项目根目录下是否存在配置文件 tsco…

    other 2023年6月27日
    00
  • java获取两个日期之间的所有日期(年月日)

    当然,我很乐意为您提供有关“Java获取两个日期之间的所有日期(年月日)”的完整攻略。以下是详细的步骤和两个示例: 1 获取两个日期之间的所有日期 要获取两个日期之间的所有日期,可以使用Java中的Calendar类和SimpleDateFormat类。以下是获取两个日期之间的所有日期的步骤: 创建两个日期对象,表示要获取的日期范围。 使用Calendar类…

    other 2023年5月6日
    00
  • MySQL中使用正则表达式详情

    MySQL中使用正则表达式攻略 MySQL提供了正则表达式的支持,可以在查询中使用正则表达式进行模式匹配。下面是使用正则表达式的详细攻略。 正则表达式函数 MySQL提供了以下几个函数用于正则表达式匹配: REGEXP:用于在查询中进行正则表达式匹配。 REGEXP_INSTR:返回匹配正则表达式的字符串的起始位置。 REGEXP_REPLACE:用于替换匹…

    other 2023年8月19日
    00
  • Linux如何扩展XFS文件系统以完全使用额外空间

    扩展XFS文件系统以完全使用额外空间的攻略需要以下步骤: 1.确认分区大小和使用情况 在使用XFS文件系统扩展前,需要确认磁盘分区的大小和使用情况。可以使用以下命令查看磁盘分区的大小和使用情况: df -h 2.增加磁盘分区 如果磁盘分区的空间不够用,需要增加磁盘分区的大小。可以使用fdisk命令来增加磁盘分区。以下是示例: sudo fdisk /dev/…

    other 2023年6月27日
    00
  • ASP.NET、SharePoint中另存文件的长文件名被截断的原因及解决办法

    ASP.NET和SharePoint都是常用的Web开发框架和应用程序平台。在使用这些平台开发应用程序时,可能会出现另存文件的长文件名被截断的问题。这种情况通常是由于Windows操作系统对文件名长度的限制导致的。下面我们将详细介绍这种情况的原因以及解决办法。 问题描述 在ASP.NET或SharePoint应用程序中,如果用户尝试另存一个长文件名的文件,文…

    other 2023年6月26日
    00
  • Android 中 Fragment的使用大全

    当使用Android开发时,Fragment是一种重要的组件,用于构建灵活且可重用的用户界面。下面是一个详细的攻略,介绍了Android中Fragment的使用。 1. 创建Fragment 要创建一个Fragment,您需要创建一个继承自Fragment类的新类。以下是一个示例: public class MyFragment extends Fragme…

    other 2023年10月12日
    00
  • 基于iScroll实现内容滚动效果

    下面是“基于iScroll实现内容滚动效果”的完整攻略: 简介 iScroll是一个高性能的,跨平台的 JavaScript 插件,能够实现 DOM 元素在移动端的各种滚动效果,包括纵向的、横向的滚动效果、卡片式滚动等多种滚动方式。通过 iScroll 可以帮助我们快速构建出移动端的轻量级滚动组件。 安装 我们可以通过npm安装iScroll,也可以直接引入…

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