之前讲过springboot整合mybatis对一个数据库进行crud操作,现在来将mybatis对多个数据库进行操作。
1.创建spring boot项目
项目的选择和pom.xml文件的修改都是相同的,这里就不写了
2.配置两个数据库的连接信息
这里用自定义的One和Two来区分:
spring.datasource.one.url=jdbc:mysql://127.0.0.1:3306/javaboy?characterEncoding=UTF-8
spring.datasource.one.username=root
spring.datasource.one.password=root
spring.datasource.one.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.two.url=jdbc:mysql://127.0.0.1:3306/javaboy2?characterEncoding=UTF-8
spring.datasource.two.username=root
spring.datasource.two.password=root
spring.datasource.two.driver-class-name=com.mysql.jdbc.Driver
3.配置DataSources和SqlSessionFactory
因为配置文件改为自定义了,所以springboot自动配置失效了,这里需要手动添加(参考springboot整合JdbcTemplate多项数据源):
DataSources配置:
package org.javaboy.mybatis2.config;
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
@Configuration
public class DataSourceConfig {
@Bean
@ConfigurationProperties(prefix = "spring.datasource.one")
DataSource dsOne() {
return DruidDataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties(prefix = "spring.datasource.two")
DataSource dsTwo() {
return DruidDataSourceBuilder.create().build();
}
}
sqlSessionFactory和sqlSessionTemplate:
package org.javaboy.mybatis2.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.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.annotation.Resource;
import javax.sql.DataSource;
@Configuration
@MapperScan(basePackages = "org.javaboy.mybatis2.mapper1",sqlSessionFactoryRef = "sqlSessionFactory1",
sqlSessionTemplateRef = "sqlSessionTemplate1")
public class MyBatisConfigOne {
@Resource(name = "dsOne")
DataSource dsOne;
@Bean
SqlSessionFactory sqlSessionFactory1() {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
try {
bean.setDataSource(dsOne);
return bean.getObject();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Bean
SqlSessionTemplate sqlSessionTemplate1() {
return new SqlSessionTemplate(sqlSessionFactory1());
}
}
package org.javaboy.mybatis2.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.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.annotation.Resource;
import javax.sql.DataSource;
@Configuration
@MapperScan(basePackages = "org.javaboy.mybatis2.mapper2",sqlSessionFactoryRef = "sqlSessionFactory2",
sqlSessionTemplateRef = "sqlSessionTemplate2")
public class MyBatisConfigTwo {
@Resource(name = "dsTwo")
DataSource dsTwo;
@Bean
SqlSessionFactory sqlSessionFactory2() {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
try {
bean.setDataSource(dsTwo);
return bean.getObject();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Bean
SqlSessionTemplate sqlSessionTemplate2() {
return new SqlSessionTemplate(sqlSessionFactory2());
}
}
4.配置实体类User
属性和数据库中的字段需保持一致,且提供get,set方法
package org.javaboy.mybatis2.bean;
public class User {
private Integer id;
private String username;
private String address;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", address='" + address + '\'' +
'}';
}
}
5.mapper和xml文件
这里由于要操作两个数据库所以需要分开配置:
package org.javaboy.mybatis2.mapper1;
import org.javaboy.mybatis2.bean.User;
import java.util.List;
public interface UserMapper1 {
List<User> getAllUsers();
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.javaboy.mybatis2.mapper1.UserMapper1">
<select id="getAllUsers" resultType="org.javaboy.mybatis2.bean.User">
select * from user;
</select>
</mapper>
package org.javaboy.mybatis2.mapper2;
import org.javaboy.mybatis2.bean.User;
import java.util.List;
public interface UserMapper2 {
List<User> getAllUsers();
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.javaboy.mybatis2.mapper2.UserMapper2">
<select id="getAllUsers" resultType="org.javaboy.mybatis2.bean.User">
select * from user;
</select>
</mapper>
6.最后测试
package org.javaboy.mybatis2;
import org.javaboy.mybatis2.bean.User;
import org.javaboy.mybatis2.mapper1.UserMapper1;
import org.javaboy.mybatis2.mapper2.UserMapper2;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest
class Mybatis2ApplicationTests {
@Autowired
private UserMapper2 userMapper2;
@Autowired
private UserMapper1 userMapper1;
@Test
void contextLoads() {
List<User> allUsers = userMapper1.getAllUsers();
System.out.println(allUsers);
List<User> allUsers1 = userMapper2.getAllUsers();
System.out.println(allUsers1);
}
}