问题:

DM8数据库,查询得到的雪花算法的id和数据库不一致,直接执行SQL查询和后端返回的数据总是差1或者差2。

比如:

数据库工具中查询返回:2008745009293893633 后端接口返回就是:2008745009293893632

解决办法:

在ruoyi-vue-plus框架下:

在框架的 ruoyi-common 模块下,新建DmNumber2LongTypeHandler.java

内容为:

package org.dromara.common.mybatis.handler;

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;
import java.math.BigDecimal;
import java.sql.*;

@MappedTypes(Long.class)
@MappedJdbcTypes(JdbcType.NUMERIC)
public class DmNumber2LongTypeHandler extends BaseTypeHandler<Long> {

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, Long parameter, JdbcType jdbcType) throws SQLException {
        ps.setLong(i, parameter);
    }

    @Override
    public Long getNullableResult(ResultSet rs, String columnName) throws SQLException {
        BigDecimal value = rs.getBigDecimal(columnName);
        return value != null ? value.longValueExact() : null;
    }

    @Override
    public Long getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        BigDecimal value = rs.getBigDecimal(columnIndex);
        return value != null ? value.longValueExact() : null;
    }

    @Override
    public Long getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        BigDecimal value = cs.getBigDecimal(columnIndex);
        return value != null ? value.longValueExact() : null;
    }
}

具体路径是:

image.png

步骤 2:两种注册方式(选其一即可)
RuoYi-Vue-Plus 支持字段级注解注册和全局包扫描注册,按需选择:
方式 1:字段级注解注册(推荐,精准控制)
在需要映射的实体类字段上,添加 @TableField 注解指定类型处理器。
以系统用户表 SysUser 为例(路径:ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUser.java):

import com.baomidou.mybatisplus.annotation.TableField;
import org.dromara.common.mybatis.handler.DmNumber2LongTypeHandler;
import lombok.Data;

@Data
public class SysUser {
    // 其他字段...

    /** 雪花ID字段(示例) */
    @TableField(value = "snowflake_id", typeHandler = DmNumber2LongTypeHandler.class)
    private Long snowflakeId;
}

方式 2:全局包扫描注册(批量生效)
若多个实体类的 Long 字段都需要映射 DM8 的 number(20),可在配置文件中指定处理器包路径,实现全局生效。
打开框架的 application.yml 配置文件(路径:ruoyi-admin/src/main/resources/application.yml)。
在 mybatis-plus 节点下添加类型处理器扫描配置

mybatis-plus:
  # 其他配置...
  type-handlers-package: com.ruoyi.common.mybatis.handler  # 自定义处理器包路径
  configuration:
    map-underscore-to-camel-case: true  # 保持驼峰命名

我用方式2,解决了标题的问题,但不知道是否会出现其他问题。