一个项目里面访问多个数据库的操作,记录如下:
(学习地址:https://www.majiaxueyuan.com/front/couinfo/36)
目录
1.application.properties文件配置
因为是访问多个数据库 所以需要多个数据库信息,在application.properties中去配置两个数据库访问的路径
我的如下:
spring.datasource.primary.jdbc-url=jdbc:mysql://localhost:3306/learnboot1?characterEncoding=utf-8
spring.datasource.primary.username=root
spring.datasource.primary.password=123456
spring.datasource.primary.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.secondary.jdbc-url=jdbc:mysql://localhost:3306/learnboot?characterEncoding=utf-8
spring.datasource.secondary.username=root
spring.datasource.secondary.password=123456
spring.datasource.secondary.driver-class-name=com.mysql.jdbc.Driver
这样的话会产生applicaion.properties配置文件就可以了
2.创建Configure
这个是去配置每个数据库的配置类
需要这四个方法:
public DataSource dataSource() {}
public SqlSessionFactory SqlSessionFactory(){}
public DataSourceTransactionManager dataSourceTransactionManager(){}
public SqlSessionTemplate sqlSessionTemplate(){}
/*
这四个方法的作用如下:
创建数据源Datasource指定使用的哪个数据源配置,并将其注入到SqlSessionFactory 会话工厂;
创建事务TransactionManager,需把数据源注入;
把SqlSessionFactory 注入,创建sqlSessionTemplate模板,使用模板操作mapper接口;
把模板放到mapper 路径下,并 @MapperScan注解 声明mapper接口位置;
*/
第一个DataSource()方法是用于去获取一个数据源,
第二个SqlSessionFactory()是将datasource放入到会话工厂
第三个是创建一个事务的管理,也是将datasource注入进去
第四个是个模版,去操作Mapper接口
我的configure类的编写具体如下:
1,创建类,并且需要将@configure注解和mapper扫描路径写进去
@Configuration //注解这个是一个Configure
//MapperScan mapper的扫描路径的配置
//basePackages mapper的扫描路径
//sqlSessionTemplateRef 需要套用的模版
@MapperScan(basePackages = "com.zqj.mutildatasource.mapper", sqlSessionTemplateRef = "primarySqlSessionTemplate")
public class PriamryDataSourceConfigure {
1.dataSource(){}
2.SqlSessoinFactory(){}
3.DataSourceTransactionManager(){}
4.SqlSessionTemplate(){}
}
接下来是去配置剩下的东西
2,创建dataSource方法,配置需要链接哪个数据库(我这里展示的是主库的配置类代码,还有一个库的配置代码和主库基本一致,除了没有@Primary注解 和 配置的名字不一致,方法都一样)
.....
public class PriamryDataSourceConfigure {
//主库
//datasource(){}
@Bean(name = "primaryDataSource") //配置属性为primaryDataSource
//这个是application.properties中配置的数据库属性的前缀,区分使用哪个数据源库
@ConfigurationProperties(prefix = "spring.datasource.primary")
@Primary //这个是设置为主库,必须有一个库是主库
public DataSource primaryDataSource() {
System.out.println("-------------------- primaryDataSource init ---------------------");
return DataSourceBuilder.create().build(); //返回生成好的数据库源
}
........
}
3,配置SqlSessionFactory的会话工厂
public class PriamryDataSourceConfigure{
//sqlSessoinFactory(){}
@Bean(name = "primarySqlSessionFactory") //设置属性,
@Primary //主库
public SqlSessionFactory primarySqlSessionFactory(@Qualifier("primaryDataSource") DataSource dataSource) throws Exception { //@Qualifier根据名字注入属性,放置刚刚创建的datasource
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);//放置刚刚创建的datasource
return bean.getObject(); 返回得到的SqlSessionFactory对象
}
}
4,配置事务的管理的一个方法
public class PriamryDataSourceConfigure {
//trascationManage(){}
@Bean(name = "primaryTrascationManager") //配置属性
@Primary //主库用的
public DataSourceTransactionManager primarydataSourceTransactionManager(@Qualifier("primaryDataSource") DataSource dataSource) throws Exception { //注入datasource
return new DataSourceTransactionManager(dataSource);
}
}
5,创建模版,用于操作mapper
//tempate(){}
@Bean(name = "primarySqlSessionTemplate")
@Primary
public SqlSessionTemplate primarysqlSessionTemplate(@Qualifier("primarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
SqlSessionTemplate sqlSessionTemplate = new SqlSessionTemplate(sqlSessionFactory);
return sqlSessionTemplate;
}
这个配置主库的连接的配置类就写好了,去扫描com.zqj.mutildatasource.mapper这个路径下的mapper接口。让mapper里的sql语句去访问
spring.datasource.primary.jdbc-url=jdbc:mysql://localhost:3306/learnboot1
这个learnboot1数据库里的表
主类配置的完整信息。
@Configuration
@MapperScan(basePackages = "com.zqj.mutildatasource.mapper", sqlSessionTemplateRef = "primarySqlSessionTemplate")
public class PriamryDataSourceConfigure {
//主库
@Bean(name = "primaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.primary")
@Primary
public DataSource primaryDataSource() {
System.out.println("-------------------- primaryDataSource init ---------------------");
return DataSourceBuilder.create().build();
}
@Bean(name = "primarySqlSessionFactory")
@Primary
public SqlSessionFactory primarySqlSessionFactory(@Qualifier("primaryDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
return bean.getObject();
}
@Bean(name = "primaryTrascationManager")
@Primary
public DataSourceTransactionManager primarydataSourceTransactionManager(@Qualifier("primaryDataSource") DataSource dataSource) throws Exception {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "primarySqlSessionTemplate")
@Primary
public SqlSessionTemplate primarysqlSessionTemplate(@Qualifier("primarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
SqlSessionTemplate sqlSessionTemplate = new SqlSessionTemplate(sqlSessionFactory);
return sqlSessionTemplate;
}
还有一个非主库的数据库,也要写一个一样的配置类,不过需要修改的是扫描的mapper包路径和连接的数据库地址。
完整类如下:
@Configuration
@MapperScan(basePackages = "com.zqj.mutildatasource.mapper1", sqlSessionTemplateRef = "secondarySqlSessionTemplate")
public class SecondaryDataSourceConfigure {
//非主库
@Bean("secondaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.secondary")
public DataSource secondaryDataSource() {
System.out.println("-------------------- secondaryDataSource init ---------------------");
return DataSourceBuilder.create().build();
}
@Bean(name = "secondarySqlSessionFactory")
public SqlSessionFactory secondarySqlSessionFactory(@Qualifier("secondaryDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
return bean.getObject();
}
@Bean(name = "secondaryTrascationManager")
public DataSourceTransactionManager secondarydataSourceTransactionManager(@Qualifier("secondaryDataSource") DataSource dataSource) throws Exception {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "secondarySqlSessionTemplate")
public SqlSessionTemplate secondarysqlSessionTemplate(@Qualifier("secondarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
SqlSessionTemplate sqlSessionTemplate = new SqlSessionTemplate(sqlSessionFactory);
return sqlSessionTemplate;
}
}
注意没有@Primary
3.创建mapper
这里因为我写了两个配置类,按理说就有两个mapper包
如下:
第一个mapper包是去访问主库的连接
第二个mapper包是去访问非主库的数据库的连接
然后创建mapper
(随便写一个访问数据库的方法)
比如我的:mapper包下Usermapper
@Mapper
@Component
public interface UserMapper {
@Select("select * from users where id = #{id}")
User findUserById(@Param("id") Integer id);
}
mapper对应的连接的数据库的表数据有:
mapper1包下的OrderMapper接口的方法:
@Mapper
public interface Ordermapper {
@Select("select * from orders where id = #{id}")
Order getOrderById(@Param("id") Integer id);
}
对应的数据库里的orders表数据有:
4.运行访问
创建一个Controller
去放加载两个mapper然后返回一个json串到页面
@RestController
public class UserController {
@Autowired
UserMapper userMapper;
@Autowired
Ordermapper ordermapper;
@RequestMapping("/user1") //访问user表的 主库
public Object getUser1() {
return userMapper.findUserById(1);
}
@RequestMapping("order2") //访问order表的 非主库
public Object getOrder() {
return ordermapper.getOrderById(1);
}
}
运行,访问
(可以看看大佬写的关于那几个属性的讲解:http://www.pianshen.com/article/3415102997/)
以上。