mybatis插入后自动填充主键
时间: 2023-07-05 12:12:27 浏览: 271
在 MyBatis 中插入一条数据后,如果要自动填充主键,可以使用 MyBatis 提供的 `useGeneratedKeys` 和 `keyProperty` 属性。
首先,在插入语句中使用 `useGeneratedKeys` 属性告诉 MyBatis 要使用数据库的自动生成主键功能:
```xml
<insert id="insertUser" parameterType="User" useGeneratedKeys="true">
insert into user (username, password) values (#{username}, #{password})
</insert>
```
然后,在 `keyProperty` 属性中指定实体类中的属性名,这个属性将会被 MyBatis 自动填充为生成的主键值:
```xml
<insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">
insert into user (username, password) values (#{username}, #{password})
</insert>
```
这样,在执行完插入语句后,MyBatis 就会自动将生成的主键值设置到实体类中对应的属性上。
相关问题
mybatis-plus自动填充主键在什么时候
MyBatis-Plus 在插入操作时自动填充主键值。具体来说,当插入一条记录时,如果该记录的主键属性被标注为 @TableId 注解,并且设置了主键生成策略(如使用了 @TableId(type = IdType.AUTO)),则 MyBatis-Plus 会自动为该属性生成并填充主键值。这通常发生在执行插入操作后,MyBatis-Plus 会将生成的主键值设置回对象中。
mybatis自动生成主键
### MyBatis 主键自动生成配置及使用
#### 配置 `useGeneratedKeys` 实现主键自动生成
当希望在插入记录之后立即获得由数据库生成的主键时,可以在映射文件中的 `<insert>` 标签内设置 `useGeneratedKeys="true"` 和 `keyProperty` 属性。前者告知 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来获取主键;后者指定将返回的主键赋给实体类中哪个字段。
对于 MySQL 数据库而言,在执行完 insert 操作后,MyBatis 可以自动填充新创建的对象实例的 ID 字段[^1]:
```xml
<insert id="insertPerson" parameterType="com.example.Person"
useGeneratedKeys="true"
keyProperty="id">
INSERT INTO person (name, age)
VALUES (#{name}, #{age})
</insert>
```
这段 XML 定义了一个名为 `insertPerson` 的 Insert 映射语句,并指定了它应该接收一个 Person 类型参数。同时启用了 `useGeneratedKeys=true` 来指示 MyBatis 获取数据库产生的主键,并将其存储到传入对象的 `id` 属性里。
#### 利用 Sequence 或者其他方式预先分配主键
如果使用的不是支持自增列特性的数据库(比如 Oracle),则可以采用定义 sequence 序列的方式来自增长主键值。此时可以通过添加 `order="BEFORE"` 参数让 MyBatis 在实际执行插入操作前先取得新的主键值并填入待插数据之中[^2]。
下面是一个例子展示如何结合 selectKey 元素以及 order 属性实现这一点:
```xml
<insert id="insertStudent" parameterType="java.util.Map">
<selectKey resultType="int" keyProperty="student.studId" order="BEFORE">
SELECT seq_student.NEXTVAL FROM DUAL
</selectKey>
INSERT INTO STUDENT(STUDID, NAME, AGE)
VALUES(#{student.studId}, #{student.name}, #{student.age});
</insert>
```
这里展示了针对 Oracle 数据库的一个场景,其中 `seq_student` 是预设好的序列名称用于生产唯一的 studId 值。此代码片段会在真正做插入动作之前就准备好要插入的新纪录所需的唯一标识符。
#### 自定义主键生成器
除了上述两种常见情况外,还可以通过编写自己的 TypeHandler 并注册至 MyBatis 中去处理更复杂的业务逻辑下的主键生成需求。这种方式允许开发者完全掌控主键是如何被计算出来的过程,甚至可以从外部服务调用来决定最终的结果[^3]。
例如,假设有一个基于 UUID 的全局唯一识别码的需求,则可能需要如下所示的方式来构建相应的处理器:
```java
public class UuidGenerator implements TypeHandler<String> {
@Override
public void setParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
if(parameter == null){
ps.setNull(i,jdbcType.TYPE_CODE);
}else{
ps.setString(i,UUID.randomUUID().toString());
}
}
// ... other methods ...
}
```
随后就可以像这样应用这个 type handler :
```xml
<resultMap id="baseResultMap" type="com.example.EntityWithUuid">
<!-- fields mapping -->
<id column="uuid_column_name" property="uuidField" javaType="String" jdbcType="VARCHAR"/>
</resultMap>
<insert id="insertEntity" parameterType="com.example.EntityWithUuid">
INSERT INTO entity_table(uuid_column_name,...)
VALUES (<foreach item="item" collection="list" separator=",">#{item.uuidField}</foreach>,...)
</insert>
```
阅读全文
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![-](https://img-home.csdnimg.cn/images/20241231045021.png)
![docx](https://img-home.csdnimg.cn/images/20241231044901.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)