springboot整合多数据源(四)

来源:互联网 发布:lol末日人工智能投票 编辑:程序博客网 时间:2024/05/29 02:48

1配置文件中新增两个数据源

spring.datasource.test1.driverClassName = com.mysql.jdbc.Driverspring.datasource.test1.url = jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=utf-8spring.datasource.test1.username = rootspring.datasource.test1.password = rootspring.datasource.test2.driverClassName = com.mysql.jdbc.Driverspring.datasource.test2.url =jdbc:mysql://localhost:3306/test2?useUnicode=true&characterEncoding=utf-8spring.datasource.test2.username = rootspring.datasource.test2.password = root

 

2配置文件中新增两个数据源

package com.ljl.spring.boot.DataSource;import org.apache.ibatis.session.SqlSessionFactory;import org.mybatis.spring.SqlSessionFactoryBean;import org.mybatis.spring.SqlSessionTemplate;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.jdbc.datasource.DataSourceTransactionManager;import javax.sql.DataSource;@Configuration // 注入到spring容器中..@MapperScan(basePackages = "com.ljl.spring.boot.test1", sqlSessionFactoryRef =        "test1SqlSessionFactory")public class Datasource1 {    /**     * @methodDesc: 功能描述:(配置test1数据库)     */    @Bean(name = "test1DataSource")    @ConfigurationProperties(prefix = "spring.datasource.test1")    @Primary    public DataSource testDataSource() {        return DataSourceBuilder.create().build();    }    /**     * @methodDesc: 功能描述:(test1 sql会话工厂)     */    @Bean(name = "test1SqlSessionFactory")    @Primary    public SqlSessionFactory testSqlSessionFactory(@Qualifier("test1DataSource")                                                           DataSource dataSource)            throws Exception {        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();        bean.setDataSource(dataSource);        return bean.getObject();    }/** * 当存在多于1个数据源的时候,必须选择一个作为主数据源(Primary DataSource), * 即如果数据库操作没有指明使用哪个数据源的时候,默认使用主数据源。 * 同时,把数据源绑定到不同的JdbcTemplate上。 * 用@Primary把其中某一个Bean标识为“主要的”,使用@Autowired注入时会首先使用被标记为@Primary的Bean。 */    /**     * @methodDesc: 功能描述:(test1 事物管理)     */    @Bean(name = "test1TransactionManager")    @Primary    public DataSourceTransactionManager test1TransactionManager(@Qualifier("test1DataSource") DataSource dataSource) {        return new DataSourceTransactionManager(dataSource);    }    /**     * 使用@Autowired注释进行byType注入,如果需要byName(byName就是通过id去标识)注入,     * 增加@Qualifier注释。一般在候选Bean数目不为1时应该加@Qualifier注释。     * 在默认情况下使用 @Autowired 注释进行自动注入时,Spring 容器中匹配的候选 Bean 数目必须有且仅有一个。     * 当找不到一个匹配的 Bean 时,Spring 容器将抛出     * BeanCreationException 异常,并指出必须至少拥有一个匹配的 Bean。     * 和找不到一个类型匹配 Bean 相反的一个错误是:如果 Spring 容器中拥有多个候选 Bean,     * Spring 容器在启动时也会抛出 BeanCreationException 异常。     * Spring 允许我们通过 @Qualifier 注释指定注入 Bean 的名称,这样歧义就消除了,可以通过下面的方法解决异常:     *     * @param sqlSessionFactory     * @return     * @throws Exception     */    @Bean(name = "test1SqlSessionTemplate")    public SqlSessionTemplate testSqlSessionTemplate(            @Qualifier("test1SqlSessionFactory") SqlSessionFactory sqlSessionFactory)            throws Exception {        return new SqlSessionTemplate(sqlSessionFactory);    }}


package com.ljl.spring.boot.DataSource;import org.apache.ibatis.session.SqlSessionFactory;import org.mybatis.spring.SqlSessionFactoryBean;import org.mybatis.spring.SqlSessionTemplate;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.jdbc.datasource.DataSourceTransactionManager;import javax.sql.DataSource;@Configuration // 注入到spring容器中..@MapperScan(basePackages = "com.ljl.spring.boot.test2", sqlSessionFactoryRef =        "test2SqlSessionFactory")public class Datasource2 {    /**     * @methodDesc: 功能描述:(配置test2数据库)     */    @Bean(name = "test2DataSource")    @ConfigurationProperties(prefix = "spring.datasource.test2")    public DataSource testDataSource() {        return DataSourceBuilder.create().build();    }    /**     * @methodDesc: 功能描述:(test2 sql会话工厂)     */    @Bean(name = "test2SqlSessionFactory")    public SqlSessionFactory testSqlSessionFactory(@Qualifier("test2DataSource")                                                           DataSource dataSource)            throws Exception {        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();        bean.setDataSource(dataSource);        return bean.getObject();    }    /**     * @methodDesc: 功能描述:(test2 事物管理)     */    @Bean(name = "test2TransactionManager")    public DataSourceTransactionManager    testTransactionManager(@Qualifier("test2DataSource") DataSource dataSource) {        return new DataSourceTransactionManager(dataSource);    }    @Bean(name = "test2SqlSessionTemplate")    public SqlSessionTemplate testSqlSessionTemplate(            @Qualifier("test2SqlSessionFactory") SqlSessionFactory sqlSessionFactory)            throws Exception {        return new SqlSessionTemplate(sqlSessionFactory);    }}



4.4.2创建分包Mapper

分别放在com.ljl.spring.boot.test1包和com.ljl.spring.boot.test2包中

package com.ljl.spring.boot.test1.mappins;import com.ljl.spring.boot.test1.entity.User1Entity;import org.apache.ibatis.annotations.Insert;import org.apache.ibatis.annotations.Param;import org.apache.ibatis.annotations.Select;import org.springframework.cache.annotation.CacheConfig;import org.springframework.cache.annotation.Cacheable;public interface User1Mappin {   @Insert("insert into users values(null,#{name},#{age});")   public int addUser(@Param("name") String name, @Param("age") Integer age);   @Select(" select * from users where id = #{id} ")   public User1Entity selectUser(@Param("id") Integer id);}


package com.ljl.spring.boot.test2.mappins;import org.apache.ibatis.annotations.Insert;import org.apache.ibatis.annotations.Param;public interface User2Mappin {   @Insert("insert into users values(null,#{name},#{age});")   public int addUser(@Param("name") String name, @Param("age") Integer age);}

4.4.3启动项目

/** * */package com.ljl.spring.boot;import com.ljl.spring.boot.config.DBConfig1;import com.ljl.spring.boot.config.DBConfig2;import org.mybatis.spring.annotation.MapperScan;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.EnableAutoConfiguration;import org.springframework.boot.context.properties.EnableConfigurationProperties;import org.springframework.context.annotation.ComponentScan;import org.springframework.transaction.annotation.EnableTransactionManagement;/** * @author dell */@MapperScan("com.ljl.*")//扫描:该包下相应的class,主要是MyBatis的持久化类.//@EnableTransactionManagement@ComponentScan(basePackages = {"com.ljl.*"})@EnableAutoConfigurationpublic class App {    /**     * @param args     */    //标识为启动类    public static void main(String[] args) {        SpringApplication.run(App.class, args);    }}