mybatis主键自动生成
时间: 2023-11-17 17:00:47 浏览: 141
MyBatis主键自动生成是指在向数据库插入数据时,自动为主键生成一个唯一的值。MyBatis提供了三种主键自动生成策略:使用SELECT LAST_INSERT_ID()、使用SELECT SEQ.nextval FROM DUAL、使用UUID。其中,使用SELECT LAST_INSERT_ID()是MySQL和SQL Server数据库的默认策略,而使用SELECT SEQ.nextval FROM DUAL是Oracle数据库的默认策略。此外,MyBatis还提供了一种更加灵活的方式,即使用useGeneratedKeys和keyProperty属性来实现主键自动生成。在使用这种方式时,需要在插入语句中添加useGeneratedKeys="true"和keyProperty="主键属性名"两个属性。
相关问题
mybatis 支持主键自动生成
是的,MyBatis支持主键自动生成。在MyBatis中,可以使用自增主键、UUID、雪花算法等方式来实现主键的自动生成。
对于自增主键,可以在数据库表的主键字段上设置为自增类型,然后在映射文件中配置对应的主键生成策略。例如,在MySQL中可以使用AUTO_INCREMENT来实现自增主键,在映射文件中可以使用<selectKey>元素来配置主键生成策略。
对于UUID主键,可以在表的主键字段上设置为CHAR(36)类型,然后在插入数据时使用UUID.randomUUID().toString()来生成唯一的主键值。
对于雪花算法主键,***
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)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.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)
![](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)