首页 > 解决方案 > 如何在 Java 中仅更新 @Transactional 方法中更改的字段?

问题描述

美好的一天亲爱的开发者!我需要解决一些与我的方法相关的问题。我需要创建一个允许我更改对象的编辑/更新方法。

条件之一是只有用户更改的字段才能在数据库中更改。不应覆盖所有字段。示例:旧值名称 -> “Jack”,新值名称 -> “Bob”,应该更改 . 但是,如果旧值是 name ->“Jack”,而新值是 name ->“Jack”,则不应覆盖该字段,因为值相等。

我需要我的方法来仅检查和更改已更改的字段并在数据库中插入更改。

我尝试使用 sql 完成任务,但不幸的是我不知道如何设置值(如果新值现在与 DB 中的值相同,则不执行任何更新):


    @Transactional(transactionManager = TransactionManagerConfig.TX_MANAGER_MAIN)
    public void editUserContacts(User user) {

        Connection connection = DataSourceUtils.getConnection(mainDataSource);

        String sql = "UPDATE `" + userSchema + "`.l_user " +
                " SET user_phone_number = @phoneNumber," +
                "firstname = @fullName," +
                "user_country = @userCountry," +
                "house_phone_number = @phoneAlternative," +
                " WHERE l_user_id=? , " +
                "user_phone_number != @phoneNumber OR IS NULL," +
                "firstName != @fullName OR IS NULL," +
                "user_country != @userCountry OR IS NULL," +
                "house_phone_number != @phoneAlternative OR IS NULL,;

        try (
                PreparedStatement statement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)
        ) {
            statement.executeUpdate();
            statement.getUpdateCount();

        } catch (SQLException e) {
            throw new DAOException(e);

        }
    }

也许我需要先做 SELECT ,或者使用 equals 比较每个字段?请告诉我至少一个值的示例,我怎样才能正确地执行我的任务?

PS如果新值不等于旧值,我想更新我的值。但是如果新旧值相等,则什么都不会发生

我将非常感谢您的帮助!

标签: javamysqlsqlspringtransactions

解决方案


示例:旧值名称 -> “Jack”,新值名称 -> “Bob”,应该更改 . 但是,如果旧值是 name ->“Jack”,而新值是 name ->“Jack”,则不应覆盖该字段,因为值相等。

别管它。MySQL 足够聪明,只有当它的值真正改变时它才会更新列。

例子:

在此处输入图像描述

看 - 有 2 行,只有一行中的值发生了变化。和 MySQL 报告

1 行受影响

匹配的行数:2 更改:1

即,事实上没有改变值的行没有改变。


推荐阅读