问题出现
工作过程中出现了一个很奇葩的需求,在一个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时也能做到项目中既可以设置自增组件,也能兼容字符串主键。