Springboot整合Mybatis-plus与oracle的项目主键类型问题

问题出现

工作过程中出现了一个很奇葩的需求,在一个Springboot整合Mybatis-plus搭的一个项目中,数据库用的oracle。老大说,考虑到之后的客户需求,可能某些表需要用字符串作为主键,某些可以用数字作为主键。
一个项目难道不是应该统一表的主键类型嘛,我一时很纳闷,但是老大既然这么说了,那就想办法实现吧。

Mybatis-plus配置

以下是Mybatis-plus的配置:

# mybatis-plus配置
mybatis-plus:
  mapper-locations: classpath*:mapper/**/*.xml
  #实体扫描,多个package用逗号或者分号分隔
  typeAliasesPackage: com.xquant.xcrms.modules.*.entity
  global-config:
    #主键类型  0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
    id-type: 0
    #序列接口实现类配置
    key-generator: com.baomidou.mybatisplus.incrementer.OracleKeyGenerator
    #字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断"
    field-strategy: 2
    #驼峰下划线转换
    db-column-underline: true
    #刷新mapper
    refresh-mapper: true
    #逻辑删除配置
    logic-delete-value: -1
    logic-not-delete-value: 0
    #自定义SQL注入器
    sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector
  configuration:
    map-underscore-to-camel-case: true
    cache-enabled: false
    call-setters-on-nulls: true
    jdbc-type-for-null: 'null'

可以看到在这里能配置整个项目的主键类型。但是老大说自增组件和uuid主键全部都要。

sys_guid()

百度以下,SYS_GUID (),是Oracle 8i 后提供的函数。SYS_GUID产生并返回一个全球唯一的标识符(原始值)由16个字节组成。在大多数平台,生成的标识符由主机标符,执行函数的进程或者线程标识符,和进程或线程的一个非重复的值(字节序列)。
sys_guid()百度百科
利用这个函数,我们可以在插入oracle数据库时,不用手动设置字符串类型主键,也不同担心唯一性问题,oracle能帮助我们自动生成。
在这里插入图片描述

解决方案

既然老大说两个都要,那么我们在Mybatis-plus配置中还是设置成自增类型。然后在需要用自增主键的Entity中指定序列,然后加上相应注解。如下
在这里插入图片描述
这样,自增主键搞定。
还是同一个项目中,若有需要用String类型作为主键的,则不用再Entity中指定序列,常规配置即可:
在这里插入图片描述
利用postman测试如下:
在这里插入图片描述
结果:
在这里插入图片描述

结论

通过oracle自带的函数sys_guid(),我们可以轻易的实现字符串类型主键的自动生成问题,不用在代码中生成。同时在搭配Mybatis-plus时也能做到项目中既可以设置自增组件,也能兼容字符串主键。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
MyBatis-Plus 中处理 Oracle 数据库的联合主键大数据量批量更新,可以按照以下步骤进行操作: 1. 确保你已经定义了对应的实体类,并在实体类中使用 `@TableId` 注解标识联合主键字段。 ```java @Data @TableName("your_table_name") public class YourEntity { @TableId(type = IdType.INPUT) private Long key1; @TableId(type = IdType.INPUT) private Long key2; // 其他属性 } ``` 2. 创建一个 Mapper 接口,继承自 `BaseMapper` 并指定实体类作为泛型参数。 ```java @Repository public interface YourMapper extends BaseMapper<YourEntity> { } ``` 3. 在 Service 层中使用 MyBatis-Plus 提供的方法进行批量更新操作。具体来说,可以使用 `updateBatchById` 方法。 ```java @Service public class YourService { private final YourMapper yourMapper; @Autowired public YourService(YourMapper yourMapper) { this.yourMapper = yourMapper; } public void batchUpdate(List<YourEntity> entityList) { yourMapper.updateBatchById(entityList); } } ``` 4. 在 Oracle 数据库中,由于不支持直接使用 `(key1, key2) in` 的语法,可以通过使用临时来实现批量更新。首先,创建一个临时,用于存储批量更新的数据。 ```sql CREATE GLOBAL TEMPORARY TABLE temp_table ( key1 NUMBER, key2 NUMBER ) ON COMMIT PRESERVE ROWS; ``` 5. 接下来,在批量更新方法中使用原生 SQL 来执行批量更新操作。 ```java @Repository public interface YourMapper extends BaseMapper<YourEntity> { @Update("INSERT INTO temp_table (key1, key2) VALUES (#{item.key1}, #{item.key2})") void insertIntoTempTable(@Param("item") YourEntity item); @Update("UPDATE your_table_name t SET column1 = ?, column2 = ? WHERE EXISTS (SELECT 1 FROM temp_table WHERE t.key1 = temp_table.key1 AND t.key2 = temp_table.key2)") void batchUpdate(); } ``` 在上述示例中,我们使用 `insertIntoTempTable` 方法将批量更新的数据插入临时中,然后使用 `batchUpdate` 方法执行批量更新操作。在 `batchUpdate` 方法中,我们使用原生 SQL 来更新目标的数据,通过与临时关联来实现根据联合主键批量更新的效果。 最后,调用 `batchUpdate` 方法即可执行批量更新操作。 请确保在配置文件中配置好数据库连接信息和相关的 MyBatis-Plus 配置。希望对你有所帮助!如果有任何疑问,请随时提问。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值