对于spring boot,相信很多小伙伴都不陌生,如果你对于如何创建springboot项目工程不是很熟悉,网上一大堆资料总会满足你,老司机就当我没说哈。
本文主要讲述的是如何在springboot项目下配置多个数据源,并且在使用mybatis框架的情况下,如何配置xml和注解方式都可以请求数据库。
首先贴出本次springboot项目的工程结构
在springboot默认的工程目录下,会存在application.properties文件。我们在此文件里设置数据库的相关信息,包括数据库地址,用户名,密码,以及驱动名称。(由于安全以及其他原因,相关地址和用户名密码等就不写在下面了),小伙伴们z在使用的过程中将以下“=”后面写上自己的数据库信息即可。
## radm database
radm.datasource.url=
radm.datasource.username=
radm.datasource.password=
radm.datasource.driverClassName=
## jira database
jira.datasource.url=
jira.datasource.username=
jira.datasource.password=
jira.datasource.driverClassName=
## jira2 database
jira2.datasource.url=
jira2.datasource.username=
jira2.datasource.password=
jira2.datasource.driverClassName=
## wiki database
wiki.datasource.url=
wiki.datasource.username=
wiki.datasource.password=
wiki.datasource.driverClassName=
## wiki2 database
wiki2.datasource.url=
wiki2.datasource.username=
wiki2.datasource.password=
wiki2.datasource.driverClassName=
## wiki3 database
wiki3.datasource.url=
wiki3.datasource.username=
wiki3.datasource.password=
wiki3.datasource.driverClassName=
## tplusPlatformDB database
tplusPlatform.datasource.url=
tplusPlatform.datasource.username=
tplusPlatform.datasource.password=
tplusPlatform.datasource.driverClassName=
application.propreties中除了可以设置数据库信息,还可以设置其他项目相关信息,如
#reload Recompiling 当代码改变时,自动重新启动项目
spring.devtools.livereload.enabled=true
#log日志地址,这里的log日志,只是使用了spring boot的默认日志,也可以用xml的方式自己定义
logging.path=/var/log/schedule_quartz_logs
项目启动类ScheduleQuartzApplication.java如下:
@EnableScheduling
@EnableTransactionManagement // 启注解事务管理,等同于xml配置方式的
@SpringBootApplication
public class ScheduleQuartzApplication {
public static void main(String[] args) {
SpringApplication.run(ScheduleQuartzApplication.class, args);
}
}
在数据源的配置类RadmDataSourceConfig.java中
@Configuration
@AutoConfigureAfter(MybatisAutoConfiguration.class)
@MapperScan(basePackages = {RadmDataSourceConfig.DAOPACKAGE,RadmDataSourceConfig.MAPPACKAGE}, sqlSessionFactoryRef = "radmSqlSessionFactory")
public class RadmDataSourceConfig {
static final String DAOPACKAGE = "com.chanjet.schedule_quartz.*.radmdao";
static final String MAPPACKAGE = "com.chanjet.schedule_quartz.*.radmmapper";
static final String MAPPER_LOCATION = "classpath:com.chanjet.schedule_quartz.*.radmmapper/*.xml";
@Value("${radm.datasource.url}")
private String url;
@Value("${radm.datasource.username}")
private String user;
@Value("${radm.datasource.password}")
private String password;
@Value("${radm.datasource.driverClassName}")
private String driverClass;
@Bean(name = "radmDataSource")
@Primary//设置其为默认数据源
public DataSource radmDataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driverClass);
dataSource.setUrl(url);
dataSource.setUsername(user);
dataSource.setPassword(password);
return dataSource;
}
@Bean(name = "radmTransactionManager")
@Primary
public DataSourceTransactionManager radmTransactionManager() {
return new DataSourceTransactionManager(radmDataSource());
}
@Bean(name = "radmSqlSessionFactory")
@Primary
public SqlSessionFactory radmSqlSessionFactory(@Qualifier("radmDataSource") DataSource radmDataSource)
throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(radmDataSource);
sessionFactory.setMapperLocations(
new PathMatchingResourcePatternResolver().getResources(RadmDataSourceConfig.MAPPER_LOCATION));
return sessionFactory.getObject();
}
}
其中 @Primary是为了在多个数据源中,设置的默认主库。
@AutoConfigureAfter(MybatisAutoConfiguration.class)是为了解决多数据源引起的循环引用问题。
定义的三个常量分别是 注解请求数据库的包名称,xml请求数据的文件位置和mapper的包名称
static final String DAOPACKAGE = "com.chanjet.schedule_quartz.*.radmdao";//dao所在的包,用于注解方式请求数据库
static final String MAPPACKAGE = "com.chanjet.schedule_quartz.*.radmmapper";//mapper所在的包 ,用于xml方式请求数据库
static final String MAPPER_LOCATION = "classpath:com.chanjet.schedule_quartz.*.radmmapper/*.xml";//xml文件所在的位置
@MapperScan(basePackages = {RadmDataSourceConfig.DAOPACKAGE,RadmDataSourceConfig.MAPPACKAGE}, sqlSessionFactoryRef = "radmSqlSessionFactory")
上面的@MapperScan,用于spring扫描dao和mapper,sqlSessionFactoryRef指定了用哪个“数据工厂”,在上面工厂的定义时,我们指定了xml文件所在的位置。
其余数据源的配置和写法同上面RadmDataSourceConfig.java写法类似,但要去除默认数据源的配置。
如:JiraDataSourceConfig.java
@Configuration
@MapperScan(basePackages = {JiraDataSourceConfig.PACKAGE,JiraDataSourceConfig.MAPPACKAGE}, sqlSessionFactoryRef = "jiraSqlSessionFactory")
public class JiraDataSourceConfig {
static final String PACKAGE = "com.chanjet.schedule_quartz.*.jiradao";
static final String MAPPACKAGE = "com.chanjet.schedule_quartz.*.jiramapper";
static final String MAPPER_LOCATION = "classpath:com.chanjet.schedule_quartz.*.jiramapper/*.xml";
@Value("${jira.datasource.url}")
private String url;
@Value("${jira.datasource.username}")
private String user;
@Value("${jira.datasource.password}")
private String password;
@Value("${jira.datasource.driverClassName}")
private String driverClass;
@Bean(name = "jiraDataSource")
public DataSource jiraDataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driverClass);
dataSource.setUrl(url);
dataSource.setUsername(user);
dataSource.setPassword(password);
return dataSource;
}
@Bean(name = "jiraTransactionManager")
public DataSourceTransactionManager jiraTransactionManager() {
return new DataSourceTransactionManager(jiraDataSource());
}
@Bean(name = "jiraSqlSessionFactory")
public SqlSessionFactory jiraSqlSessionFactory(@Qualifier("jiraDataSource") DataSource jiraDataSource)
throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(jiraDataSource);
sessionFactory.setMapperLocations(
new PathMatchingResourcePatternResolver().getResources(JiraDataSourceConfig.MAPPER_LOCATION));
return sessionFactory.getObject();
}
}
以上就是springboot项目多数据源和+注解/XML的配置方式。
下面是在实际应用中的一个例子,注意:在wangjqotest包的上一层是包schedule_quartz,这里不要搞错
Cotroller层:
@RestController
@RequestMapping("/wangjqotestcontroller")
public class WangjqoTestController {
@Autowired
private WangjqoTestService wangjqoTestService;
@RequestMapping("/getWangjqoTest")
public List
Service层:
@Service
public class WangjqoTestService {
@Autowired
private WangjqoTestMapper wangjqoTestMapper;
@Autowired
private WangjqoTestDao wangjqoTestDao;
public List> getWangjqoTest(){
List> wangjqoTest = wangjqoTestMapper.getWangjqoTest();
return wangjqoTest;
}
public Map getMyMap1(Integer id){
Map myMap1 = wangjqoTestDao.getMyMap1(id);
return myMap1;
}
}
dao:
@Mapper
public interface WangjqoTestDao {
@Select("SELECT * FROM cid_first_dir WHERE id = #{id}")
public Map getMyMap1(@Param("id")Integer id);
}
mapper:
@Mapper
public interface WangjqoTestMapper {
public List> getWangjqoTest();
}
xml:
运行ScheduleQuartzApplication.java中的main函数即可启动整个项目了。
外加:如果说,在程序启动过程中,出现application.properties中的信息取不到的情况,系统报错,那么要注意一下你的目录结构,application.properties是否在src/main/resouce目录下,如果在的情况下依旧报错,那么有可能是spring boot没有将resource文件夹当做工程目录,我用的编程工具是eclipse,可以用以下的方式解决:
这样就可以解决加载不到applications.properties文件中数据的问题了。