首先,我们新建一个数据库`guns_test`,并分别在`guns`数据库和`guns_test`数据库中分别新增同样结构的两个表`test`,sql文件如下,也可以在`src/test/sql`下找到这个sql文件
```
DROP DATABASE IF EXISTS guns_test;
CREATE DATABASE IF NOT EXISTS guns_test DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
use guns_test;
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for test
-- ----------------------------
DROP TABLE IF EXISTS `test`;
CREATE TABLE `test` (
`aaa` int(11) NOT NULL AUTO_INCREMENT,
`bbb` varchar(255) DEFAULT NULL,
PRIMARY KEY (`aaa`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
SET FOREIGN_KEY_CHECKS = 1;
```
> 1.对表进行代码生成,方便测试两个数据源
![image_1c4mosmth1fp4dv81ai6nbll8u1g.png-92.7kB](https://img-blog.csdnimg.cn/20181228174637358)
> 2.打开application.yml中的多数据源开关
![image_1ci8k9e4l1kmtjmsh4a12rb10q39.png-87.8kB](https://img-blog.csdnimg.cn/20181228174637413)
> 3.配置application.yml中的多数据源的连接信息
![image_1ci8kbvun1m7b1t0g1g7r1k7u1f58m.png-92.2kB](https://img-blog.csdnimg.cn/20181228174637460)
**另外注意,如果想开启多数据源,需要关闭kernel-core中mybatis-plus中的自动配置!!重要!!如下!!**
![image_1cpuhger9l1722v1afo8ab1vns1g.png-81.1kB](https://img-blog.csdnimg.cn/20181228174637499)
> 4.编写测试多数据源的代码,注意观察`@DataSource注解`,这些代码都可以在`cn.stylefeng.guns.multi`包中找到
```
package cn.stylefeng.guns.multi.service;
/**
* <p>
* 服务类
* </p>
*
* @author fengshuonan
* @since 2018-07-10
*/
public interface TestService {
/**
* 测试多数据源的业务
*
* @author stylefeng
* @Date 2017/6/23 23:02
*/
void testBiz();
/**
* 测试多数据源的业务
*
* @author stylefeng
* @Date 2017/6/23 23:02
*/
void testGuns();
}
```
```
package cn.stylefeng.guns.multi.service.impl;
import cn.stylefeng.guns.core.common.constant.DatasourceEnum;
import cn.stylefeng.guns.multi.entity.Test;
import cn.stylefeng.guns.multi.mapper.TestMapper;
import cn.stylefeng.guns.multi.service.TestService;
import cn.stylefeng.roses.core.mutidatasource.annotion.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
* <p>
* 服务实现类
* </p>
*
* @author fengshuonan
* @since 2018-07-10
*/
@Service
public class TestServiceImpl implements TestService {
@Autowired
private TestMapper testMapper;
@Override
@DataSource(name = DatasourceEnum.DATA_SOURCE_BIZ)
@Transactional
public void testBiz() {
Test test = new Test();
test.setBbb("bizTest");
testMapper.insert(test);
}
@Override
@DataSource(name = DatasourceEnum.DATA_SOURCE_GUNS)`
@Transactional
public void testGuns() {
Test test = new Test();
test.setBbb("gunsTest");
testMapper.insert(test);
}
}
```
```
package cn.stylefeng.guns.multi.test;
import cn.stylefeng.guns.base.BaseJunit;
import cn.stylefeng.guns.multi.service.TestService;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
/**
* 业务测试
*
* @author fengshuonan
* @date 2017-06-23 23:12
*/
public class BizTest extends BaseJunit {
@Autowired
TestService testService;
@Test
public void test() {
testService.testGuns();
testService.testBiz();
}
}
```
> 5.执行`BizTest`这个测试类,可以看出,两条数据同时插入了不同的数据库中的两张表中
![image_1ci8kfj001dr91gg01l721g781l5f13.png-18.7kB](https://img-blog.csdnimg.cn/20181228174637539)
![image_1ci8kg1fo18671fafp4q1k5e186u1g.png-26kB](https://img-blog.csdnimg.cn/20181228174637578)
多数据源的原理就是一个项目同时配置了两个`DataSource`,并把这两个`DataSource`放到`DynamicDataSource`绑定,使用AOP进行动态切换当前操作的数据源。
**若想深入了解多数据源的配置和原理可参考`MybatisPlusConfig类`和`MultiSourceExAop类`,也可参考视频教程第`7节 多数据源配置和使用`,内有详细的讲解**
- Guns 技术文档 v5.1
- 1. 序言
- 1.1 文档简介
- 1.2 Guns教程
- 1.3 获取帮助
- 2. 使用手册
- 2.1 下载项目
- 2.2 导入项目
- 2.2.1 eclipse导入
- 2.2.2 IDEA导入
- 2.3 运行项目
- 2.4 打包部署
- 3. 开发手册
- 3.1 了解Guns
- 3.1.1 模块结构
- 3.1.2 包结构说明
- 3.2 实战开发
- 3.2.1 建表
- 3.2.2 代码生成
- 3.3.3 添加菜单与分配权限
- 3.3.4 编写业务代码
- 3.3 权限控制与校验
- 3.3.1 用户,角色和资源
- 3.3.2 如何对资源进行权限控制
- 3.3.3 前端页面对权限资源的显示
- 3.4 多数据源的使用
- 3.5 如何分页
- 3.5.1 简单查询的分页
- 3.5.2 复杂查询的分页
- 3.5.3 获取前端表格插件传值
- 3.6 数据范围
- 3.6.1 介绍
- 3.6.2 如何使用
- 3.6.3 原理
- 3.7 guns-rest模块的使用
- 3.7.1 关于jwt鉴权
- 3.7.2 关于传输数据的签名
- 3.7.3 guns-rest模块的运行流程
- 3.7.4 运行原理
- 3.8 工作流
- 3.9 日志记录
- 3.9.1 业务日志
- 3.9.2 异常日志
- 3.10 如何使用缓存
- 3.10.1 用工具类操作
- 3.10.2 用spring cache操作缓存
- 3.11 使用枚举
- 3.12 spring boot热部署
- 3.12.1 重新加载html
- 3.12.2 重新加载java类
- 4. 扩展与高级配置
- 4.1 修改项目名和包名
- 4.1.1 修改项目名
- 4.1.2 修改包名
- 4.2 放过接口权限验证
- 4.3 静态资源和模板位置的变更
- 4.4 三个或更多数据源如何配置
- 4.5 添加登录验证码
- 4.6 spring profile
- 4.7 多机器部署开启spring session
- 4.8 使用Redis
- 4.9 XSS过滤器
- 4.9.1 介绍
- 4.9.2 原理
- 4.9.3 放过过滤
- 5. 核心思想
- 5.1 分包
- 5.2 统一异常拦截
- 5.2.1 介绍
- 5.2.2 优点
- 5.2.3 关于性能
- 5.3 结果包装器
- 5.3.1 如何使用
- 5.3.2 ConstantFactory
- 5.4 前端思想
- 5.4.1 布局
- 5.4.2 标签
- 5.4.3 手动新增标签页
- 6. 常见问题答疑
- 6.1 默认的系统登录账号和密码是多少
- 6.2 权限异常
- 6.3 为何分页是前端实现
- 6.4 关于${ctxPath}
- 6.5 放过某些url的权限验证
- 6.6 主页的搜索功能
- 6.7 运行sql报错
- 6.8 关于打包
- 6.9 查询结果的驼峰转化问题
- 6.10 为何使用beetl
- 6.11 为何有的业务没有service层
- 6.12 为何既有dao,又有mapper
- 6.13 提示@spring.active@错误