连接多个MySQL数据库的方法
在实际的开发中,有时候需要连接多个不同的MySQL数据库,比如一个系统需要同时操作用户数据和产品数据,这时候就需要在MyBatis配置中实现连接多个数据库。下面我们来介绍一种简单的方法。
配置数据源
首先,在resources
目录下创建多个properties
文件,分别用于配置不同数据库的连接信息,比如userDB.properties
和productDB.properties
。
userDB.properties
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/userdb
jdbc.username=root
jdbc.password=password
productDB.properties
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/productdb
jdbc.username=root
jdbc.password=password
MyBatis配置
在MyBatis的配置文件中,引入多个数据源的配置,并通过sqlSessionFactoryBean
创建多个SqlSessionFactory
实例。
mybatis-config.xml
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- 配置Mapper -->
</mappers>
</configuration>
SqlSessionFactoryBean
@Configuration
public class SqlSessionFactoryBean {
@Value("${userDB.driver}")
private String userDBDriver;
@Value("${userDB.url}")
private String userDBUrl;
@Value("${userDB.username}")
private String userDBUsername;
@Value("${userDB.password}")
private String userDBPassword;
@Value("${productDB.driver}")
private String productDBDriver;
@Value("${productDB.url}")
private String productDBUrl;
@Value("${productDB.username}")
private String productDBUsername;
@Value("${productDB.password}")
private String productDBPassword;
@Bean(name = "userSqlSessionFactory")
public SqlSessionFactory userSqlSessionFactory() throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource(userDBDriver, userDBUrl, userDBUsername, userDBPassword));
return sqlSessionFactoryBean.getObject();
}
@Bean(name = "productSqlSessionFactory")
public SqlSessionFactory productSqlSessionFactory() throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource(productDBDriver, productDBUrl, productDBUsername, productDBPassword));
return sqlSessionFactoryBean.getObject();
}
public DataSource dataSource(String driver, String url, String username, String password) {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName(driver);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
}
使用多数据源
在需要操作不同数据库的地方,通过@Qualifier
注解指定具体的SqlSessionFactory
实例。
@Repository
public class UserDao {
@Autowired
@Qualifier("userSqlSessionFactory")
private SqlSessionFactory userSqlSessionFactory;
public User getUserById(int id) {
try (SqlSession session = userSqlSessionFactory.openSession()) {
return session.selectOne("getUserById", id);
}
}
}
@Repository
public class ProductDao {
@Autowired
@Qualifier("productSqlSessionFactory")
private SqlSessionFactory productSqlSessionFactory;
public Product getProductById(int id) {
try (SqlSession session = productSqlSessionFactory.openSession()) {
return session.selectOne("getProductById", id);
}
}
}
状态图
stateDiagram
state 客户端
state 服务器1
state 服务器2
客户端 --> 服务器1: 请求用户数据
服务器1 --> 服务器2: 请求产品数据
服务器2 --> 服务器1: 返回产品数据
服务器1 --> 客户端: 返回用户数据
关系图
erDiagram
USER ||--o| ORDER : has
USER ||--o| COMMENT : has
PRODUCT ||--o| ORDER : has
PRODUCT ||--o| COMMENT : has
通过以上方式,我们可以在MyBatis中连接多个MySQL数据库,实现对不同数据库的操作。这种方法简单易懂,方便扩展,适用于大多数业务场景。希望对你有所帮助!