数据库组件 (DAO)
API文档
https://tech.rydeen.com.cn/apidocs/dao/4.6.0/index.html
组件作用
本插件是对mybatis plus的封装,简化了使用门槛,实现了以下功能:
- 分页插件
- 雪花算法id生成器
- 动态数据源
- 租户隔离插件
- p6spy SQL日志打印
- 国际化
组件使用
分页插件
默认开启分页,默认数据类型为MySQL,如果需要指定别的类型的,则在yaml文件中配置platform.component.dao.dbType=oracle,具体枚举值详见com.baomidou.mybatisplus.annotation.DbType类。
支持的数据库有: mysql,oracle,db2,h2,hsql,sqlite,postgresql,sqlserver,Phoenix,Gauss ,clickhouse,Sybase,OceanBase,Firebird,cubrid,goldilocks,csiidb,informix,TDengine,redshift, 达梦数据库,虚谷数据库,人大金仓数据库,南大通用(华库)数据库,南大通用数据库,神通数据库,瀚高数据库,优炫数据库,星瑞格数据库
- 第一步编写查询方法,继承com.baomidou.mybatisplus.core.mapper.BaseMapper类
在 Mapper 接口中定义查询方法,使用 MyBatis Plus 提供的 Page 类进行分页查询。例如:
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import java.util.List;
@Mapper
public interface YourMapper extends BaseMapper<YourEntity> {
List<YourEntity> selectPageVo(Page<YourEntity> page);
}
- 在 Service 层调用分页方法
在 Service 层调用 Mapper 中的分页方法,传递分页参数即可。例如:
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class YourService {
@Autowired
private YourMapper yourMapper;
public List<YourEntity> getPageData(int current, int size) {
Page<YourEntity> page = new Page<>(current, size);
return yourMapper.selectPage(page).getRecords();
}
}
在上述例子中,current 表示当前页,size 表示每页显示的记录数。
雪花算法snowflake
-
基于Seata基于改良版雪花算法的分布式UUID生成器,需要依赖Redis中间件,详见https://seata.apache.org/zh-cn/blog/seata-analysis-UUID-generator/
- 方法一:手动获取
spring @Autowired注解注入
@Autowiredprivate IdBuilder idBuilder;或者使用构造参数
@RestController@RequestMapping("/test")@RequiredArgsConstructorpublic class TestController {private final IdBuilder idBuilder;}获取雪花ID
String id = idBuilder.nextId();- 方法二:使用MybatisPlus注解自动注入domain
本组件实现了MybatisPlusPropertiesCustomizer,替换掉默认的雪花算法实现,只需要在domain对象上添加MybatisPlus注解即可实现该雪花算法
/*** 主键*/@TableId(value = "id", type = IdType.ASSIGN_ID)private Long id;
多数据源
MyBatis-Plus Dynamic DataSource(dynamic-datasource)是 MyBatis-Plus 针对多数据源场景提供的一个扩展库。它可以让你更方便地在项目中管理多个数据源,并在运行时动态切换数据源。
- 配置多数据源: 在 application.yml(或 application.properties)中配置多个数据源。
spring:
datasource:
dynamic:
primary: dataSource1
datasource:
dataSource1:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/db1
username: root
password: root
dataSource2:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/db2
username: root
password: root
- 使用 @DS 注解切换数据源
import com.baomidou.dynamic.datasource.annotation.DS;
import org.springframework.stereotype.Service;
@Service
public class YourService {
@DS("dataSource1") // 指定数据源
public List<Entity> queryFromDataSource1() {
return yourMapper.selectList(null);
}
@DS("dataSource2")
public List<Entity> queryFromDataSource2() {
return yourMapper.selectList(null);
}
}
租户隔离
MyBatis-Plus 提供了租户隔离插件(TenantLineHandler),用于在多租户环境中进行数据隔离。多租户是一种架构模式,其中单个应用程序实例服务多个租户,而且租户的数据是相互隔离的。
添加依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot3-starter</artifactId>
</dependency>
配置忽略的表名
spring:
datasource:
tenant:
ignoreTenantTables: ['test_tenant','test_tenant2']
spring.datasource.dynamic.tenant为租户隔离插件配置,因为大部分表都是需要租户隔离的,所以ignoreTenantTables配置的是忽略租户隔离的表名。
数据库表字段名为tenant_code,如需自定义则配置
spring:
datasource:
tenant:
tenantIdColumn: 'custom_id'
多租户多数据源
通过实现DynamicDataSourceProvider类来提供动态数据源,将数据源信息存储在数据库中,通过动态数据源插件,可以动态切换数据源。
- 建表语句
create table tenant_datasource(
id bigint unsigned not null primary key,
service_name varchar(255) default '' not null comment '服务名',
ds_name varchar(255) default '' not null comment '多数据源名',
tenant_codes text null comment '租户编码,逗号分隔',
db_username varchar(255) default '' not null comment '数据库用户名',
db_password varchar(500) default '' not null comment '数据库密码',
db_param varchar(255) default '' not null comment '数据库名称',
create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间',
update_time datetime default CURRENT_TIMESTAMP not null comment '修改时间'
)
这个表结构描述了服务名、多数据源名、租户编码、数据库用户名、数据库密码、数据库名称等信息,其中租户编码为逗号分隔的字符串。 服务和数据源是1:N的关系,即一个服务可以有多个数据源,一个数据源可以有多个租户。 但是租户只会有一个数据源。
- 使用方法:在spring boot yml中配置
spring:
datasource:
dynamic:
datasource:
master:
type: com.zaxxer.hikari.HikariDataSource
url: jdbc:mysql://localhost:3306/oppo_common?allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=utf8&useSSL=false&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&autoReconnect=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B7
username: root
password: '123456'
hikari:
minimum-idle: 10
maximum-pool-size: 100
idle-timeout: 30000
max-lifetime: 1800000
connection-timeout: 30000
connection-test-query: SELECT 1
validation-timeout: 3000
tenant:
dbUrlTemplate: jdbc:mysql://%s?useUnicode=true&characterEncoding=utf8&useSSL=false&
其中spring.datasource.dynamic.datasource.master配置为数据源配置,配置的是上文所述的tenant_datasource表的数据源配置,请确保能读取到该表。 现在只需要配置这个一个数据源,别的数据源都需要维护到tenant_datasource表中,这样启动时会读取所有的数据源,然后动态创建数据源。 spring.datasource.dynamic.dbUrlTemplate为数据库连接url模板,可以在里面自定义jdbc参数配置。
p6spy SQL日志打印
spring:
datasource:
tenant:
enableLogging: true
开启p6spy SQL日志打印
国际化
使用
@Data
@Accessors(chain = true)
@TableName(autoResultMap = true)
public class User {
private Long id;
/**
* 注意!! 必须开启映射注解
*
* @TableName(autoResultMap = true)
*
* 以下两种类型处理器,二选一 也可以同时存在
*
* 注意!!选择对应的 JSON 处理器也必须存在对应 JSON 解析依赖包
*/
@TableField(typeHandler = I18nTypeHandler.class)
private String otherInfo;
}