mybatis执行insert如何返回id

在 MyBatis 中,执行 INSERT 操作后​​默认返回的是影响的行数(通常是 1)​​,而不是插入的主键 ID。但可以通过以下配置获取新插入记录的 ID:

🛠 两种方式获取自增 ID:

1. ​useGeneratedKeys + keyProperty(推荐)​

适用于支持自增主键的数据库(如 MySQL、SQL Server 等)。在 Mapper XML 中配置:

<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
    INSERT INTO user (name, email)
    VALUES (#{name}, #{email})
</insert>
  • useGeneratedKeys="true"​:启用数据库自动生成的 ID。
  • keyProperty="id"​:将生成的 ID 赋值给参数对象的 id 属性。

调用示例:

User user = new User();
user.setName("John");
user.setEmail("john@example.com");
int rows = userMapper.insertUser(user); // rows 是受影响行数
Long generatedId = user.getId(); // 获取插入的 ID ✅
2. ​<selectKey>(适用于 Oracle 或复杂场景)​

对于 Oracle 或需要自定义查询 ID 的情况:

<insert id="insertUser">
    <selectKey keyProperty="id" resultType="long" order="AFTER">
        SELECT LAST_INSERT_ID() <!-- MySQL 获取最新 ID -->
        <!-- Oracle: SELECT your_sequence.CURRVAL FROM dual -->
    </selectKey>
    INSERT INTO user (name, email)
    VALUES (#{name}, #{email})
</insert>
  • order="AFTER":执行 INSERT 后再获取 ID(Oracle 可能需要 BEFORE)。

📝 关键点总结:

​特性​​说明​
​默认返回值​受影响行数(Integer),不是 ID!
​获取 ID 的方式​通过 keyProperty 将 ID 注入到参数对象中(如 user.getId()
​支持数据库​MySQL、SQL Server 等(useGeneratedKeys) / Oracle(<selectKey>
​注解配置​使用 @Options(useGeneratedKeys=true, keyProperty="id")

💡 示例(注解方式):

@Options(useGeneratedKeys = true, keyProperty = "id")
@Insert("INSERT INTO user(name, email) VALUES (#{name}, #{email})")
int insertUser(User user); // 执行后 user.id 即为新生成的 ID

⚠️ 注意:

  • 确保数据库表的主键是​​自增(AUTO_INCREMENT)​​ 或配置了序列。
  • keyProperty 的值必须与实体类中的属性名严格匹配(如 id 对应 user.id)。

通过正确配置,MyBatis 可以无缝地将新生成的 ID 注入到您的实体对象中,无需额外查询!🚀

### MyBatis Insert 返回主键 ID 示例 对于希望在执行插入操作后获取生成的主键ID的情况,MyBatis 提供了简洁而有效的解决方案。当使用MySQL作为数据库时,在Mapper XML文件中定义`<insert>`语句时应指定两个重要属性:`useGeneratedKeys="true"`以及`keyProperty`指向实体类中的相应字段名称[^2]。 下面是一个具体的实例展示如何配置: ```xml <!-- RoleMapper.xml --> <mapper namespace="com.example.mapper.RoleMapper"> <!-- 插入角色信息并返回新创建的角色ID --> <insert id="addRole" parameterType="com.example.model.Role" useGeneratedKeys="true" keyProperty="roleId"> INSERT INTO roles (role_name, description) VALUES (#{name}, #{description}) </insert> </mapper> ``` 这段代码片段展示了向名为`roles`的数据表内添加一条记录的同时利用`useGeneratedKeys=true`指示MyBatis启用JDBC驱动程序提供的自动生成键功能;并通过设定`keyProperty="roleId"`告知框架将产生的主键赋给传入对象里的`roleId`成员变量。 为了验证此过程是否成功完成,可以在Java服务层编写如下测试案例: ```java // RoleService.java public class RoleService { @Autowired private RoleMapper roleMapper; public void addNewRole(Role newRole){ // 调用 Mapper 方法之前 roleId 应该为空或默认值 System.out.println("Before insertion, the generated ID is: " + newRole.getRoleId()); try{ roleMapper.addRole(newRole); // 成功插入后的newRole 对象应当已经包含了由数据库分配的新主键 System.out.println("After successful insertion, the generated ID is now: " + newRole.getRoleId()); } catch(Exception e){ // 处理异常... } } } ``` 上述示例说明了通过适当配置MyBatis映射文件,并配合合理的编程实践,能够轻松实现在插入操作结束后立即访问所生成的主键值的功能[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值