mybatisplus 联动修改,如何只改驱动表跟关系表,不改副表

mybatisplus
注解操作,不写sql
主表a
关联表a_b
副表b

保存表a对象时,只更改a,a_b。不改b
a {"id":1,"name":"张三"
"a_b":{"a_id":1,"b_id":2,"name":"李四"}
}
这时,如果b中没有2这个id的数据会被新建,或有则被修改。怎么去掉这个逻辑??不新建也不修改b。注解能不能完成这个事情?不写SQL,我知道写SQL可以做。

【以下回答由 GPT 生成】

我了解您的需求是在使用mybatisplus时,只改变主表和关联表,不改变副表。您希望在保存主表对象时,只修改主表和关联表的数据,而不对副表进行修改。您想知道是否有一种方法可以完美解决这个问题,并且不需要编写SQL语句。

根据您的描述,mybatisplus本身并不提供直接的方式来实现这个需求,因为创建或更新数据是基于表的,而不是基于对象的,所以它无法知道您只想修改主表和关联表,而不修改副表。

为了实现您的需求,您可以考虑以下两种方法:

  1. 使用注解方式:

您可以使用mybatisplus的注解方式来实现需求,但是需要手动处理副表的创建或更新操作。具体步骤如下:

首先,使用MyBatisPlus的注解方式来定义主表和关联表的实体类和Mapper接口,使用相关注解来配置表之间的关系,并编写相应的Service类。

其次,在Service类中,通过判断副表中是否存在对应ID的数据,来确定是进行创建数据还是更新数据的操作。您可以使用mybatisplus提供的Wrapper来拼接查询条件,并使用count()方法来判断副表中是否存在对应数据。具体代码如下:

@Service
public class MainService {

    @Autowired
    private MainMapper mainMapper;

    @Autowired
    private RelationMapper relationMapper;

    public void saveMainTable(MainTable mainTable) {
        // 保存或更新主表
        mainMapper.insert(mainTable);

        // 判断副表中是否存在对应的数据
        QueryWrapper<RelationTable> wrapper = new QueryWrapper<>();
        wrapper.eq("id", mainTable.getId());
        int count = relationMapper.selectCount(wrapper);

        // 判断是否需要创建或更新副表数据
        if (count > 0) {
            // 更新副表
            // ...
        } else {
            // 创建副表
            // ...
        }
    }
}

这样,通过判断副表中是否存在对应ID的数据,可以实现只修改主表和关联表,而不修改副表的操作。

  1. 编写SQL语句:

如果您不希望使用注解方式,也可以通过编写SQL语句来实现需求。

首先,编写一个SQL语句,通过JOIN操作将主表和关联表的数据查出来,并根据条件判断是否需要创建或更新副表。具体代码如下:

INSERT INTO main_table (id, name) VALUES (#{id}, #{name})
ON DUPLICATE KEY UPDATE name = VALUES(name);

INSERT INTO relation_table (id, main_id, relation_name) VALUES (#{id}, #{main_id}, #{relation_name})
ON DUPLICATE KEY UPDATE relation_name = VALUES(relation_name);

其中,通过ON DUPLICATE KEY UPDATE语句可以实现当数据存在时进行更新操作。

然后,在mybatisplus的Mapper接口中定义一个使用@Insert注解的方法,并在该方法的注解中指定上述编写的SQL语句。具体代码如下:

@Mapper
public interface MainMapper {

    @Insert("INSERT INTO main_table (id, name) VALUES (#{id}, #{name}) " +
            "ON DUPLICATE KEY UPDATE name = VALUES(name)")
    void saveOrUpdateMainTable(MainTable mainTable);
}

这样,当调用saveOrUpdateMainTable方法时,会执行上述SQL语句,从而实现只修改主表和关联表,不修改副表的操作。

综上所述,根据您的需求,您可以选择使用注解方式来手动处理副表的创建或更新操作,或者编写SQL语句来实现需求。希望我的回答对您有所帮助,如果还有其他问题,请随时提问。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

题主,这个问题我来替你解决,若有帮助,还望采纳,点击回答右侧采纳即可。


可以使用Mybatis-Plus的注解来实现这个逻辑。

首先,在实体类中添加注解@TableField(exist = false),来告诉Mybatis-Plus这个属性不是数据库表中的字段。

然后,在保存实体对象时,使用Mybatis-Plus提供的saveOrUpdate方法,该方法会自动判断是否需要新增或修改关联表的数据。

具体代码如下:

@Entity
@Table(name = "a")
public class A {
    @Id
    private Long id;
    private String name;

    @TableField(exist = false)
    private AB ab;
    
    // getter 和 setter 方法
}

@Entity
@Table(name = "a_b")
public class AB {
    private Long id;
    private Long aId;
    private Long bId;
    private String name;
    
    // getter 和 setter 方法
}

@Service
public class AService {
    @Autowired
    private AMapper aMapper;
    
    public void save(A a) {
        aMapper.saveOrUpdate(a);
    }
}

在上面的代码中,AB类的id属性需要和数据库中的主键名相同,否则会导致新增时抛出主键为空的异常。

另外,需要注意的是,如果Mybatis-Plus判断到需要新增AB表的数据,但是AB实体类中的id属性为null,则会抛出主键为空的异常,这时需要手动设置一个非null的id值。