您的位置:首页 > 编程语言 > Java开发

springboot整合多数据源(四)

2017-11-26 16:37 399 查看

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

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

spring.datasource.test2.driverClassName = com.mysql.jdbc.Driver
spring.datasource.test2.url =jdbc:mysql://localhost:3306/test2?useUnicode=true&characterEncoding=utf-8
spring.datasource.test2.username = root
spring.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.*"})
@EnableAutoConfiguration
public class App {

/**
* @param args
*/
//标识为启动类
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: