mybatis-plus Iservice主键策略设置、主键自增问题

mybatis-plus Iservice 单个新增 

 @RequestMapping(value = "/add", method = RequestMethod.POST)
    public boolean add(@RequestBody User user) {
        ValidatorUtils.validateEntity(user, AddGroup.class);
        user.setCreateTime(new Date());
        user.setDbSource("testdb01");
        return userService.save(user);
    }

数据库数据,主键Id非常长,不连续自增

批量新增

@RequestMapping(value = "/add2", method = RequestMethod.POST)
    public boolean add2(@RequestBody List<User> userList) {
        ValidatorUtils.validateEntity(userList, AddGroup.class);   //  AddGroup.class
        boolean b = userService.saveBatch(userList);
//        boolean b = userService.saveOrUpdateBatch(userList);

        return b;
    }

解决办法:

在实体对象主键上面添加@TableId(type = IdType.AUTO)

@TableId(value = “id”)
private Integer id;
我们可以设置主键的生成方式

@TableId(value = “id”,type = IdType.INPUT) 这种方式是主键手动输入
主键生成方式类型如下(IdType):

public enum IdType {
    AUTO(0), // 数据库ID自增
    NONE(1), // 该类型为未设置主键类型
    INPUT(2), // 用户输入ID
    ID_WORKER(3), // 全局唯一ID
    UUID(4), // 全局唯一ID
    ID_WORKER_STR(5); // 字符串全局唯一ID

    private final int key;

    private IdType(int key) {
        this.key = key;
    }

    public int getKey() {
        return this.key;
    }
}

mybatis plus默认使用全局唯一的数字类型
ID_WORKER(2, “全局唯一ID”),mybatis-plus 默认是生成一个长数字字符串(编码不同可能结尾带有字母),生成的ID格式:ccba0a05fcbe46898304d5213d2b5518

ID_WORKER调用IdWorker的getId()方法,生成一个与时间相关的主键id

 

 

### 使用 MyBatis-Plus 实现联合主键批量更新 MyBatis-Plus 是一款强型的 MyBatis 框架,简化了开发过程中的持久层操作。对于具有复杂业务逻辑的需求,如联合主键批量更新的操作,可以通过自定义 SQL 或者利用框架特性来完成。 #### 自定义 SQL 方式实现联合主键批量更新 当实体类存在多个字段作为主键时,在进行批量更新前需确保这些组合能唯一标识每一条记录。下面是一个基于 `@Update` 注解的方式来进行多列主键条件下的批量更新: ```java import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import org.springframework.stereotype.Service; @Service public class UserService { public void batchUpdateUsers(List<User> userList){ UpdateWrapper<User> updateWrapper = new UpdateWrapper<>(); for (User user : userList) { // 设置要修改的数据 User updateUser = new User(); updateUser.setFieldToUpdate(user.getFieldToUpdate()); // 构建 where 条件, 假设 id 和 code 组成复合主键 updateWrapper.eq("id", user.getId()) .eq("code", user.getCode()); baseMapper.update(updateUser, updateWrapper); // 清除上一次构建的where条件 updateWrapper.clear(); } } } ``` 这种方式通过循环遍历待更新的对象列表,并针对每一个对象创建相应的 `WHERE` 子句以匹配特定的记录集,从而达到按联合主键批量更新的效果[^1]。 #### 利用 Wrapper 进行更简洁高效的批处理 为了提高效率并减少数据库交互次数,可以考虑采用一次性提交所有更改请求的形式。这通常涉及到拼接动态SQL语句或将数据封装到JSON字符串中传递给存储过程等方式。然而,MyBatis-Plus 提供了一种更为优雅的做法——借助于内置工具类 BatchUtil 及其提供的方法可以直接支持此类场景: ```java import java.util.List; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.apache.ibatis.annotations.Param; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; // 定义接口 public interface IUserService extends IService<User> {} // 实现服务层 @Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService{ @Autowired private UserMapper mapper; /** * 批量更新用户信息(假设有两个主键:id & code) */ public int batchUpdate(@Param("list") List<User> list){ return this.mapper.batchUpdate(list); } } // 对应 Mapper 接口 public interface UserMapper extends BaseMapper<User>{ Integer batchUpdate(@Param("list")List<User> users); } <!-- XML 映射文件 --> <update id="batchUpdate"> UPDATE user SET field_to_update=#{item.fieldToUpdate}, another_field=#{item.anotherField} WHERE id=#{item.id} AND code=#{item.code} </update> ``` 上述代码展示了如何在一个事务内执行多次更新而不必显式地为每一项单独发起调用。注意这里的 `<foreach>` 标签用于迭代传入参数集合内的各个成员,并将其映射至对应的占位符位置;而 `#{}` 表达式的运用则允许访问 Java Bean 属性值[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值