返回

Mybatis 获取插入数据主键的两种方式

后端

Mybatis获取插入数据主键的两种方式:数据库自增和自定义主键生成器

在使用Mybatis进行数据操作时,经常需要获取插入数据的自增主键值。Mybatis提供了两种获取主键值的方式:数据库自增和自定义主键生成器。

数据库自增

数据库自增主键 是由数据库本身生成的。这种方式简单易用,不需要任何额外的配置。

配置方式:

在实体类中,将主键属性设置为自增主键。例如:

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

优点:

  • 简单易用,不需要任何配置
  • 性能好,因为主键是数据库本身生成的,不需要额外的查询

缺点:

  • 不支持所有数据库,比如Oracle就不支持自增主键
  • 不支持自定义主键生成策略

自定义主键生成器

自定义主键生成器 是由Mybatis来生成的。这种方式更加灵活,可以支持更多种类的数据库和主键生成策略。

配置方式:

在Mybatis配置文件中,配置主键生成器。例如:

<generator>
  <idClass>com.example.entity.User</idClass>
  <strategyClass>org.mybatis.generator.strategy.UUIDGenerator</strategyClass>
</generator>

优点:

  • 支持所有数据库
  • 支持自定义主键生成策略

缺点:

  • 配置相对复杂
  • 性能可能比数据库自增主键稍差

如何选择合适的主键生成方式

在实际项目中,可以根据自己的需求来选择合适的主键生成方式。

  • 如果需要简单易用,且数据库支持自增主键,则可以使用数据库自增主键。
  • 如果需要自定义主键生成策略,或者数据库不支持自增主键,则可以使用自定义主键生成器。

代码示例

以下是一个使用数据库自增主键的代码示例:

User user = new User();
user.setName("John Doe");
user.setEmail("john.doe@example.com");

int affectedRows = sqlSession.insert("com.example.mapper.UserMapper.insertUser", user);

System.out.println("Inserted user with ID: " + user.getId());

以下是一个使用自定义主键生成器的代码示例:

User user = new User();
user.setName("John Doe");
user.setEmail("john.doe@example.com");

int affectedRows = sqlSession.insert("com.example.mapper.UserMapper.insertUserWithUUID", user);

System.out.println("Inserted user with ID: " + user.getId());

常见问题解答

1. Mybatis插入数据后,为什么无法获取主键ID?

可能是因为主键没有配置为自增主键,或者没有配置主键生成器。

2. Mybatis支持哪些主键生成策略?

Mybatis支持的自带主键生成策略包括:

  • IDENTITY
  • UUID
  • SEQUENCE
  • TABLE

3. 如何自定义主键生成策略?

可以在Mybatis配置文件中配置自定义主键生成器,并实现org.mybatis.generator.strategy.IdGenerator接口。

4. 如何使用自定义主键生成器生成主键?

可以使用org.mybatis.generator.config.GeneratedKey类来指定使用自定义主键生成器生成主键。

5. 如何获取自定义主键生成器的生成的ID?

可以通过org.mybatis.generator.runtime.dynamic.sql.insert.GeneratedKey接口获取自定义主键生成器的生成的ID。