组件地址
<dependency>
<groupId>org.opengoofy.index12306</groupId>
<artifactId>index12306-database-spring-boot-starter</artifactId>
<version>${project.version}</version>
</dependency>
组件功能
通用分页组件
package org.opengoofy.index12306.framework.starter.database.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.opengoofy.index12306.framework.starter.database.handler.CustomIdGenerator;
import org.opengoofy.index12306.framework.starter.database.handler.MyMetaObjectHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;
/**
* MybatisPlus 配置文件
*
*/
public class MybatisPlusAutoConfiguration {
/**
* 分页插件
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
实体基础属性
package org.opengoofy.index12306.framework.starter.database.base;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
import java.util.Date;
/**
* 数据持久层基础属性
*
*/
@Data
public class BaseDO {
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private Date createTime;
/**
* 修改时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
/**
* 删除标志
*/
@TableField(fill = FieldFill.INSERT)
private Integer delFlag;
}
元数据处理器
package org.opengoofy.index12306.framework.starter.database.handler;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.opengoofy.index12306.framework.starter.common.enums.DelEnum;
import java.util.Date;
/**
* 元数据处理器
*
*/
public class MyMetaObjectHandler implements MetaObjectHandler {
/**
* 数据新增时填充
*
* @param metaObject
*/
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createTime", Date.class, new Date());
this.strictInsertFill(metaObject, "updateTime", Date.class, new Date());
this.strictInsertFill(metaObject, "delFlag", Integer.class, DelEnum.NORMAL.code());
}
/**
* 数据修改时填充
*
* @param metaObject
*/
@Override
public void updateFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "updateTime", Date.class, new Date());
}
}
分页转换器(详见规约组件)
自定义雪花算法
如何生成分布式雪花算法ID
分布式系统中,有一些需要使用全局唯一 ID 的场景,这种时候为了防止 ID 冲突可以使用 36 位的 UUID,但是 UUID 有一些缺点,首先他相对比较长,另外 UUID 一般是无序的
有些时候我们希望能使用一种简单些的 ID,并且希望 ID 能够按照时间有序生成
雪花算法含义
雪花算法组成
雪花算法适用场景
因为雪花算法有序自增,保障了 MySQL 中 B+ Tree 索引结构插入高性能。
所以,日常业务使用中,雪花算法更多是被应用在数据库的主键 ID 和业务关联主键。
雪花算法生成ID重复问题
标识位如何定义
分配标识位
实操自定义雪花算法
package org.opengoofy.index12306.framework.starter.database.handler;
import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator;
import org.opengoofy.index12306.framework.starter.distributedid.toolkit.SnowflakeIdUtil;
/**
* 自定义雪花算法生成器
*
*/
public class CustomIdGenerator implements IdentifierGenerator {
@Override
public Number nextId(Object entity) {
return SnowflakeIdUtil.nextId();
}
}
配置类中声明 @Primary 上述雪花算法生成器是主要的,不再使用默认的雪花 ID 生成器
package org.opengoofy.index12306.framework.starter.database.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.opengoofy.index12306.framework.starter.database.handler.CustomIdGenerator;
import org.opengoofy.index12306.framework.starter.database.handler.MyMetaObjectHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;
/**
* MybatisPlus 配置文件
*
*/
public class MybatisPlusAutoConfiguration {
/**
* 自定义雪花算法 ID 生成器
*/
@Bean
@Primary
public IdentifierGenerator idGenerator() {
return new CustomIdGenerator();
}
}