Skip to main content

数据库组件 (DAO)

API文档​

https://tech.rydeen.com.cn/apidocs/dao/4.6.0/index.html

组件作用​

本插件是对mybatis plus的封装,简化了使用门槛,实现了以下功能:

  1. 分页插件
  2. 雪花算法id生成器
  3. 动态数据源
  4. 租户隔离插件
  5. p6spy SQL日志打印
  6. 国际化

组件使用​

分页插件​

默认开启分页,默认数据类型为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, 达梦数据库,虚谷数据库,人大金仓数据库,南大通用(华库)数据库,南大通用数据库,神通数据库,瀚高数据库,优炫数据库,星瑞格数据库

  1. 第一步编写查询方法,继承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);
}
  1. 在 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​

  1. 基于Seata基于改良版雪花算法的分布式UUID生成器,需要依赖Redis中间件,详见https://seata.apache.org/zh-cn/blog/seata-analysis-UUID-generator/

    • 方法一:手动获取

    spring @Autowired注解注入

    @Autowired
    private IdBuilder idBuilder;

    或者使用构造参数

    @RestController
    @RequestMapping("/test")
    @RequiredArgsConstructor
    public 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 针对多数据源场景提供的一个扩展库。它可以让你更方便地在项目中管理多个数据源,并在运行时动态切换数据源。

  1. 配置多数据源: 在 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

  1. 使用 @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;

}