一、在現實場景中經常用到到數據源配置的場景,項目可能會使用多個數據源入sqlserver mysql等,針對springboot+mybatis 服務,以下是針對兩個數據源進行的配置。
目錄結構如下:
1、首先對mybatis配置進行初步配置。mybatis.cfg.xml
<?xml version="1.0" encoding="GBK" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--<settings>-->
<!--<setting name="logImpl" value="STDOUT_LOGGING" />-->
<!--</settings>-->
<typeAliases>
<!--<typeAlias alias="ss_GetCards" type="com.jdd.data.soa.model.SSMatchCard" />
<typeAlias alias="ss_GetTeamStatisticsData" type="com.jdd.data.soa.model.SSGetTeamStatisticsData" />
<typeAlias alias="ss_GetGoals" type="com.jdd.data.soa.model.SSMatchGoal" />
<typeAlias alias="ss_GetChanges" type="com.jdd.data.soa.model.SSGetChange" />
<typeAlias alias="ss_GetMatchTeamPlayer" type="com.jdd.data.soa.model.SSGetMatchTeamPlayer" />-->
</typeAliases>
</configuration>
2、接着對數據源1配置:
package com.jdddata.dic.base.service.match.common.db;
import org.apache.commons.lang.ArrayUtils;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
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 org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
@Configuration()
@MapperScan(basePackages = {"com.jdddata.dic.base.service.match.dao.sportRadar"}, sqlSessionFactoryRef = "sqlSessionFactoryBean")
public class DatabaseConfig {
@Bean(name = "sportRadarDataSource")
@Qualifier("sportRadarDataSource")
@Primary
@ConfigurationProperties(prefix = "spring.datasource.primary")
public DataSource sportRadarDataSource() {
return DataSourceBuilder.create().build();
}
@Bean("sqlSessionFactoryBean")
public SqlSessionFactory sqlSessionFactoryBean(@Qualifier("sportRadarDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
Resource[] sportRadarList = resolver.getResources("classpath:mapper/sportRadar/*.xml");
// Resource[] ldList = resolver.getResources("classpath:mapper/ld/*.xml");
// Resource[] optaList = resolver.getResources("classpath:mapper/opta/*.xml");
// Resource[] resources = (Resource[]) ArrayUtils.addAll(sportRadarList);
// resources = (Resource[]) ArrayUtils.addAll(resources, optaList);
sqlSessionFactoryBean.setMapperLocations(sportRadarList);
sqlSessionFactoryBean.setConfigLocation(resolver.getResource("classpath:mybatis.cfg.xml"));
return sqlSessionFactoryBean.getObject();
}
@Bean("transactionManager")
public DataSourceTransactionManager transactionManager(@Qualifier("sportRadarDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
3、數據源2配置
package com.jdddata.dic.base.service.match.common.db;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
import org.springframework.boot.context.properties.ConfigurationProperties;
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 javax.sql.DataSource;
@Configuration
@MapperScan(basePackages = "com.jdddata.dic.base.service.match.dao.jddData", sqlSessionFactoryRef = "jddData_SqlSessionFactoryBean")
public class JddDataDBConfig {
@Bean(name = "jddData_DataSource")
@Qualifier("jddData_DataSource")
@ConfigurationProperties(prefix = "spring.datasource.jddData")
public DataSource optaDataSource() {
return DataSourceBuilder.create().build();
}
@Bean("jddData_SqlSessionFactoryBean")
public SqlSessionFactory sqlSessionFactoryBean(@Qualifier("jddData_DataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath:mapper/jddData/*.xml"));
sqlSessionFactoryBean.setConfigLocation(resolver.getResource("classpath:mybatis.cfg.xml"));
return sqlSessionFactoryBean.getObject();
}
@Bean("jddData_transactionManager")
public DataSourceTransactionManager transactionManager(@Qualifier("jddData_DataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
4、xml mapper文件示例:如意nameSpace一定要做更改爲dao層對應的mapper文件
<?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="com.jdddata.dic.base.service.match.dao.soccerRadar.SMatchAnalyzeLiveMapper" >
<resultMap id="MatchCardDo" type="com.jdddata.dic.base.service.match.model.match.analyzelive.MatchCardDo">
<result column="MATCH_ID" property="matchId"/>
<result column="TEAM" property="team"/>
<result column="TIME" property="time"/>
<result column="TYPE" property="type"/>
<result column="PLAYER_ID" property="playerId"/>
<result column="playerName" property="playerName"/>
</resultMap>
<select id="selectCardList" parameterType="map" resultMap="MatchCardDo">
select
gf.game_id MATCH_ID,
gf.team_side TEAM,
gf.foul_time TIME,
gf.foul_type TYPE,
gf.player_id PLAYER_ID,
CASE
WHEN p.name_chs_abbr IS NOT NULL and p.name_chs_abbr != '' THEN p.name_chs_abbr
WHEN p.name_chs IS NOT NULL and p.name_chs != '' THEN p.name_chs
WHEN p.name_eng_abbr IS NOT NULL and p.name_eng_abbr != '' THEN p.name_eng_abbr
WHEN p.name_eng IS NOT NULL and p.name_eng != '' THEN p.name_eng
END AS playerName
from game_foul gf
left join player p on gf.player_id = p.id
where gf.foul_type in
<foreach collection="foulTypes" index="index" item="foulType" open="(" close=")" separator=",">
#{foulType}
</foreach>
AND gf.game_id = #{matchId} AND gf.foul_time>0
</select>
</mapper>
注意:
1、Mapperscan中需要加入需要掃描的dao層。
2、setMapperLocations 需要加入資源文件夾下的xml文件掃描地址。
3、setConfigLocation 加入mybatis.cfg.xml配置文件。
config配置-示例
###########################
#spring.datasource.primary.url=jdbc:sqlserver://XXXXdatabaseName=DataCenter_Trade
spring.datasource.primary.username=XXX
spring.datasource.primary.password=XX
spring.datasource.primary.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver
spring.datasource.primary.test-while-idle=true
spring.datasource.primary.validation-query=SELECT 1;
spring.datasource.primary.time-between-eviction-runs-millis=60000
spring.datasource.primary.max-active=5
spring.datasource.primary.max-idle=10
spring.datasource.primary.min-idle=1
spring.datasource.primary.max-wait-millis=60000
maven配置:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- sql server驅動 -->
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>sqljdbc4</artifactId>
</dependency>