MyBatis-Plus 不能也不建議同時去“控制” Hive。它從設計到實現都假定底層是 支持事務、支持標準 SQL 方言 的 關系型數據庫(MySQL、PostgreSQL、Oracle、SQL Server 等),而 Hive 兩者都不完全符合。如果操作兩個數據源都是mysql或者和關系數據庫的組合就可以了。以下主要介紹操作mysql和hive的方案。
1.引入依賴
//mysql的數據源
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId>
</dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope>
</dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.7</version></dependency>//hive的依賴,我們這里用的星環的指定的本地的lib,其他可以直接根據公司的實際版本等情況去配置即可
2.添加配置yml
spring:datasource:mysql:url: jdbc:mysql://4555555:5555/sxxxx?serverTimezone=GMT%2B8&characterEncoding=utf-8&useSSL=falseusername: rootpassword: rorotdriver-class-name: com.mysql.cj.jdbc.Drivertype: com.zaxxer.hikari.HikariDataSource # 顯式指定hikari:# 最大連接數maximum-pool-size: 10# 最小空閑連接數minimum-idle: 5# 連接獲取超時時間(30秒)connection-timeout: 30000# 空閑超時時間(10分鐘)idle-timeout: 600000# 最大連接壽命(30分鐘)max-lifetime: 1800000pool-name: mysql-pool # 連接池名稱(便于監控)hive:url: jdbc:hive2://your-hive-server:10000/defaultusername: hivepassword: hivedriver-class-name: org.apache.hive.jdbc.HiveDrivertype: com.zaxxer.hikari.HikariDataSource # 顯式指定hikari:# Hive連接數通常較少(查詢較慢)maximum-pool-size: 5# 最小空閑連接數minimum-idle: 2# Hive查詢可能較慢,適當延長超時connection-timeout: 60000# 空閑連接超時(5分鐘)idle-timeout: 300000# 最大連接壽命(30分鐘)max-lifetime: 1800000pool-name: hive-pool
3.添加配置類DataSourceConfig和MyBatisPlusConfig
先添加DataSourceConfig,主要是告知spring我們有兩個數據源,分別叫什么名稱(bean),并且我們的hive交給我們的jdbctemplate去管理。在添加MyBatisPlusConfig,主要是把mysql交給mybatisplus去控制
package com.sjztdz.selectprovincetrace.selecttrace.config;import com.zaxxer.hikari.HikariDataSource;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;import javax.sql.DataSource;@Configuration
public class DataSourceConfig {// MySQL數據源配置@Bean("mysqlDataSource")@ConfigurationProperties(prefix="spring.datasource.mysql")public DataSource mysqlDataSource() {return DataSourceBuilder.create().type(HikariDataSource.class).build();}// Hive數據源配置@Bean("hiveDataSource")@ConfigurationProperties(prefix="spring.datasource.hive")public DataSource hiveDataSource() {return DataSourceBuilder.create().type(HikariDataSource.class).build();}// Hive配置jdbctemplate hive一般不需要事務@Bean("hiveJdbcTemplate")public JdbcTemplate hiveJdbcTemplate(@Qualifier("hiveDataSource") DataSource dataSource) {return new JdbcTemplate(dataSource);}}
package com.sjztdz.selectprovincetrace.selecttrace.config;import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
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 org.springframework.transaction.PlatformTransactionManager;import javax.sql.DataSource;/*** MySQL 專屬配置類* 1. 只掃 MySQL 的 Mapper 接口(@MapperScan)* 2. 給 MySQL 單獨建一個 SqlSessionFactory 和事務管理器* 3. 加載 MyBatis-Plus 分頁插件*/
@Configuration
@MapperScan(basePackages = "com.xxxxx.selecttrace.mapper", sqlSessionFactoryRef = "mysqlSqlSessionFactory")
public class MyBatisPlusConfig {@Bean("mysqlSqlSessionFactory")public SqlSessionFactory mysqlSqlSessionFactory(@Qualifier("mysqlDataSource") DataSource dataSource) throws Exception {//用 MyBatis-Plus 自己的工廠bean,才能識別 MP 的注解和擴展MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();//告訴工廠用那個數據源--mysqlsessionFactory.setDataSource(dataSource);//告訴工廠去哪里找 XML 映射文件sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/**.xml"));// 分頁插件MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));sessionFactory.setPlugins(interceptor);return sessionFactory.getObject();}/*** 給 MySQL 再配一個獨立的事務管理器* 以后在 Service 層想只控制 MySQL 事務時,寫:* @Transactional("mysqlTransactionManager")* 就不會誤傷到 Hive 或其它數據源*/@Bean("mysqlTransactionManager")public PlatformTransactionManager mysqlTransactionManager(@Qualifier("mysqlDataSource") DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}
}
注意@Qualifie的使用就針對多數個類去實現同一個接口時候,防止我們找錯!
4.使用
mysql-mybatis的使用
@Service
public class MysqlUserService {@Autowiredprivate UserMapper userMapper; // MyBatis-Plus Mapperpublic List<User> getUsers() {return userMapper.selectList(Wrappers.emptyWrapper());}public void addUser(User user) {userMapper.insert(user);}
}
hive-jdbcTemplate的使用
@Service
public class HiveQueryService {@Autowiredprivate JdbcTemplate hiveJdbcTemplate;public List<Map<String, Object>> queryHiveData(String sql) {return hiveJdbcTemplate.queryForList(sql);}public void executeHiveDDL(String ddl) {hiveJdbcTemplate.execute(ddl);}
}