文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Oracle和MySQL中生成32位uuid的方法(国产达梦同Oracle)

2023-09-01 11:44

关注

Oracle 生成多个GUID值

SELECT sys_guid() from dual connect by rownum<10

Oracle中获取大写小写GUID字符串SQL语句

SELECT upper(rawtohex(sys_guid())) GUID from DUAL connect by rownum<10SELECT lower(rawtohex(sys_guid())) GUID from DUAL connect by rownum<10

代码层面 (新增时设置字段自动生成uuid)

twoDeOneMember.setTwoOneRecordUuid(UUID.randomUUID().toString().replaceAll("-","").toUpperCase());String uId = UUID.randomUUID().toString().replaceAll("-","").toUpperCase();

MySQL中生成UUID

SELECT UUID();结果为:0a3eed30-9ad5-11e9-9835-b8ee6591991dSELECT REPLACE(UUID(), '-', '');结果为:eccc72479ad511e99835b8ee6591991d

往数据库中新增一条主键为UUID的数据,常用的方式有如下两种:

insert into stu VALUES(UUID(),'小明');

使用java.util类库中的方法生成UUID,然后通过传参的方式插入数据库

String uId = UUID.randomUUID().toString().replaceAll("-","");

当主键为自增id,为了获取新插入数据的主键id,通常我们在mybatis中是通过如下方式获取

        insert into tb_flyassess_recdlist                    name,            sex                            #{name},            #{sex}        

注意:useGeneratedKeys只对insert语句生效,默认情况下,其值为false,当设置为true时,表示,若是主键列为自增列,允许 JDBC 支持自动生成主键,并可将自动生成的主键返回。keyColumn,keyProperty是声明主键的数据库字段以及java映射字段,也可以忽略,但是useGeneratedKeys = "true"是必须需要写得。

在上面的代码中,生成的自增主键可以在com.zzl.Stu类中通过其get方法拿到。

除了上述的1、2、3点概述的方法外,还可以通过如下的方法插入UUID或者获取自增ID,即灵活使用Mybatis提供的selectKey组件。

1、在插入前获取UUID,并且作为参数传入insert语句中:

                     select uuid()                insert into stu(id,name,sex)        values        (#{id},#{name},#{sex})   

在selectKey组件中,通过keyProperty来指定insert语句的参数id;order值有BEFORE/AFTER两种,当order = "BEFORE"时,表示在执行insert语句前,执行该selectKey,order = "AFTER"则反之;resultType指定selectKey返回类型。

2、在插入后返回最近的自增主键

                    select LAST_INSERT_ID()                insert into stu2(id,name, sex)        values        (#{id},#{name},#{sex})

select LAST_INSERT_ID()是将最后插入表中自增id查询出来,然后赋值给keyProperty定义的字段中,order = "AFTER",表示在insert语句执行结束之后执行selectKey语句,resultType定义selectKey的返回值。最后可以通过com.zzl.Stu2类中的get方法获取到返回的自增id。

另外,对于UUID的处理,除了以上方法,还可以引入AOP切面原理,使其达到全局处理的目的。如下可以作为一个简单的参考模式,可以根据实际的业务逻辑进行扩展。

package com.zzl.aop; import org.springframework.stereotype.Component; import java.lang.reflect.Method;import java.util.UUID; @Aspect@Componentpublic class AopTest {          @Pointcut("execution(* **..insert(..))")    public void insert() {    }         @Before(value = "insert()")    public void insertBefore(JoinPoint joinPoint) throws Exception {        Object[] obj = joinPoint.getArgs();         for (Object argItem : obj) {            if (BaseEntity.class.isAssignableFrom(argItem.getClass())) {                Method setId = argItem.getClass().getMethod("setId", String.class);                setId.invoke(argItem, UUID.randomUUID().toString().replaceAll("-", ""));            }        }    } } 

如上代码中,@Aspect注解修饰该类为切面类,如下的操作将切面类的操作进行执行。@Component注解是使其切面类能被Spring扫描到,并且将其注册成为Spring容器中的Bean。@PointCut注解定义一个切点,且参数定义了匹配规则,唯有满足对应的匹配规则,该切点才得以执行。@Before注解指名了在切点执行之前,该执行哪些具体的业务逻辑,因为定义该切面类的初衷是在插入前生成UUID。于是在该切面类中,在判断insert语句中的参数实体类是否是BaseEntity或者其子类(这个步骤就是简单的进行过滤),若满足条件,则在插入前执行set方法,将生成的UUID传至对应的参数中。

于是,每当我们执行insert开头的插入语句,该切面类会起作用,会判断insert中的实体类是否是BaseEntity或者其子类,若是,则会自动生成UUID,不需要再对UUID值进行手动处理,其灵活性会高很多。

来源地址:https://blog.csdn.net/UTF8_8/article/details/130926564

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯