Mybatis Plus 2 升到 Mybatis Plus 3 时,oracle 自增序列的相关问题

本文详细介绍了从MybatisPlus2升级到MybatisPlus3时,oracle自增序列配置的变化,包括config.yml配置文件中OracleKeyGenerator包路径的更新,以及MybatisPlusConfigurer.java中新增的OracleKeyGenerator配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Mybatis Plus 2,oracle 自增序列配置

1. config.yml 配置文件
#mybaits-plus配置,修改主键类型,mapper.xml、type 别名等
mybatis-plus:
  mapper-locations: classpath:/mapper/*Mapper.xml
  global-config:
    #主键类型  0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
    id-type: 1
    # Sequence序列接口实现类配置
    key-generator: com.baomidou.mybatisplus.incrementer.OracleKeyGenerator
2. MybatisPlusConfigurer.java 配置
@Configuration
@MapperScan("user.mapper")
public class MybatisPlusConfigurer {

}
3. 实体配置
@TableName("T_USER")
@KeySequence(value = "SEQ_USER", clazz = Integer.class)
public class User extends Model<User> {

    private static final long serialVersionUID = 1L;

    /**
     * 用户ID
     */
    @TableId(value = "USER_ID", type = IdType.INPUT)
    private Integer userId;
}

二、Mybatis Plus 3,oracle 自增序列配置

1. config.yml 配置文件
#mybaits-plus配置,修改主键类型,mapper.xml、type 别名等
mybatis-plus:
  mapper-locations: classpath:/mapper/*Mapper.xml
  global-config:
    #主键类型  0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
    id-type: 1
    # Sequence序列接口实现类配置
    key-generator: com.baomidou.mybatisplus.extension.incrementer.OracleKeyGenerator

Mybatis Plus 3 已废除此配置,但是配置该属性也不会出错。建议不配置。源代码说明如下:
Mybatis Plus 3 的 key-generator 属性说明

2. MybatisPlusConfigurer.java 配置
@Configuration
@MapperScan("user.mapper")
public class MybatisPlusConfigurer {

	/**
	 * Sequence主键自增
	 *
	 * @return 返回oracle自增类
	 * @author zhenggc
	 * @date 2019/1/2
	 */
	@Bean
	public OracleKeyGenerator oracleKeyGenerator(){
		return new OracleKeyGenerator();
	}
}
3. 实体配置
@TableName("T_USER")
@KeySequence(value = "SEQ_USER", clazz = Integer.class)
public class User extends Model<User> {

    private static final long serialVersionUID = 1L;

    /**
     * 用户ID
     */
    @TableId(value = "USER_ID", type = IdType.INPUT)
    private Integer userId;
}

三、Mybatis Plus 2 升到 Mybatis Plus 3,有两个配置文件存在差异

1. config.yml 配置文件的差异,OracleKeyGenerator 的包路径变了

Mybatis Plus 2 :

key-generator: com.baomidou.mybatisplus.incrementer.OracleKeyGenerator

Mybatis Plus 3 :

key-generator: com.baomidou.mybatisplus.extension.incrementer.OracleKeyGenerator

并且 Mybatis Plus 3 无需配置该属性。

2. MybatisPlusConfigurer.java 配置的差异

Mybatis Plus 2 不需要配置 OracleKeyGenerator 的 bean ,而 Mybatis Plus 3 需要配置 OracleKeyGenerator。

### 如何在 MyBatis Plus 中使用 Oracle 序列进行主键生成 #### 创建序列和触发器 为了使 Oracle 数据库中的表支持自主键,在创建表之前应先定义一个序列以及相应的触发器来自动填充主键字段。例如: ```sql CREATE SEQUENCE TEST_SEQ START WITH 1 INCREMENT BY 1 NOMAXVALUE NOCYCLE CACHE 20; ``` 对于已存在的表,可以通过如下 SQL 创建触发器以确保新记录插入会调用此序列获取下一个值作为 ID[^1]。 #### 配置 `IKeyGenerator` 实现类 为了让 MyBatis Plus 能够识别并利用上述创建好的序列来进行主键分配,可以在 Spring Boot 的配置文件里注册一个实现了接口 `IKeyGenerator` 的 Bean 来指定特定于 Oracle 的逻辑处理方式: ```java @Bean public IKeyGenerator oracleKeyGenerator() { return new OracleKeyGenerator(); } ``` 这段代码片段展示了如何通过 Java Config 方式向应用程序上下文中注入名为 `oracleKeyGenerator` 的 bean,它负责返回一个新的实例对象用于生成唯一标识符。 #### 注解实体属性 当定义好以上组件之后,还需要修改对应的 Entity 类(即 POJO),使其能够正确关联到刚才所建立的数据结构上。具体做法是在代表主键的那个成员变量上方加上两个特殊的注释标签: - 使用 `@KeySequence("SEQUENCE_NAME")` 明确指出要使用的序列名称; - 同应用 `@TableId(type= IdType.INPUT)` 或者省略 type 参数,默认情况下就会采用外部输入的方式完成赋值操作。 ```java @TableId(value="ID",type= IdType.AUTO) private Long id; // or @KeySequence("TEST_SEQ") @TableId(value = "ID") private Integer id; ``` 这里需要注意的是,虽然两者都可以达到目的,但是推荐第二种方法因为它更加直观清晰地表达了意图,并且减少了潜在错误的可能性。 #### 版本差异注意事项 值得注意的一点是不同版本之间可能存在兼容性问题。比如提到过的方法适用于 MyBatis Plus 2.x 版本;而对于更新至 3.x 版本后的项目来说,则可能需要调整部分设置才能正常工作[^3]。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值