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