因为业务需求,需要在一个项目中同时使用myslq和mongodb数据库,在网上找了好久都没有,只有相同数据库的双数据源,当时就想如果按照相同数据库的双数据源配置分别配置myslq和mongodb。
一、先看一下pom文件
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb-reactive</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web-services</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.28</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
二、接下来是配置文件,我的是properties文件,.yml也是一样的
spring.datasource.first.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.first.url=jdbc:mysql://localhost:3306/storage_data?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8&useSSL=false
spring.datasource.first.username=root
spring.datasource.first.password=root
spring.datasource.first.type=com.alibaba.druid.pool.DruidDataSource
mybatis.mapper-locations =classpath*:/com/mysqlandmongodb/mapper/*.xml
spring.data.mongodb.secondary.database=violation
spring.data.mongodb.secondary.hostPort=localhost:27017
spring.data.mongodb.secondary.password=
spring.data.mongodb.secondary.username=
#去除mongodb自动配置
#spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration
三、我们先配置mysql数据库(这里的代码比较重要)
1.创建文件封装类
package com.mysqlandmongodb.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* Created by admin on 2019/11/7.
*/
@Data
@Component
@ConfigurationProperties(prefix = "spring.datasource.first")
public class FirstDataProperties {
String driverClassName;
String url;
String username;
String password;
}
2.创建myslq数据源工厂
@MapperScan(basePackages = “com.data.mapper.first”,sqlSessionTemplateRef = “firstSqlSessionTemplate”)此注解basePackages地址是自己对应数据源mapper地址,sqlSessionTemplateRef是我们创建工厂的名字,是自己起的,在代码最下面,如果没有特殊需要和我一样就可以
package com.mysqlandmongodb.config;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
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.context.annotation.Primary;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
/**
* Created by admin on 2019/11/8.
*/
@Configuration
@MapperScan(basePackages = "com.data.mapper.first",sqlSessionTemplateRef = "firstSqlSessionTemplate")
public class FirstDataSourceConfig {
@Autowired
private FirstDataProperties firstprop;
//创建数据源
@Bean(name="firstDataSource")
@ConfigurationProperties(prefix = "spring.datasource.first")
@Primary
public DataSource getFirstDataSource(){
DataSource build = DataSourceBuilder.create()
.driverClassName(firstprop.driverClassName)
.url(firstprop.url)
.username(firstprop.username)
.password(firstprop.password).build();
return build;
}
//创建SqlSessionFactory
@Bean(name = "firstSqlSessionFactory")
@Primary
public SqlSessionFactory firstSqlSessionFactory(@Qualifier("firstDataSource") DataSource dataSource) throws Exception{
SqlSessionFactoryBean bean=new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
return bean.getObject();
}
//创建事务管理器
@Bean(name = "firstTransactionManager")
@Primary
public DataSourceTransactionManager firstTransactionManager(@Qualifier("firstDataSource") DataSource dataSource){
return new DataSourceTransactionManager(dataSource);
}
//创建SqlSessionTemplate
@Bean(name = "firstSqlSessionTemplate")
@Primary
public SqlSessionTemplate firstSqlSessionTemplate(@Qualifier("firstSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception{
return new SqlSessionTemplate(sqlSessionFactory);
}
private Class getType(String type){
try {
return Class.forName(type);
}catch (ClassNotFoundException e){
e.printStackTrace();
}
return null;
}
}
到此我们的mysql数据源就配置好了,下面就可以用了 我这里将mysql当场主数据源了
四、接下来配置mongodb数据源
1.根据配置文件创建mongodbFactory,重新建立一个工厂
package com.mysqlandmongodb.config;
import com.mongodb.MongoClient;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import org.springframework.data.mongodb.MongoDbFactory;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.SimpleMongoDbFactory;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.List;
/**
* Created by admin on 2019/11/8.
*/
public abstract class AbstractMongoConfig {
// Mongo DB Properties
private String hostPort, database, username, password;
// private String port;
// Setter methods go here..
public String getHostPort() {
return hostPort;
}
public void setHostPort(String hostPort) {
this.hostPort = hostPort;
}
public String getDatabase() {
return database;
}
public void setDatabase(String database) {
this.database = database;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public MongoDbFactory mongoDbFactory() throws Exception {
List<ServerAddress> seeds = new ArrayList<>();
String[] hostPorts = hostPort.split(",");
for(int i = 0 ; i < hostPorts.length;i++){
String[] hps = hostPorts[i].split(":");
ServerAddress serverAddress = new ServerAddress(hps[0], Integer.valueOf(hps[1]));
seeds.add(serverAddress);
}
if(StringUtils.isEmpty(username) || StringUtils.isEmpty(password)){
return new SimpleMongoDbFactory(new MongoClient(seeds), database);
}
List<MongoCredential> mongoCredentialList = new ArrayList<>();
mongoCredentialList.add(MongoCredential.createCredential(username, database, password.toCharArray()));
return new SimpleMongoDbFactory(new MongoClient(seeds, mongoCredentialList), database);
}
abstract public MongoTemplate getMongoTemplate() throws Exception;
}
2.创建新的类继承刚创建的mongodb工厂
package com.mysqlandmongodb.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.mongodb.core.MongoTemplate;
/**
* Created by admin on 2019/11/8.
*/
@Configuration
@ConfigurationProperties(prefix = "spring.data.mongodb.secondary")
public class PrimaryMongoConfig extends AbstractMongoConfig {
// @Primary //如果不指定数据源则默认次数据源
@Override
public @Bean(name = "primaryMongoTemplate") MongoTemplate getMongoTemplate() throws Exception {
return new MongoTemplate(mongoDbFactory());
}
}
到此我们的mongdb数据源配置完成
五、myslq和mongdb数据源都配置好了接下来就是用了
我的demo只是在service层使用了
package com.mysqlandmongodb.service.impl;
import com.mysqlandmongodb.entity.GllLlttuisonglist;
import com.mysqlandmongodb.entity.Ip;
import com.mysqlandmongodb.mapper.FirstDataMapper;
import com.mysqlandmongodb.service.DemoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
/**
* Created by admin on 2019/11/11.
*/
@Service
public class DemoServiceImpl implements DemoService {
@Autowired
private FirstDataMapper firstDataMapper;
@Autowired
@Qualifier(value = "primaryMongoTemplate") //为了判断是哪个数据源
private MongoTemplate mongoTemplate;
@Override
public void cc() {
//mongodb数据源
Criteria criteria = new Criteria();
criteria.and("ip").is("192.168.20.59");
Query query;
query= new Query(criteria);
Ip a= mongoTemplate.findOne(query,Ip.class,"ip");//根据IP查询是否存在访问IP
System.out.println(a.getIp());
//mysql数据源
GllLlttuisonglist b= firstDataMapper.cc();
System.out.println(b.getInfo());
}
}
总结:在做这个的时候搭完遇到了一个问题,mysql数据源mapper文件创建bean不成功,然后我在启动文件MysqlandmongodbdeomApplication增加了一个注解
@SpringBootApplication
@MapperScan("com.mysqlandmongodb.mapper")//扫描mapper包的地址
public class MysqlandmongodbdeomApplication {
public static void main(String[] args) {
SpringApplication.run(MysqlandmongodbdeomApplication.class, args);
}
}