返回
Mybatis 获取插入数据主键的两种方式
后端
2023-05-27 20:53:57
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。