1. 程式人生 > >spring cloud 雙資料來源配置,兩種方式jdbc和mybatis(jdbcTemplate和 sqlsessionTemplate)及需要注意的問題

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
版權宣告:本文為博主原創文章,轉載請附上博文連結!