spring中使用tkmybatis踩坑

问题描述

在使用tk提供的InsertMapper的insert方法时,不会将自增ID回写到记录中。

问题复现

maven依赖

<dependency>
    <groupId>tk.mybatis</groupId>
    <artifactId>mapper-spring-boot-starter</artifactId>
    <version>2.1.5</version>
</dependency>

实体类

package com.imooc.commons.dao.entity;

import lombok.Data;

import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import java.util.Date;

@Data
@Table(name = "marketing_step_context")
public class MarketingStepContext {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * 上下文json
     */
    @Column(name = "context_json")
    private String contextJson;

    @Column(name = "create_date")
    private Date createDate;

    @Column(name = "update_date")
    private Date updateDate;
}

mapper类

import com.imooc.commons.dao.entity.MarketingStepContext;
import org.springframework.stereotype.Repository;
import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper;

@Repository
public interface MarketingStepContextMapper extends Mapper<MarketingStepContext>, MySqlMapper<MarketingStepContext> {
}

使用时

stepContextMapper.insert(stepContext); //id没有自动回写到stepContext中,导致后续更新时异常

问题原因

insert方法本身就不支持回写ID,对比insertList方法,它确实也没有 @Options注解。

解决方法

  1. 使用KeySql注解
@Id
@Column(name = "id")
@KeySql(useGeneratedKeys = true)
private Long id;
  1. 手动声明id生成器
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY, generator = "JDBC")
private Long id;
  1. 使用insertList方法
stepContextMapper.insertList(Collections.singletonList(stepContext));
posted @ 2026-01-01 09:49  strongmore  阅读(1)  评论(0)    收藏  举报