使用Update修改不报错但是修改不成功

文章讲述了在SpringBoot项目中,由于雪花算法生成的ID长度超过前端处理限制导致无法匹配,通过扩展Jackson的消息转换器,将Long类型转换为String以避免精度丢失的问题。

使用Update修改不报错但是修改不成功

sql执行后 后台日志说影响行数为0。然后发现是id不存在。
因为项目中使用自动生成ID,使用的是雪花算法,长度超过了前端js可处理长度,所以当后台id传到前台后会丢失精度,导致无法匹配到要修改的id。
这个时候要自己扩展一个消息转换器。

在springboot项目中的配置如下:

package com.hbsd.reggie.common;

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
import java.math.BigInteger;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES;

/**
 * 对象映射器:基于jackson将Java对象转为json,或者将json转为Java对象
 * 将JSON解析为Java对象的过程称为 [从JSON反序列化Java对象]
 * 从Java对象生成JSON的过程称为 [序列化Java对象到JSON]
 */
public class JacksonObjectMapper extends ObjectMapper {

    public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
    public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
    public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";

    public JacksonObjectMapper() {
        super();
        //收到未知属性时不报异常
        this.configure(FAIL_ON_UNKNOWN_PROPERTIES, false);

        //反序列化时,属性不存在的兼容处理
        this.getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);


        SimpleModule simpleModule = new SimpleModule()
                .addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
                .addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
                .addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)))

                .addSerializer(BigInteger.class, ToStringSerializer.instance)
                .addSerializer(Long.class, ToStringSerializer.instance)
                .addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
                .addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
                .addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));

        //注册功能模块 例如,可以添加自定义序列化器和反序列化器
        this.registerModule(simpleModule);
    }
}

@Slf4j
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
    @Override
    protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        log.info("扩展消息转换器");
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        converter.setObjectMapper(new JacksonObjectMapper());
        converters.add(0, converter);
    }
}

这时,会将所有的Long类型转成String再生成json对象传给前台,避免出现精度错误。

在 SQL 取最小的数并修改数据时提示“不能修改此表”,可能有多种原因,以下是一些常见情况及解决办法: ### 权限足 如果用户没有对该表进行修改操作的权限,就会出现不能修改表的提示。解决办法是联系数据库管理员,为当前用户授予对该表的更新权限。在 SQL Server 中,可以使用如下语句为用户授予更新权限: ```sql GRANT UPDATE ON table_name TO username; ``` ### 表被锁定 当表正在被其他事务锁定时,当前操作无法对其进行修改。可以等待其他事务完成,释放对表的锁定。若要查看当前的锁信息,在 SQL Server 中可以使用以下查询: ```sql SELECT * FROM sys.dm_tran_locks; ``` ### 修改数据类型相关限制 在修改表时,如果涉及到数据类型的修改且表中有数据,可能会出现问题。例如在 Oracle 中,若要更改数据类型,要修改的列必须为空,会报错【ORA - 01439: 要更改数据类型, 则要修改的列必须为空】。解决办法可以参考如下步骤(以将字段 `CLIENT_TYPE` 类型由 `number` 改为 `integer` 为例): ```sql -- 原列名字段重命名_bak alter table CS_PLATFORM2.NES_ACCOUNT_BIZ_INFO rename column CLIENT_TYPE to CLIENT_TYPE_bak; -- 新增一列,列名为待修改列 alter table CS_PLATFORM2.NES_ACCOUNT_BIZ_INFO add(CLIENT_TYPE INTEGER); -- 将原列数据给新增列 update CS_PLATFORM2.NES_ACCOUNT_BIZ_INFO set CLIENT_TYPE = trim(CLIENT_TYPE_bak); -- 删除原列名 alter table CS_PLATFORM2.NES_ACCOUNT_BIZ_INFO drop column CLIENT_TYPE_bak; ``` ### SQL Server 表设计器阻止保存 在 SQL Server 2008 中,如果使用表设计器修改表结构后不能保存,可启动 MSSQL SERVER 2008,选择菜单 工具 -> 选项 -> 左侧有个 设计器 -> 表设计器和数据库设计器,去掉“ 阻止保存要求重新创建表的更改”前面的勾,重新启动 MSSQL SERVER 2008 即可 [^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

善良的大铁牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值