springboot集成了mybaties,默認情況下只需指定spring運行的配置文件,你可以不用做些什麼,mapper的數據源會自動加載,但對於多數據源時該怎麼配置呢?
首先看看我的目錄樹,我的項目需要訪問兩個跨域的數據庫源。你需要做的事如下:
1. springboot的啓動類指定exclude,這項屬性在舊版是在@EnableAutoConfiguration設置。@MapperScan設置爲projectName.mapper所在的主包,見上圖。酌情修改
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class,
DataSourceTransactionManagerAutoConfiguration.class, MybatisAutoConfiguration.class})
@MapperScan("gocron_manager_system.mapper")
2.配置文件,編寫數據源,如下:屏蔽關鍵字,但並不影響閱讀。數據連接信息最後一個點之前的可隨意命名,但末尾的必須一致。springboot 2.0前 jdbc-url 需改成 url
server.port=9527
#數據鏈接1
datasource.ultraman.jdbc-url=jdbc:mysql://xxx:3306/xxx?characterEncoding=utf-8&useAffectedRows=true
datasource.ultraman.username=xx
datasource.ultraman.password=xx
datasource.ultraman.driverClassName=com.mysql.jdbc.Driver
#數據鏈接2
datasource.clouddev.jdbc-url=jdbc:mysql://xxx:3306/xxx?characterEncoding=utf-8&useAffectedRows=true
datasource.clouddev.username=xx
datasource.clouddev.password=xx
datasource.clouddev.driverClassName=com.mysql.jdbc.Driver
3.mapper類,有幾個數據源,創建幾個。我的mapper是以註解方式實現,並未使用xml。且是接口,不需要編寫實現類
@Mapper
@Repository
public interface UltramanMapper {
@Select("Select task_id, run_freq FROM t_project WHERE id=#{ultramanId}")
UltramanProject getUltramanProject(@Param("ultramanId") int ultramanId);
}
4.編寫與數據源相對的config類,有幾個數據源就得創建幾個類。需要注意設置@MapperScan的basePackage指向你的mapper類所在的包。裏面的一些Bean名稱,注意一致。對於沒使用xml實現mapper的,sqlSessionFactory方法getResources("classpath*:mapper/clouddev/*.xml"))可以隨意,不用創建目錄
#####cloddev數據源,config類
@Configuration
@MapperScan(basePackages = "gocron_manager_system.mapper.clouddev", sqlSessionFactoryRef = "clouddevSqlSessionFactory")
public class ClouddevDataSourceConfig {
@Primary
@Bean(name = "clouddevDataSource")
@ConfigurationProperties("datasource.clouddev")
public DataSource masterDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "clouddevSqlSessionFactory")
public SqlSessionFactory sqlSessionFactory(@Qualifier("clouddevDataSource") DataSource dataSource)
throws Exception {
SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
sessionFactoryBean.setDataSource(dataSource);
sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources("classpath*:mapper/clouddev/*.xml"));
return sessionFactoryBean.getObject();
}
}
#####ultraman數據源,config類
@Configuration
@MapperScan(basePackages = "gocron_manager_system.mapper.ultraman", sqlSessionFactoryRef = "ultramanSqlSessionFactory")
public class UltramanDataSourceConfig {
@Primary
@Bean(name = "ultramanDataSource")
@ConfigurationProperties("datasource.ultraman")
public DataSource masterDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "ultramanSqlSessionFactory")
public SqlSessionFactory sqlSessionFactory(@Qualifier("ultramanDataSource") DataSource dataSource)
throws Exception {
SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
sessionFactoryBean.setDataSource(dataSource);
sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources("classpath*:mapper/ultraman/*.xml"));
return sessionFactoryBean.getObject();
}
}
4.使用的時候,自動注入即可進行方法的調用
@Autowired
private LogMetaMapper logMetaMapper;
@Autowired
private UltramanMapper ultramanMapper;