spring boot 多数据源+mybatis+xml/注解请求数据库

        对于spring boot,相信很多小伙伴都不陌生,如果你对于如何创建springboot项目工程不是很熟悉,网上一大堆资料总会满足你,老司机就当我没说哈。

        本文主要讲述的是如何在springboot项目下配置多个数据源,并且在使用mybatis框架的情况下,如何配置xml和注解方式都可以请求数据库。

        首先贴出本次springboot项目的工程结构

spring boot 多数据源+mybatis+xml/注解请求数据库_第1张图片

        在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,这里不要搞错

spring boot 多数据源+mybatis+xml/注解请求数据库_第2张图片

Cotroller层:

@RestController
@RequestMapping("/wangjqotestcontroller")
public class WangjqoTestController {
	
	@Autowired
	private WangjqoTestService wangjqoTestService;
	
	@RequestMapping("/getWangjqoTest")
	public List> getWangjqoTest(HttpServletRequest request, HttpServletResponse response) throws Exception{		
		List> wangjqoTest = wangjqoTestService.getWangjqoTest();
		return wangjqoTest;
	}
	@RequestMapping("/getWangjqoTest2")
	public Map getWangjqoTest2(HttpServletRequest request, HttpServletResponse response) throws Exception{
		Map wangjqoTest = wangjqoTestService.getMyMap1(54);
		return wangjqoTest;
	}
}

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,可以用以下的方式解决:

    spring boot 多数据源+mybatis+xml/注解请求数据库_第3张图片

spring boot 多数据源+mybatis+xml/注解请求数据库_第4张图片

这样就可以解决加载不到applications.properties文件中数据的问题了。

你可能感兴趣的:(spring,boot,多数据源,注解/xml方式请求数据库)