分布式ID选型对比(2)

数据库号段模式

一, 引入依赖:

java 复制代码
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.19</version>
</dependency>
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.2.2</version>
</dependency>

二, 新建表

java 复制代码
CREATE TABLE `id_generator` (
  `id` int NOT NULL,
  `max_id` bigint NOT NULL COMMENT '当前最大id',
  `step` int NOT NULL COMMENT '号段的布长',
  `biz_type` int NOT NULL COMMENT '业务类型',
  `version` int NOT NULL COMMENT '版本号',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

三, resources目录下编写自动生成代码配置文件: generatorConfig.xml

java 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>
    <!--mysql 连接数据库jar 这里选择自己本地位置;
    如果不知道maven本地仓库地址,可以使用EveryThing工具全局搜索mysql-connector-java,找到jar包位置;
    也可以手动下载一个jar放在指定位置,进行引用。
    -->
    <classPathEntry location="/Users/lizhihao/.m2/repository/mysql/mysql-connector-java/8.0.19/mysql-connector-java-8.0.19.jar"/>

    <context id="testTables" targetRuntime="MyBatis3">
        <commentGenerator>
            <!-- 是否去除自动生成的注释,true:是,false:否 -->
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>

        <!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/generate_id" userId="root"
                        password="root">
        </jdbcConnection>

        <!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和
           NUMERIC 类型解析为java.math.BigDecimal -->
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>

        <!-- 指定javaBean生成的位置
            targetPackage:生成的类要放的包,真实的包受enableSubPackages属性控制;
            targetProject:目标项目,指定一个存在的目录下,生成的内容会放到指定目录中,如果目录不存在,MBG不会自动建目录
         -->
        <javaModelGenerator targetPackage="org.com.spi.model" targetProject="src/main/java">
            <!-- 在targetPackage的基础上,根据数据库的schema再生成一层package,最终生成的类放在这个package下,默认为false;如果多个数据库改为true分目录 -->
            <property name="enableSubPackages" value="false"/>
            <!-- 设置是否在getter方法中,对String类型字段调用trim()方法 -->
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>

        <!--  指定mapper映射文件生成的位置
           targetPackage、targetProject同javaModelGenerator中作用一样-->
        <sqlMapGenerator targetPackage="mybatis" targetProject="src/main/resources">
            <property name="enableSubPackages" value="false"/>
        </sqlMapGenerator>

        <!-- 指定mapper接口生成的位置
         targetPackage、targetProject同javaModelGenerator中作用一样
         -->
        <javaClientGenerator type="XMLMAPPER" targetPackage="org.com.spi.dao" targetProject="src/main/java">
            <property name="enableSubPackages" value="false"/>
        </javaClientGenerator>
        <!-- 指定数据库表
        domainObjectName:生成的domain类的名字,当表名和domain类的名字有差异时一定要设置,如果不设置,直接使用表名作为domain类的名字;
        可以设置为somepck.domainName,那么会自动把domainName类再放到somepck包里面;
        -->
        <table tableName="worker_node"></table>
<!--        <table tableName="auto_generate2" domainObjectName="AutoGenerate2"></table>-->
    </context>
</generatorConfiguration>

application.properties数据库配置:

java 复制代码
#   ???url
spring.datasource.url=jdbc:mysql://localhost:3306/generate_id?characterEncoding=utf8&serverTimezone=UTC    
#  ??????
spring.datasource.username=root
#  ?????
spring.datasource.password=root
#  ?????
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
###################################### MyBatis ??######################################
# ?? mapper.xml ???
mybatis.mapper-locations=classpath:mybatis/*.xml
#????????,?????????????? mapper.xml ??????????????
mybatis.type-aliases-package=net.biancheng.www.bean
#???????????????????
mybatis.configuration.map-underscore-to-camel-case=true

四, 编写层级代码

1, 对象 IdGenerator

java 复制代码
package org.com.spi.model;

public class IdGenerator {
    private Integer id;

    private Long maxId;

    private Integer step;

    private Integer bizType;

    private Integer version;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Long getMaxId() {
        return maxId;
    }

    public void setMaxId(Long maxId) {
        this.maxId = maxId;
    }

    public Integer getStep() {
        return step;
    }

    public void setStep(Integer step) {
        this.step = step;
    }

    public Integer getBizType() {
        return bizType;
    }

    public void setBizType(Integer bizType) {
        this.bizType = bizType;
    }

    public Integer getVersion() {
        return version;
    }

    public void setVersion(Integer version) {
        this.version = version;
    }
}

IdGeneratorExample:

java 复制代码
package org.com.spi.model;

import java.util.ArrayList;
import java.util.List;

public class IdGeneratorExample {
    protected String orderByClause;

    protected boolean distinct;

    protected List<Criteria> oredCriteria;

    public IdGeneratorExample() {
        oredCriteria = new ArrayList<Criteria>();
    }

    public void setOrderByClause(String orderByClause) {
        this.orderByClause = orderByClause;
    }

    public String getOrderByClause() {
        return orderByClause;
    }

    public void setDistinct(boolean distinct) {
        this.distinct = distinct;
    }

    public boolean isDistinct() {
        return distinct;
    }

    public List<Criteria> getOredCriteria() {
        return oredCriteria;
    }

    public void or(Criteria criteria) {
        oredCriteria.add(criteria);
    }

    public Criteria or() {
        Criteria criteria = createCriteriaInternal();
        oredCriteria.add(criteria);
        return criteria;
    }

    public Criteria createCriteria() {
        Criteria criteria = createCriteriaInternal();
        if (oredCriteria.size() == 0) {
            oredCriteria.add(criteria);
        }
        return criteria;
    }

    protected Criteria createCriteriaInternal() {
        Criteria criteria = new Criteria();
        return criteria;
    }

    public void clear() {
        oredCriteria.clear();
        orderByClause = null;
        distinct = false;
    }

    protected abstract static class GeneratedCriteria {
        protected List<Criterion> criteria;

        protected GeneratedCriteria() {
            super();
            criteria = new ArrayList<Criterion>();
        }

        public boolean isValid() {
            return criteria.size() > 0;
        }

        public List<Criterion> getAllCriteria() {
            return criteria;
        }

        public List<Criterion> getCriteria() {
            return criteria;
        }

        protected void addCriterion(String condition) {
            if (condition == null) {
                throw new RuntimeException("Value for condition cannot be null");
            }
            criteria.add(new Criterion(condition));
        }

        protected void addCriterion(String condition, Object value, String property) {
            if (value == null) {
                throw new RuntimeException("Value for " + property + " cannot be null");
            }
            criteria.add(new Criterion(condition, value));
        }

        protected void addCriterion(String condition, Object value1, Object value2, String property) {
            if (value1 == null || value2 == null) {
                throw new RuntimeException("Between values for " + property + " cannot be null");
            }
            criteria.add(new Criterion(condition, value1, value2));
        }

        public Criteria andIdIsNull() {
            addCriterion("id is null");
            return (Criteria) this;
        }

        public Criteria andIdIsNotNull() {
            addCriterion("id is not null");
            return (Criteria) this;
        }

        public Criteria andIdEqualTo(Integer value) {
            addCriterion("id =", value, "id");
            return (Criteria) this;
        }

        public Criteria andIdNotEqualTo(Integer value) {
            addCriterion("id <>", value, "id");
            return (Criteria) this;
        }

        public Criteria andIdGreaterThan(Integer value) {
            addCriterion("id >", value, "id");
            return (Criteria) this;
        }

        public Criteria andIdGreaterThanOrEqualTo(Integer value) {
            addCriterion("id >=", value, "id");
            return (Criteria) this;
        }

        public Criteria andIdLessThan(Integer value) {
            addCriterion("id <", value, "id");
            return (Criteria) this;
        }

        public Criteria andIdLessThanOrEqualTo(Integer value) {
            addCriterion("id <=", value, "id");
            return (Criteria) this;
        }

        public Criteria andIdIn(List<Integer> values) {
            addCriterion("id in", values, "id");
            return (Criteria) this;
        }

        public Criteria andIdNotIn(List<Integer> values) {
            addCriterion("id not in", values, "id");
            return (Criteria) this;
        }

        public Criteria andIdBetween(Integer value1, Integer value2) {
            addCriterion("id between", value1, value2, "id");
            return (Criteria) this;
        }

        public Criteria andIdNotBetween(Integer value1, Integer value2) {
            addCriterion("id not between", value1, value2, "id");
            return (Criteria) this;
        }

        public Criteria andMaxIdIsNull() {
            addCriterion("max_id is null");
            return (Criteria) this;
        }

        public Criteria andMaxIdIsNotNull() {
            addCriterion("max_id is not null");
            return (Criteria) this;
        }

        public Criteria andMaxIdEqualTo(Long value) {
            addCriterion("max_id =", value, "maxId");
            return (Criteria) this;
        }

        public Criteria andMaxIdNotEqualTo(Long value) {
            addCriterion("max_id <>", value, "maxId");
            return (Criteria) this;
        }

        public Criteria andMaxIdGreaterThan(Long value) {
            addCriterion("max_id >", value, "maxId");
            return (Criteria) this;
        }

        public Criteria andMaxIdGreaterThanOrEqualTo(Long value) {
            addCriterion("max_id >=", value, "maxId");
            return (Criteria) this;
        }

        public Criteria andMaxIdLessThan(Long value) {
            addCriterion("max_id <", value, "maxId");
            return (Criteria) this;
        }

        public Criteria andMaxIdLessThanOrEqualTo(Long value) {
            addCriterion("max_id <=", value, "maxId");
            return (Criteria) this;
        }

        public Criteria andMaxIdIn(List<Long> values) {
            addCriterion("max_id in", values, "maxId");
            return (Criteria) this;
        }

        public Criteria andMaxIdNotIn(List<Long> values) {
            addCriterion("max_id not in", values, "maxId");
            return (Criteria) this;
        }

        public Criteria andMaxIdBetween(Long value1, Long value2) {
            addCriterion("max_id between", value1, value2, "maxId");
            return (Criteria) this;
        }

        public Criteria andMaxIdNotBetween(Long value1, Long value2) {
            addCriterion("max_id not between", value1, value2, "maxId");
            return (Criteria) this;
        }

        public Criteria andStepIsNull() {
            addCriterion("step is null");
            return (Criteria) this;
        }

        public Criteria andStepIsNotNull() {
            addCriterion("step is not null");
            return (Criteria) this;
        }

        public Criteria andStepEqualTo(Integer value) {
            addCriterion("step =", value, "step");
            return (Criteria) this;
        }

        public Criteria andStepNotEqualTo(Integer value) {
            addCriterion("step <>", value, "step");
            return (Criteria) this;
        }

        public Criteria andStepGreaterThan(Integer value) {
            addCriterion("step >", value, "step");
            return (Criteria) this;
        }

        public Criteria andStepGreaterThanOrEqualTo(Integer value) {
            addCriterion("step >=", value, "step");
            return (Criteria) this;
        }

        public Criteria andStepLessThan(Integer value) {
            addCriterion("step <", value, "step");
            return (Criteria) this;
        }

        public Criteria andStepLessThanOrEqualTo(Integer value) {
            addCriterion("step <=", value, "step");
            return (Criteria) this;
        }

        public Criteria andStepIn(List<Integer> values) {
            addCriterion("step in", values, "step");
            return (Criteria) this;
        }

        public Criteria andStepNotIn(List<Integer> values) {
            addCriterion("step not in", values, "step");
            return (Criteria) this;
        }

        public Criteria andStepBetween(Integer value1, Integer value2) {
            addCriterion("step between", value1, value2, "step");
            return (Criteria) this;
        }

        public Criteria andStepNotBetween(Integer value1, Integer value2) {
            addCriterion("step not between", value1, value2, "step");
            return (Criteria) this;
        }

        public Criteria andBizTypeIsNull() {
            addCriterion("biz_type is null");
            return (Criteria) this;
        }

        public Criteria andBizTypeIsNotNull() {
            addCriterion("biz_type is not null");
            return (Criteria) this;
        }

        public Criteria andBizTypeEqualTo(Integer value) {
            addCriterion("biz_type =", value, "bizType");
            return (Criteria) this;
        }

        public Criteria andBizTypeNotEqualTo(Integer value) {
            addCriterion("biz_type <>", value, "bizType");
            return (Criteria) this;
        }

        public Criteria andBizTypeGreaterThan(Integer value) {
            addCriterion("biz_type >", value, "bizType");
            return (Criteria) this;
        }

        public Criteria andBizTypeGreaterThanOrEqualTo(Integer value) {
            addCriterion("biz_type >=", value, "bizType");
            return (Criteria) this;
        }

        public Criteria andBizTypeLessThan(Integer value) {
            addCriterion("biz_type <", value, "bizType");
            return (Criteria) this;
        }

        public Criteria andBizTypeLessThanOrEqualTo(Integer value) {
            addCriterion("biz_type <=", value, "bizType");
            return (Criteria) this;
        }

        public Criteria andBizTypeIn(List<Integer> values) {
            addCriterion("biz_type in", values, "bizType");
            return (Criteria) this;
        }

        public Criteria andBizTypeNotIn(List<Integer> values) {
            addCriterion("biz_type not in", values, "bizType");
            return (Criteria) this;
        }

        public Criteria andBizTypeBetween(Integer value1, Integer value2) {
            addCriterion("biz_type between", value1, value2, "bizType");
            return (Criteria) this;
        }

        public Criteria andBizTypeNotBetween(Integer value1, Integer value2) {
            addCriterion("biz_type not between", value1, value2, "bizType");
            return (Criteria) this;
        }

        public Criteria andVersionIsNull() {
            addCriterion("version is null");
            return (Criteria) this;
        }

        public Criteria andVersionIsNotNull() {
            addCriterion("version is not null");
            return (Criteria) this;
        }

        public Criteria andVersionEqualTo(Integer value) {
            addCriterion("version =", value, "version");
            return (Criteria) this;
        }

        public Criteria andVersionNotEqualTo(Integer value) {
            addCriterion("version <>", value, "version");
            return (Criteria) this;
        }

        public Criteria andVersionGreaterThan(Integer value) {
            addCriterion("version >", value, "version");
            return (Criteria) this;
        }

        public Criteria andVersionGreaterThanOrEqualTo(Integer value) {
            addCriterion("version >=", value, "version");
            return (Criteria) this;
        }

        public Criteria andVersionLessThan(Integer value) {
            addCriterion("version <", value, "version");
            return (Criteria) this;
        }

        public Criteria andVersionLessThanOrEqualTo(Integer value) {
            addCriterion("version <=", value, "version");
            return (Criteria) this;
        }

        public Criteria andVersionIn(List<Integer> values) {
            addCriterion("version in", values, "version");
            return (Criteria) this;
        }

        public Criteria andVersionNotIn(List<Integer> values) {
            addCriterion("version not in", values, "version");
            return (Criteria) this;
        }

        public Criteria andVersionBetween(Integer value1, Integer value2) {
            addCriterion("version between", value1, value2, "version");
            return (Criteria) this;
        }

        public Criteria andVersionNotBetween(Integer value1, Integer value2) {
            addCriterion("version not between", value1, value2, "version");
            return (Criteria) this;
        }
    }

    public static class Criteria extends GeneratedCriteria {

        protected Criteria() {
            super();
        }
    }

    public static class Criterion {
        private String condition;

        private Object value;

        private Object secondValue;

        private boolean noValue;

        private boolean singleValue;

        private boolean betweenValue;

        private boolean listValue;

        private String typeHandler;

        public String getCondition() {
            return condition;
        }

        public Object getValue() {
            return value;
        }

        public Object getSecondValue() {
            return secondValue;
        }

        public boolean isNoValue() {
            return noValue;
        }

        public boolean isSingleValue() {
            return singleValue;
        }

        public boolean isBetweenValue() {
            return betweenValue;
        }

        public boolean isListValue() {
            return listValue;
        }

        public String getTypeHandler() {
            return typeHandler;
        }

        protected Criterion(String condition) {
            super();
            this.condition = condition;
            this.typeHandler = null;
            this.noValue = true;
        }

        protected Criterion(String condition, Object value, String typeHandler) {
            super();
            this.condition = condition;
            this.value = value;
            this.typeHandler = typeHandler;
            if (value instanceof List<?>) {
                this.listValue = true;
            } else {
                this.singleValue = true;
            }
        }

        protected Criterion(String condition, Object value) {
            this(condition, value, null);
        }

        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
            super();
            this.condition = condition;
            this.value = value;
            this.secondValue = secondValue;
            this.typeHandler = typeHandler;
            this.betweenValue = true;
        }

        protected Criterion(String condition, Object value, Object secondValue) {
            this(condition, value, secondValue, null);
        }
    }
}

2, dao层接口: IdGeneratorMapper

java 复制代码
package org.com.spi.dao;

import java.util.List;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.com.spi.model.IdGenerator;
import org.com.spi.model.IdGeneratorExample;

@Mapper
public interface IdGeneratorMapper {
    int countByExample(IdGeneratorExample example);

    int deleteByExample(IdGeneratorExample example);

    int deleteByPrimaryKey(Integer id);

    int insert(IdGenerator record);

    int insertSelective(IdGenerator record);

    List<IdGenerator> selectByExample(IdGeneratorExample example);

    IdGenerator selectByPrimaryKey(Integer id);

    int updateByExampleSelective(@Param("record") IdGenerator record, @Param("example") IdGeneratorExample example);

    int updateByExample(@Param("record") IdGenerator record, @Param("example") IdGeneratorExample example);

    int updateByPrimaryKeySelective(IdGenerator record);

    int updateByPrimaryKey(IdGenerator record);

    IdGenerator selectMaxId(int bizType);

    int updateMaxId(IdGenerator idGenerator);
}

3, controller层: GenerateIdController

java 复制代码
@Autowired
IdGeneratorMapper idGeneratorMapper;
@PutMapping("/save1")
public int save1(@RequestBody AutoGenerate1 autoGenerate){
    IdGenerator idGenerator = idGeneratorMapper.selectMaxId(BizTypeEnum.GENERATE_ONE.getType());
    int count = 0;
    if(idGenerator == null){
        idGenerator = new IdGenerator();
        idGenerator.setId(1);
        idGenerator.setStep(4);
        idGenerator.setVersion(1);
        idGenerator.setMaxId(1L);
        idGenerator.setBizType(BizTypeEnum.GENERATE_ONE.getType());
        count = idGeneratorMapper.insertSelective(idGenerator);
        autoGenerate.setId(1L);
    }else{
        Long currentId = idGenerator.getMaxId() + idGenerator.getStep();
        autoGenerate.setId(currentId);
        idGenerator.setMaxId(currentId);
        count = idGeneratorMapper.updateMaxId(idGenerator);
    }
    if(count > 0){//id生成后才能算成功进行新增
        return autoGenerateMapper1.insert(autoGenerate);
    }
    return 0;
}

4, resources/mybatis目录下建: IdGeneratorMapper.xml

java 复制代码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="org.com.spi.dao.IdGeneratorMapper" >
  <resultMap id="BaseResultMap" type="org.com.spi.model.IdGenerator" >
    <id column="id" property="id" jdbcType="INTEGER" />
    <result column="max_id" property="maxId" jdbcType="BIGINT" />
    <result column="step" property="step" jdbcType="INTEGER" />
    <result column="biz_type" property="bizType" jdbcType="INTEGER" />
    <result column="version" property="version" jdbcType="INTEGER" />
  </resultMap>
  <sql id="Example_Where_Clause" >
    <where >
      <foreach collection="oredCriteria" item="criteria" separator="or" >
        <if test="criteria.valid" >
          <trim prefix="(" suffix=")" prefixOverrides="and" >
            <foreach collection="criteria.criteria" item="criterion" >
              <choose >
                <when test="criterion.noValue" >
                  and ${criterion.condition}
                </when>
                <when test="criterion.singleValue" >
                  and ${criterion.condition} #{criterion.value}
                </when>
                <when test="criterion.betweenValue" >
                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
                </when>
                <when test="criterion.listValue" >
                  and ${criterion.condition}
                  <foreach collection="criterion.value" item="listItem" open="(" close=")" separator="," >
                    #{listItem}
                  </foreach>
                </when>
              </choose>
            </foreach>
          </trim>
        </if>
      </foreach>
    </where>
  </sql>
  <sql id="Update_By_Example_Where_Clause" >
    <where >
      <foreach collection="example.oredCriteria" item="criteria" separator="or" >
        <if test="criteria.valid" >
          <trim prefix="(" suffix=")" prefixOverrides="and" >
            <foreach collection="criteria.criteria" item="criterion" >
              <choose >
                <when test="criterion.noValue" >
                  and ${criterion.condition}
                </when>
                <when test="criterion.singleValue" >
                  and ${criterion.condition} #{criterion.value}
                </when>
                <when test="criterion.betweenValue" >
                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
                </when>
                <when test="criterion.listValue" >
                  and ${criterion.condition}
                  <foreach collection="criterion.value" item="listItem" open="(" close=")" separator="," >
                    #{listItem}
                  </foreach>
                </when>
              </choose>
            </foreach>
          </trim>
        </if>
      </foreach>
    </where>
  </sql>
  <sql id="Base_Column_List" >
    id, max_id, step, biz_type, version
  </sql>
  <select id="selectMaxId" parameterType="int" resultMap="BaseResultMap">
    select * from id_generator where biz_type = #{bizType} limit 1;
  </select>
  <select id="selectByExample" resultMap="BaseResultMap" parameterType="org.com.spi.model.IdGeneratorExample" >
    select
    <if test="distinct" >
      distinct
    </if>
    <include refid="Base_Column_List" />
    from id_generator
    <if test="_parameter != null" >
      <include refid="Example_Where_Clause" />
    </if>
    <if test="orderByClause != null" >
      order by ${orderByClause}
    </if>
  </select>
  <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
    select 
    <include refid="Base_Column_List" />
    from id_generator
    where id = #{id,jdbcType=INTEGER}
  </select>
  <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer" >
    delete from id_generator
    where id = #{id,jdbcType=INTEGER}
  </delete>
  <delete id="deleteByExample" parameterType="org.com.spi.model.IdGeneratorExample" >
    delete from id_generator
    <if test="_parameter != null" >
      <include refid="Example_Where_Clause" />
    </if>
  </delete>
  <insert id="insert" parameterType="org.com.spi.model.IdGenerator" >
    insert into id_generator (id, max_id, step, 
      biz_type, version)
    values (#{id,jdbcType=INTEGER}, #{maxId,jdbcType=BIGINT}, #{step,jdbcType=INTEGER}, 
      #{bizType,jdbcType=INTEGER}, #{version,jdbcType=INTEGER})
  </insert>
  <insert id="insertSelective" parameterType="org.com.spi.model.IdGenerator" >
    insert into id_generator
    <trim prefix="(" suffix=")" suffixOverrides="," >
      <if test="id != null" >
        id,
      </if>
      <if test="maxId != null" >
        max_id,
      </if>
      <if test="step != null" >
        step,
      </if>
      <if test="bizType != null" >
        biz_type,
      </if>
      <if test="version != null" >
        version,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides="," >
      <if test="id != null" >
        #{id,jdbcType=INTEGER},
      </if>
      <if test="maxId != null" >
        #{maxId,jdbcType=BIGINT},
      </if>
      <if test="step != null" >
        #{step,jdbcType=INTEGER},
      </if>
      <if test="bizType != null" >
        #{bizType,jdbcType=INTEGER},
      </if>
      <if test="version != null" >
        #{version,jdbcType=INTEGER},
      </if>
    </trim>
  </insert>
  <select id="countByExample" parameterType="org.com.spi.model.IdGeneratorExample" resultType="java.lang.Integer" >
    select count(*) from id_generator
    <if test="_parameter != null" >
      <include refid="Example_Where_Clause" />
    </if>
  </select>
  <update id="updateByExampleSelective" parameterType="map" >
    update id_generator
    <set >
      <if test="record.id != null" >
        id = #{record.id,jdbcType=INTEGER},
      </if>
      <if test="record.maxId != null" >
        max_id = #{record.maxId,jdbcType=BIGINT},
      </if>
      <if test="record.step != null" >
        step = #{record.step,jdbcType=INTEGER},
      </if>
      <if test="record.bizType != null" >
        biz_type = #{record.bizType,jdbcType=INTEGER},
      </if>
      <if test="record.version != null" >
        version = #{record.version,jdbcType=INTEGER},
      </if>
    </set>
    <if test="_parameter != null" >
      <include refid="Update_By_Example_Where_Clause" />
    </if>
  </update>
  <update id="updateByExample" parameterType="map" >
    update id_generator
    set id = #{record.id,jdbcType=INTEGER},
      max_id = #{record.maxId,jdbcType=BIGINT},
      step = #{record.step,jdbcType=INTEGER},
      biz_type = #{record.bizType,jdbcType=INTEGER},
      version = #{record.version,jdbcType=INTEGER}
    <if test="_parameter != null" >
      <include refid="Update_By_Example_Where_Clause" />
    </if>
  </update>
  <update id="updateMaxId" parameterType="org.com.spi.model.IdGenerator" >
    update id_generator set max_id = #{maxId},version = version + 1
    where biz_type = #{bizType} and version = #{version}
  </update>
  <update id="updateByPrimaryKeySelective" parameterType="org.com.spi.model.IdGenerator" >
    update id_generator
    <set >
      <if test="maxId != null" >
        max_id = #{maxId,jdbcType=BIGINT},
      </if>
      <if test="step != null" >
        step = #{step,jdbcType=INTEGER},
      </if>
      <if test="bizType != null" >
        biz_type = #{bizType,jdbcType=INTEGER},
      </if>
      <if test="version != null" >
        version = #{version,jdbcType=INTEGER},
      </if>
    </set>
    where id = #{id,jdbcType=INTEGER}
  </update>
  <update id="updateByPrimaryKey" parameterType="org.com.spi.model.IdGenerator" >
    update id_generator
    set max_id = #{maxId,jdbcType=BIGINT},
      step = #{step,jdbcType=INTEGER},
      biz_type = #{bizType,jdbcType=INTEGER},
      version = #{version,jdbcType=INTEGER}
    where id = #{id,jdbcType=INTEGER}
  </update>
</mapper>

特点: 相较于数据库自增,扩展性更好,但缺点是每次取ID都需要加锁,性能较低.

相关推荐
半桶水专家几秒前
Kafka 性能瓶颈 → JMX 指标对照表
分布式·kafka
殷紫川1 小时前
别再乱用了!幂等处理与分布式锁,90% 开发者都踩过的坑与正确落地姿势
分布式·架构
Jack_David5 小时前
Kafka批量消息发送
java·分布式·kafka
wanhengidc6 小时前
服务器托管对企业的作用
大数据·运维·服务器·分布式·智能手机
Code知行合壹6 小时前
Spark使用总结
大数据·分布式·spark
Swift社区6 小时前
分布式能力不是功能,而是一种架构约束
分布式·架构
0xDevNull6 小时前
Apache Kafka 完全指南
分布式·kafka
zb200641207 小时前
RabbitMQ 客户端 连接、发送、接收处理消息
分布式·rabbitmq·ruby
半桶水专家8 小时前
Kafka JMX详解
分布式·kafka
渔民小镇8 小时前
告别 if-else 地狱 —— JSR380 参数验证在 ionet 中的应用
java·服务器·分布式·游戏