SpringBoot和Mybatis配置多数据源连接多个数据库

您所在的位置:网站首页 springboot怎么配置数据库连接 SpringBoot和Mybatis配置多数据源连接多个数据库

SpringBoot和Mybatis配置多数据源连接多个数据库

2023-04-26 02:14| 来源: 网络整理| 查看: 265

SpringBoot和Mybatis配置多数据源连接多个数据库SpringBoot系列教程

目前业界操作数据库的框架一般是 Mybatis,但在很多业务场景下,我们需要在一个工程里配置多个数据源来实现业务逻辑。在SpringBoot中也可以实现多数据源并配合Mybatis框架编写xml文件来执行SQL。在SpringBoot中,配置多数据源的方式十分便捷,

下面开始上代码:

在pom.xml文件中需要添加一些依赖 org.mybatis.spring.boot mybatis-spring-boot-starter 1.2.0 mysql mysql-connector-java 5.1.39 com.alibaba druid 1.0.18 application.properties 配置两个数据源配置# master 数据源配置 master.datasource.url=jdbc:mysql://localhost:3306/springbootdb?useUnicode=true&characterEncoding=utf8 master.datasource.username=root master.datasource.password=321 master.datasource.driverClassName=com.mysql.jdbc.Driver # second 数据源配置 second.datasource.url=jdbc:mysql://localhost:3306/springbootdb_second?useUnicode=true&characterEncoding=utf8 second.datasource.username=root second.datasource.password=321 second.datasource.driverClassName=com.mysql.jdbc.Driver数据源配置

多数据源配置的时候注意,必须要有一个主数据源,即 MasterDataSourceConfig 配置

@Primary 标志这个 Bean 如果在多个同类 Bean 候选时,该 Bean 优先被考虑。「多数据源配置的时候注意,必须要有一个主数据源,用 @Primary 标志该 Bean @MapperScan 扫描 Mapper 接口并容器管理,包路径精确到 master,为了和下面 cluster 数据源做到精确区分 @Value 获取全局配置文件 application.properties 的 kv 配置,并自动装配sqlSessionFactoryRef 表示定义了 key ,表示一个唯一 SqlSessionFactory 实例

MasterDataSourceConfig的代码:

@Configuration // 扫描 Mapper 接口并容器管理 @MapperScan(basePackages = MasterDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "masterSqlSessionFactory") public class MasterDataSourceConfig { // 精确到 master 目录,以便跟其他数据源隔离 static final String PACKAGE = "org.spring.springboot.dao.master"; static final String MAPPER_LOCATION = "classpath:mapper/master/*.xml"; @Value("${master.datasource.url}") private String url; @Value("${master.datasource.username}") private String user; @Value("${master.datasource.password}") private String password; @Value("${master.datasource.driverClassName}") private String driverClass; @Bean(name = "masterDataSource") @Primary public DataSource masterDataSource() { DruidDataSource dataSource = new DruidDataSource(); dataSource.setDriverClassName(driverClass); dataSource.setUrl(url); dataSource.setUsername(user); dataSource.setPassword(password); return dataSource; } @Bean(name = "masterTransactionManager") @Primary public DataSourceTransactionManager masterTransactionManager() { return new DataSourceTransactionManager(masterDataSource()); } @Bean(name = "masterSqlSessionFactory") @Primary public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource") DataSource masterDataSource) throws Exception { final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); sessionFactory.setDataSource(masterDataSource); sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver() .getResources(MasterDataSourceConfig.MAPPER_LOCATION)); return sessionFactory.getObject(); } }

第二个数据源SecondDataSourceConfig的配置如下:

@Configuration // 扫描 Mapper 接口并容器管理 @MapperScan(basePackages = SecondDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "secondSqlSessionFactory") public class SecondDataSourceConfig { // 精确到 cluster 目录,以便跟其他数据源隔离 static final String PACKAGE = "com.springboot.dao.second"; static final String MAPPER_LOCATION = "classpath:mapper/second/*.xml"; @Value("${second.datasource.url}") private String url; @Value("${second.datasource.username}") private String user; @Value("${second.datasource.password}") private String password; @Value("${second.datasource.driverClassName}") private String driverClass; @Bean(name = "secondDataSource") public DataSource clusterDataSource() { DruidDataSource dataSource = new DruidDataSource(); dataSource.setDriverClassName(driverClass); dataSource.setUrl(url); dataSource.setUsername(user); dataSource.setPassword(password); return dataSource; } @Bean(name = "secondTransactionManager") public DataSourceTransactionManager clusterTransactionManager() { return new DataSourceTransactionManager(clusterDataSource()); } @Bean(name = "secondSqlSessionFactory") public SqlSessionFactory clusterSqlSessionFactory(@Qualifier("secondDataSource") DataSource clusterDataSource) throws Exception { final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); sessionFactory.setDataSource(clusterDataSource); sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver() .getResources(SecondDataSourceConfig.MAPPER_LOCATION)); return sessionFactory.getObject(); } }

到此,不同的数据源配置就已经完成,剩下的只需要将将Mybatis的xml文件和DAO层的接口写好,并在Service层注入,直接使用就行。

Service层的代码:

@Service public class UserServiceImpl implements UserService { @Autowired private UserDao userDao; @Autowired private SchoolDao schoolDao; public UserVo getUser(Long id) { UserVo userVo = userDao.findById(id); SchoolVo schoolVo = schoolDao.findByName("清华"); userVo.setSchoolVo(schoolVo); return userVo; } }

Mybatis的xml文件UserDao.xml和SchoolDao.xml的内容:

UserDao.xml

id, user_name select from user where id = #{id}

SchoolDao.xml

id, school_name, school_describe select from school where school_name = #{schoolName}

TestController

@Controller @RequestMapping(value = "/api/v1/test") public class TestController { @Autowired private UserService userService; @RequestMapping(value = "/getUser") @ResponseBody public UserVo getUser(@RequestParam(value = "id") Long id) { return userService.getUser(id); } }

创建数据库和表SQL:

CREATE DATABASE springbootdb; CREATE DATABASE springbootdb_second; CREATE TABLE `user` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户编号', `user_name` varchar(25) DEFAULT NULL COMMENT '用户名称', `description` varchar(25) DEFAULT NULL COMMENT '描述', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 CREATE TABLE `school` ( `id` bigint(20) NOT NULL, `school_name` varchar(64) DEFAULT NULL COMMENT '学校名', `school_describe` varchar(128) DEFAULT NULL COMMENT '学校描述', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 insert into `springbootdb`.`user` ( `user_name`, `description`) values ( 'shuai', 'so handsome'); insert into `springbootdb_second`.`school` ( `id`, `school_name`, `school_describe`) values ( '1', '清华', '自强不息,厚德载物');

创建好数据后,整个工程的机构如下:

启动程序,在浏览器输入:http://localhost:8080/api/v1/test/getUser?id=1即可返回结果。

工程结构.png

github地址:Spring Boot 教程、技术栈、示例代码



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3