spring cloud 雙資料來源配置,兩種方式jdbc和mybatis(jdbcTemplate和 sqlsessionTemplate)及需要注意的問題
一、jdbcTemplate:jdbc
application.yml檔案:
spring:
application:
name: doubledatasource
mysql:
datasource:
url: jdbc:mysql://127.0.0.1:3306/user?useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
sqlserver:
datasource:
url: jdbc:mysql://192.168.xx.xx:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true
username: root
password: 12345
driver-class-name: com.mysql.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
注意:這裡自定義資料來源名稱和datasource的位置不能寫反;
pom檔案:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.21</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
java程式碼:
載入yml檔案中的配置類:
@Configuration
public class DataSourceConfig {
@Primary
@Bean(name = "mysql")
@Qualifier("mysql")
@ConfigurationProperties(prefix = "spring.datasource.mysql")
public DataSource mysqlDataSource(){
return DataSourceBuilder.create().build();
}
// @Primary(主資料來源配置)
@Bean(name = "sqlserver")
@Qualifier("sqlserver")
@ConfigurationProperties(prefix = "spring.datasource.sqlserver")
public DataSource sqlServerDataSource(){
return DataSourceBuilder.create().build();
}
}
注意:這裡是兩個資料來源,所以只需要指定一個主資料來源配置即可(指定方式:@Primary);
jdbcTemplate類:載入已配置好的資料來源
@Component
public class TemplateTest {
@Bean(name = "mysqlJdbcTemplate")
public JdbcTemplate primaryJdbcTemplate(@Qualifier("mysql") DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
@Bean(name = "sqlserverJdbcTemplate")
public JdbcTemplate secondaryJdbcTemplate(@Qualifier("sqlserver") DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
}
測試類:
@Autowired
@Qualifier("mysqlJdbcTemplate")
protected JdbcTemplate jdbcTemplate1;
@Autowired
@Qualifier("sqlserverJdbcTemplate")
protected JdbcTemplate jdbcTemplate2;
List<Map<String, Object>> queryForList = jdbcTemplate1.queryForList("select * from user");
List<Map<String, Object>> queryForList = jdbcTemplate2.queryForList("select * from test");
這裡的sql只有手動新增,再改測試中注意user表和test表中的資料量不要太大哦。
二、sqlsessionTemplate:mybatis
pom檔案和yml檔案的配置和一里面的一致;
java程式碼:
mysql資料來源類:
@Configuration
@MapperScan(basePackages = "com.xxx.dao.impl", sqlSessionFactoryRef = "mysqlSessionFactory")
public class MybatisMysqlConfig {
@Primary
@Bean(name = "mysql")
@ConfigurationProperties(prefix = "spring.mysql.datasource")
public DataSource mysqlDataSource() {
return DataSourceBuilder.create().build();
}
@Primary
@Bean(name = "mysqlTransactionManager")
public DataSourceTransactionManager transactionManager(@Qualifier("mysql") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Primary
@Bean(name = "mysqlSessionFactory")
public SqlSessionFactory sqlSessionFactory(@Qualifier("mysql") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
configuration.setMapUnderscoreToCamelCase(true);
bean.setConfiguration(configuration);
bean.setDataSource(dataSource);
ResourcePatternResolver rsourcePatternResolver = new PathMatchingResourcePatternResolver();
bean.setMapperLocations(rsourcePatternResolver.getResources("classpath*:com/xxx/fw/dao/*.xml"));
return bean.getObject();
}
@Primary
@Bean(name = "mysqlTemplate")
public SqlSessionTemplate sqlSessionTemplate(@Qualifier("mysqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
SqlSessionTemplate sqlSessionTemplate = new SqlSessionTemplate(sqlSessionFactory);
return sqlSessionTemplate;
}
}
sqlserver資料來源類:
@Configuration
@MapperScan(basePackages = "com.xxx.fw.dao.impl", sqlSessionFactoryRef = "sqlserverSessionFactory")
public class MybatisSqlServerConfig {
@Bean(name = "sqlserver")
@ConfigurationProperties(prefix = "spring.sqlserver.datasource")
public DataSource mysqlDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "sqlserverTransactionManager")
public DataSourceTransactionManager transactionManager(@Qualifier("sqlserver") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "sqlserverSessionFactory")
public SqlSessionFactory sqlSessionFactory(@Qualifier("sqlserver") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
configuration.setMapUnderscoreToCamelCase(true);
bean.setConfiguration(configuration);
bean.setDataSource(dataSource);
ResourcePatternResolver rsourcePatternResolver = new PathMatchingResourcePatternResolver();
bean.setMapperLocations(rsourcePatternResolver.getResources("classpath*:com/xxx/fw/dao/*.xml"));
return bean.getObject();
}
@Bean(name = "sqlserverTemplate")
public SqlSessionTemplate sqlSessionTemplate(@Qualifier("sqlserverSessionFactory") SqlSessionFactory sqlSessionFactory) {
SqlSessionTemplate sqlSessionTemplate = new SqlSessionTemplate(sqlSessionFactory);
return sqlSessionTemplate;
}
}
注意:這兩個類中的@MapperScan(basePackages = "com.xxx.fw.dao.impl", sqlSessionFactoryRef = "sqlserverSessionFactory"),特別重要,千萬別配置錯誤,尤其是basePackages的值,因為這裡是雙資料來源,所以需要一個對映實現類來獲取具體某個資料來源的sqlsessionTemplate類;
如:MysqlMapper介面對應MysqlMapperImpl實現類;
一般我們用mybatis直接用介面包路徑就行,但在這裡,為了選擇資料來源,多加了一個實現類,且必須在basePackages中配置實現類(不能配置介面類的包路徑),否則,只有一個數據源(主資料來源);
MysqlMapper介面及其實現類MysqlMapperImpl類:
public interface MysqlMapper {
Users getUser(Long id);
}
@Repository
public class MysqlMapperImpl implements MysqlMapper {
@Autowired
@Resource(name = "mysqlTemplate")
private SqlSessionTemplate sqlSessionTemplate;
@Override
public Users getUser(Long id) {
Users o = sqlSessionTemplate.selectOne("com.hhzx.fw.dao.MysqlMapper.getUser",id);
return o;
}
}
xml對映檔案:必須和介面類名稱相同(MysqlMapper.xml)
<?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.xxx.dao.MysqlMapper">
<resultMap id="Users" type="com.xxx.entity.Users"></resultMap>
<select id="getUser" parameterType="java.lang.Long" resultMap="Users">
SELECT * FROM USER WHERE id = #{id}
</select>
</mapper>
SqlServerMapper介面及其實現類SqlServerMapperImpl:
public interface SqlServerMapper {
UserCert getTest(Integer id);
}
@Repository
public class SqlServerMapperImpl implements SqlServerMapper {
@Autowired
@Resource(name = "sqlserverTemplate")
SqlSessionTemplate sqlSessionTemplate;
@Override
public UserCert getCert(Integer id) {
UserCert o = sqlSessionTemplate.selectOne("com.hhzx.fw.dao.UserCertMapper.getCert",
return o;
}
}
xml對映檔案:必須和介面類名稱相同(SqlServerMapper.xml)
<?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.xxx.dao.SqlServerMapper">
<resultMap id="Test" type="com.xxx.entity.Test">
</resultMap>
<select id="getCert" parameterType="java.lang.Integer" resultMap="Test">
SELECT * FROM test WHERE id = #{id}
</select>
</mapper>
entity實體類因為欄位和資料庫欄位相同,所以沒有在resultMap標籤裡面具體配置;
兩個實體類:Users、Test
public class Users implements Serializable {
private Long id;
private String name;
private String userName;
private Integer age;
private Double balance;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Double getBalance() {
return balance;
}
public void setBalance(Double balance) {
this.balance = balance;
}
}
public class Test implements Serializable {
private Long id;
private String name;
private Integer age;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
測試類:
@Autowired
MysqlMapper mysqlMapper;
@Autowired
SqlServerMapper sqlServerMapper;
@RequestMapping(value = "/getUser")
public Users getTowDataResource(){
Users user = mysqlMapper.getUser(1L);
return user;
}
@RequestMapping(value = "/getTest")
public Test getSqlServerData(){
return userCertMapper.getTest(1143242);
}
ok,到此,jdbc雙資料來源和mybatis雙資料來源都已搞定,如果按照上述步驟,及需要注意點,完成後,不出意外,一定能測試成功;
如果有更多的意見或疑問,請在下方留言,不要忘了點贊哦;
謝謝關注;
---------------------
作者:焱墩
來源:CSDN
原文:https://blog.csdn.net/yang1076180972/article/details/83507211
版權宣告:本文為博主原創文章,轉載請附上博文連結!