网站建栏目建那些,手机视频网站设计,深圳网站制作公司流程,网站怎么做直播功能目录 背景技术选型配置多数据源思路(以两个为例)代码实现1.导入依赖2.各自的配置 3.各自的dataSourcenews数据库的smbms数据库的注意#xff1a;Primary注解 4.各自的SqlSessionFactory等news数据库的smbms数据库的 5.去掉启动类头上的MapperScan6.各自的mapper接口7.各自的ma… 目录 背景技术选型配置多数据源思路(以两个为例)代码实现1.导入依赖2.各自的配置 3.各自的dataSourcenews数据库的smbms数据库的注意Primary注解 4.各自的SqlSessionFactory等news数据库的smbms数据库的 5.去掉启动类头上的MapperScan6.各自的mapper接口7.各自的mapper.xml8.测试 背景
在单数据源的情况下Spring Boot的配置非常简单只需要在application.properties文件中配置连接参数即可。但是往往随着业务量发展我们通常会进行数据库拆分或是引入其他数据库从而我们需要配置多个数据源
技术选型
SpringBoot2.3.12jdk1.8mysql5.7持久层框架mybatis
配置多数据源思路(以两个为例)
要执行两个数据库的操作就需要有两个数据库配置有两个数据库配置那就要两个SqlSessionBuilder来创建SqlSessionFactory有两个SqlSessionFactory就能创建两个数据库自己的sqlSession然后就能执行不同数据库的操作了现在用的都是数据库连接池需要创建dataSource因此按照上面的思路也需要有各自数据库的dataSource用各自的dataSource创建各自的SqlSessionFactory继而创建各自的SqlSessionTemplate当然事务管理器也应该是用各自的dataSource来创建那么各自的SqlSessionFactory就要扫描各自的mapper层因此就需要有各自的mapper包至于各自的mapper.xml可以放在一起也可以不放在一起因为mapper.xml中的namespace是根据包名来映射的
代码实现
1.导入依赖 dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-logging/artifactId/dependencydependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion8.0.21/version/dependency!-- 阿里数据库连接池 --dependencygroupIdcom.alibaba/groupIdartifactIddruid/artifactIdversion1.0.9/version/dependencydependencygroupIdorg.mybatis.spring.boot/groupIdartifactIdmybatis-spring-boot-starter/artifactIdversion2.3.1/version/dependency2.各自的配置
server:port: 8888logging:level:org.springframework.web: debugcom.kgc.mapper: debug
spring:datasource:smbms:driverClassName: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/smbms?useSSLfalseuseUnicodetruecharacterEncodingutf-8serverTimezoneAsia/Shanghaiusername: rootpassword: 123456news:driverClassName: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/chinanewsdb?useSSLfalseuseUnicodetruecharacterEncodingutf-8serverTimezoneAsia/Shanghaiusername: rootpassword: 123456mybatis:mapper-locations: classpath:mybatis/mapper/*.xmltype-aliases-package: com.kgc.pojonews:mapper-locations: classpath:mybatis/newsmapper/*.xml
# configuration:
# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl3.各自的dataSource
news数据库的
package com.kgc.config;import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
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 javax.sql.DataSource;/*** author: zjl* datetime: 2024/4/20* desc:*/
Configuration
//ConfigurationProperties(prefix spring.datasource.news)
public class NewsDataSourceConfig {Value(${spring.datasource.news.driverClassName})private String driverClassName;Value(${spring.datasource.news.url})private String url;Value(${spring.datasource.news.username})private String username;Value(${spring.datasource.news.password})private String password;Bean(newsDataSource)public DataSource createDataSource() {DruidDataSource dataSource new DruidDataSource();dataSource.setDriverClassName(driverClassName);dataSource.setUrl(url);dataSource.setUsername(username);dataSource.setPassword(password);return dataSource;}
}smbms数据库的
package com.kgc.config;import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
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 javax.sql.DataSource;/*** author: zjl* datetime: 2024/4/20* desc:*/
Configuration
//ConfigurationProperties(prefix spring.datasource.smbms)
public class SmbmsDataSourceConfig {Value(${spring.datasource.smbms.driverClassName})private String driverClassName;Value(${spring.datasource.smbms.url})private String url;Value(${spring.datasource.smbms.username})private String username;Value(${spring.datasource.smbms.password})private String password;Bean(smbmsDataSource)Primarypublic DataSource createDataSource() {DruidDataSource dataSource new DruidDataSource();dataSource.setDriverClassName(driverClassName);dataSource.setUrl(url);dataSource.setUsername(username);dataSource.setPassword(password);return dataSource;}
}注意Primary注解
其作用与功能当有多个相同类型的bean时使用Primary来赋予bean更高的优先级。在这里需要注册多个相同DataSource类型的bean要有一个有更高的优先级否则会报错
4.各自的SqlSessionFactory等
news数据库的
package com.kgc.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.Qualifier;
import org.springframework.beans.factory.annotation.Value;
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 org.springframework.transaction.annotation.EnableTransactionManagement;import javax.annotation.Resource;
import javax.sql.DataSource;/*** author: zjl* datetime: 2024/4/20* desc:*/
Configuration
EnableTransactionManagement
MapperScan(value com.kgc.news.mapper,sqlSessionFactoryRef newsSqlSessionFactory)
public class NewsSqlSessionFactoryConfiguratiion {Resource(name newsDataSource)private DataSource newsDataSource;Value(${mybatis.news.mapper-locations})private String mapperLocations;Bean(newsSqlSessionFactory)public SqlSessionFactory create() throws Exception {SqlSessionFactoryBean bean new SqlSessionFactoryBean();bean.setDataSource(newsDataSource);PathMatchingResourcePatternResolver resourcePatternResolver new PathMatchingResourcePatternResolver();bean.setMapperLocations(resourcePatternResolver.getResources(mapperLocations));return bean.getObject();}Bean(newsSqlSessionTemplate)public SqlSessionTemplate createSqlSession(Qualifier(newsSqlSessionFactory) SqlSessionFactory sqlSessionFactory){return new SqlSessionTemplate(sqlSessionFactory);}Bean(newsTransactionManager)public PlatformTransactionManager createTransactionManager(){return new DataSourceTransactionManager(newsDataSource);}
}smbms数据库的
package com.kgc.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.Qualifier;
import org.springframework.beans.factory.annotation.Value;
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 org.springframework.transaction.annotation.EnableTransactionManagement;import javax.annotation.Resource;
import javax.sql.DataSource;
import java.io.IOException;/*** author: zjl* datetime: 2024/4/20* desc:*/
Configuration
EnableTransactionManagement
MapperScan(value com.kgc.mapper,sqlSessionFactoryRef smbmsSqlSessionFactory)
public class SmbmsSqlSessionFactoryConfiguratiion {Resource(name smbmsDataSource)private DataSource smbmsDataSource;Value(${mybatis.mapper-locations})private String mapperLocations;Bean(smbmsSqlSessionFactory)public SqlSessionFactory create() throws Exception {SqlSessionFactoryBean bean new SqlSessionFactoryBean();bean.setDataSource(smbmsDataSource);PathMatchingResourcePatternResolver resourcePatternResolver new PathMatchingResourcePatternResolver();bean.setMapperLocations(resourcePatternResolver.getResources(mapperLocations));return bean.getObject();}Bean(smbmsSqlSessionTemplate)public SqlSessionTemplate createSqlSession(Qualifier(smbmsSqlSessionFactory) SqlSessionFactory sqlSessionFactory){return new SqlSessionTemplate(sqlSessionFactory);}Bean(smbmsTransactionManager)public PlatformTransactionManager createTransactionManager(){return new DataSourceTransactionManager(smbmsDataSource);}
}5.去掉启动类头上的MapperScan
SpringBootApplication
//MapperScan(basePackages {com.kgc.mapper})
public class BootdemoApplication {public static void main(String[] args) {SpringApplication.run(BootdemoApplication.class, args);}
}6.各自的mapper接口 public interface UserMapper {int selectCount();
}public interface NewsMapper {int selectCount();
}7.各自的mapper.xml ?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapperPUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtd
mapper namespacecom.kgc.mapper.UserMapperselect idselectCount resultTypeintSELECT COUNT(1) FROM SMBMS_USER/select
/mapper?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapperPUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtd
mapper namespacecom.kgc.news.mapper.NewsMapperselect idselectCount resultTypeintSELECT COUNT(1) FROM news_detail/select
/mapper8.测试
service
Service
public class UserService {Resourceprivate UserMapper userMapper;Resourceprivate NewsMapper newsMapper;public Integer allCount(){return userMapper.selectCount() newsMapper.selectCount();}
}controller
RestController
public class UserController {Resourceprivate UserService userService;RequestMapping(/all)public Object all(){return userService.allCount();}
}