问题:
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;
}
}
具体路径是:

步骤 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,解决了标题的问题,但不知道是否会出现其他问题。
评论0
暂时没有评论