java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > MyBatis主键返回攻略

MyBatis实现主键返回功能的几种方式

作者:六七_Shmily

在 MyBatis 中,当我们执行插入操作后,经常需要获取数据库生成的主键值(如自增ID、序列值等),MyBatis 提供了几种方式来实现主键返回功能,所以本文给大家介绍了MyBatis实现主键返回的全攻略,需要的朋友可以参考下

引言

在 MyBatis 中,当我们执行插入操作后,经常需要获取数据库生成的主键值(如自增ID、序列值等)。MyBatis 提供了几种方式来实现主键返回功能。

一、主要应用场景

  1. 插入数据后需要立即使用生成的主键
  2. 需要将主键值用于后续业务逻辑或关联操作
  3. 需要返回完整对象(包含主键)给前端

二、核心实现方式

1. 使用 useGeneratedKeys 和 keyProperty(推荐)

这是最常用的方式,适用于支持自动生成主键的数据库(如 MySQL、SQL Server)。

XML 配置方式

<insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">
    INSERT INTO user (username, email, age)
    VALUES (#{username}, #{email}, #{age})
</insert>

注解配置方式

@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
@Insert("INSERT INTO user (username, email, age) VALUES (#{username}, #{email}, #{{age})")
int insertUser(User user);

2. 使用 <selectKey> 元素

这种方式更灵活,适用于所有数据库,特别是那些不支持自动生成主键的数据库(如 Oracle)。

MySQL 示例

<insert id="insertUser" parameterType="User">
    <selectKey keyProperty="id" resultType="java.lang.Long" order="AFTER">
        SELECT LAST_INSERT_ID()
    </selectKey>
    INSERT INTO user (username, email, age)
    VALUES (#{username}, #{email}, #{age})
</insert>

Oracle 示例

<insert id="insertUser" parameterType="User">
    <selectKey keyProperty="id" resultType="java.lang.Long" order="BEFORE">
        SELECT user_seq.NEXTVAL FROM DUAL
    </selectKey>
    INSERT INTO user (id, username, email, age)
    VALUES (#{id}, #{username}, #{email}, #{age})
</insert>

3. 注解方式使用 @SelectKey

@Insert("INSERT INTO user (username, email, age) VALUES (#{username}, #{email}, #{age})")
@SelectKey(statement = "SELECT LAST_INSERT_ID()", keyProperty = "id", 
           resultType = Long.class, before = false)
int insertUser(User user);

三、属性详解

1. useGeneratedKeys

2. keyProperty

3. keyColumn

4. <selectKey> 属性

四、使用示例

实体类

public class User {
    private Long id;
    private String username;
    private String email;
    private Integer age;
    
    // 构造方法、getter、setter 省略
}

Mapper 接口

public interface UserMapper {
    int insertUser(User user);
    
    @Options(useGeneratedKeys = true, keyProperty = "id")
    @Insert("INSERT INTO user (username, email, age) VALUES (#{username}, #{email}, #{age})")
    int insertUserWithAnnotation(User user);
}

测试代码

// 获取 SqlSession 和 Mapper
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

// 创建用户对象
User user = new User();
user.setUsername("john_doe");
user.setEmail("john@example.com");
user.setAge(25);

// 执行插入操作
int result = userMapper.insertUser(user);

// 插入成功后,主键会自动回填到 user 对象中
System.out.println("插入成功,生成的主键ID: " + user.getId());

// 此时可以直接使用 user.getId() 进行后续操作

五、不同数据库的注意事项

MySQL

Oracle

PostgreSQL

SQL Server

六、最佳实践

  1. 推荐使用 useGeneratedKeys:代码更简洁,性能更好
  2. 明确指定 keyProperty:避免因属性名不一致导致的问题
  3. 考虑使用 keyColumn:当数据库列名与对象属性名不一致时特别有用
  4. 测试多种情况:特别是批量插入时的主键返回行为
  5. 处理复合主键:如果需要返回多个生成的值,可以用逗号分隔多个属性名
<!-- 复合主键示例 -->
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id,version">
    INSERT INTO user (...) VALUES (...)
</insert>

七、常见问题解决

主键没有回填到对象中

批量插入时主键返回

通过合理使用 MyBatis 的主键返回功能,可以大大简化代码并提高开发效率。

到此这篇关于MyBatis实现主键返回功能的几种方式的文章就介绍到这了,更多相关MyBatis主键返回攻略内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文