模拟多库场景
适用于多种场景: 多库(操作的表分布在不同数据库当中),读写分离(有的数据库负责查询的功能,有的数据库负责增删该的功能),一主多从,混合模式等
第一步: 模拟多库,在mybatis_plus数据库中创建user表,在mybatis_plus_1数据库中创建product表
--创建mybatis_plus数据库
CREATE DATABASE `mybatis_plus` /*!40100 DEFAULT CHARACTER SET utf8mb4 */;
use `mybatis_plus`;
--创建user表
CREATE TABLE `t_user` (
`id` bigint(20) NOT NULL COMMENT '主键ID',
`name` varchar(30) DEFAULT NULL COMMENT '姓名',
`age` int(11) DEFAULT NULL COMMENT '年龄',
`email` varchar(50) DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--向user表中插入数据
INSERT INTO t_user (id, name, age, email) VALUES
(1, 'Jone', 18, '[email protected]'),
(2, 'Jack', 20, '[email protected]'),
(3, 'Tom', 28, '[email protected]'),
(4, 'Sandy', 21, '[email protected]'),
(5, 'Billie', 24, '[email protected]');
--创建mybatis_plus_1数据库
CREATE DATABASE `mybatis_plus_1` /*!40100 DEFAULT CHARACTER SET utf8mb4 */;
use `mybatis_plus_1`;
--创建product表
CREATE TABLE t_product(
id BIGINT(20) NOT NULL COMMENT '主键ID',
name VARCHAR(30) NULL DEFAULT NULL COMMENT '商品名称',
price INT(11) DEFAULT 0 COMMENT '价格',
version INT(11) DEFAULT 0 COMMENT '乐观锁版本号',
PRIMARY KEY (id)
);
--向product表插入数据
INSERT INTO t_product (id, NAME, price) VALUES (1, '外星人笔记本', 100);
第二步:在pom.xml
文件中引入多数据源使用的依赖
<dependency>
<groupId>com.baomidougroupId>
<artifactId>dynamic-datasource-spring-boot-starterartifactId>
<version>3.5.0version>
dependency>
第三步: 在appilcation.yaml
文件中添加配置多数据源的配置选项
spring:
# 配置数据源信息
datasource:
dynamic:
# 设置默认的数据源或者数据源组,默认值即为master
primary: master
# 严格匹配数据源(默认false),true表示如果未匹配到指定数据源时抛异常,false表示如果未匹配到指定的数据源就使用默认的数据源
strict: false
datasource:
master: # 默认数据源
url: jdbc:mysql://localhost:3306/mybatis_plus?characterEncoding=utf-8&useSSL=false
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 123456
slave_1: # 其他数据源
url: jdbc:mysql://localhost:3306/mybatis_plus_1?characterEncoding=utf-8&useSSL=false
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 123456
第四步: 创建实体类封装表中查询的数据
//封装用户信息的实体类
@Data
@TableName("t_user")
public class User {
private Integer id;
private String name;
private Integer age;
private String email;
}
//封装产品信息的实体类
@Data
@TableName("t_product")
public class Product {
private Integer id;
private String name;
private Integer price;
private Integer version;
}
第五步: 编写User和Product对应的mapper接口和service接口
@Repository
public interface ProductMapper extends BaseMapper<Product> {
}
@Repository
public interface UserMapper extends BaseMapper<User> {
}
public interface UserService extends IService<User> {}
public interface ProductService extends IService<Product> {}
第六步: 创建User和Product实体类对应的service接口的实现类,使用@DS注解
指定当前类或方法要操作的数据源
注解 | 结果 |
---|---|
没有@DS注解 | 操作默认的数据源 |
@DS(“dsName”) | dsName为要操作的数据源名称 |
@Service
@DS("master") //t_user表在master数据源当中
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implementsUserService {
}
@Service
@DS("slave_1")//t_product表在slave_1数据源当中
public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> implements ProductService {
}
第七步: 编写Spring Boot主程序的启动类
@SpringBootApplication
@MapperScan("com.atguigu.mybatisplus.mapper")// 扫描mapper接口所在的包
public class MybatisPlusDatasourceApplication {
public static void main(String[] args) {
SpringApplication.run(MybatisPlusDatasourceApplication.class, args);
}
}
第八步: 由于t_user表和t_product在两个不同的数据库(数据源)中,如果通过一个测试方法可以分别获取到用户数据与商品数据成功说明多库模拟成功
@SpringBootTest
public class MybatisPlusDatasourceApplicationTests {
@Autowired
private UserService userService;
@Autowired
private ProductService productService;
@Test
public void testDynamicDataSource(){
// 输出查询出来的对象
System.out.println(userService.getById(1));
System.out.println(productService.getById(1));
}
}
模拟读写分离
实现读写分离的效果