JPA 与 MyBatis-Plus 数据库自增主键实现方案
1. 背景
在实际项目中,常需使用数据库自增列(AUTO_INCREMENT / SERIAL / BIGSERIAL
)作为主键,以减少主键生成逻辑复杂度。
本文分别给出 JPA(Hibernate) 与 MyBatis-Plus 两种主流 ORM 的完整实现步骤、代码示例及注意事项,方便团队快速落地。
2. 环境约定
组件 | 版本 |
---|---|
JDK | 17+ |
Spring Boot | 3.x |
MySQL | 8.x(PostgreSQL 等同理) |
JPA | spring-boot-starter-data-jpa |
MyBatis-Plus | mybatis-plus-boot-starter 3.5.x |
3. 数据库脚本
以 MySQL 为例,PostgreSQL 把
AUTO_INCREMENT
换成BIGSERIAL
即可。
CREATE TABLE t_user (id BIGINT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(50) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
4. JPA(Hibernate)实现
4.1 Maven 依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
4.2 实体类
package com.example.jpa.entity;import jakarta.persistence.*;@Entity
@Table(name = "t_user")
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;/* getter & setter */
}
4.3 Repository
package com.example.jpa.repository;import com.example.jpa.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;public interface UserRepository extends JpaRepository<User, Long> {}
4.4 Service 示例
@Service
public class UserService {@Autowiredprivate UserRepository repo;@Transactionalpublic Long addUser(String name) {User u = new User();u.setName(name);repo.save(u); // 插入后自动回填 idreturn u.getId();}
}
5. MyBatis-Plus 实现
5.1 Maven 依赖
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.7</version>
</dependency>
5.2 实体类
package com.example.mp.entity;import com.baomidou.mybatisplus.annotation.*;@Data
@TableName("t_user")
public class User {@TableId(type = IdType.AUTO)private Long id;private String name;
}
5.3 Mapper
package com.example.mp.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.mp.entity.User;@Mapper
public interface UserMapper extends BaseMapper<User> {}
5.4 Service 示例
@Service
public class UserService {@Autowiredprivate UserMapper userMapper;public Long addUser(String name) {User u = new User();u.setName(name);userMapper.insert(u); // 插入后自动回填 idreturn u.getId();}
}
6. 对比与最佳实践
维度 | JPA | MyBatis-Plus |
---|---|---|
主键注解 | @Id + @GeneratedValue(IDENTITY) | @TableId(type = IdType.AUTO) |
依赖 | spring-boot-starter-data-jpa | mybatis-plus-boot-starter |
插入回写 | 自动 | 自动 |
额外配置 | 无 | 无 |
适用场景 | 简单 CRUD、规范 JPA | 复杂 SQL、灵活 MyBatis |
常见坑 | 大小写敏感、无 @Id | 列未 AUTO_INCREMENT 、误用 @Id |
7. FAQ
-
PostgreSQL 如何写
CREATE TABLE t_user (id BIGSERIAL PRIMARY KEY,name VARCHAR(50) );
其余代码保持一致。
-
为什么插入后 id 返回 0?
-
JPA:确认
@GeneratedValue(IDENTITY)
。 -
MyBatis-Plus:确认
@TableId(type = IdType.AUTO)
且列AUTO_INCREMENT
/SERIAL
。
-
-
能否全局指定自增策略?
-
MyBatis-Plus 可在
application.yml
中mybatis-plus:global-config:db-config:id-type: auto
-
8. 附录
-
JPA 官方文档
-
MyBatis-Plus 官方文档