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

 更新时间:2023年08月19日 09:01:34   作者:@解忧杂货铺  
近日遇到朋友问及如何生成UUID,UUID是通用唯一识别码(Universally Unique Identifier)方法,这里给大家总结下,这篇文章主要给大家介绍了关于Oracle和MySQL中生成32位uuid的方法,需要的朋友可以参考下

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<10
SELECT 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-b8ee6591991d
SELECT REPLACE(UUID(), '-', '');
结果为:eccc72479ad511e99835b8ee6591991d

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

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

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

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

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

<insert id="insertStu" parameterType="com.zzl.Stu" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
        insert into tb_flyassess_recdlist
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="name != null and name !='' ">name,</if>
            <if test="sex != null ">sex</if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="name != null and name !='' ">#{name},</if>
            <if test="sex != null ">#{sex}</if>
        </trim>
</insert>

注意:

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

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

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

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

 <insert id="insert" parameterType="com.zzl.Stu">
        <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.string">
            select uuid()
        </selectKey>
        insert into stu(id,name,sex)
        values
        (#{id},#{name},#{sex})
   </insert>

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

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

<insert id="insert" parameterType="com.zzl.Stu2" >
        <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
            select LAST_INSERT_ID()
        </selectKey>
        insert into stu2(id,name, sex)
        values
        (#{id},#{name},#{sex})
</insert>

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;
/**
 * @author zzl
 * @Date 2022/4/11
 * @description
 */
@Aspect
@Component
public class AopTest {
    /**
     *
     * insert开头的方法
     */
    @Pointcut("execution(* **..insert(..))")
    public void insert() {
    }
    /**
     * 数据插入前操作
     *
     * @param joinPoint
     * @throws Exception
     */
    @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值进行手动处理,其灵活性会高很多。

总结

到此这篇关于Oracle和MySQL中生成32位uuid的文章就介绍到这了,更多相关Oracle MySQL生成32位uuid内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SQL字符串以及数字常用操作汇总

    SQL字符串以及数字常用操作汇总

    本篇文章是对SQL字符串以及数字的常用操作进行了详细的总结与分析,需要的朋友参考下
    2013-06-06
  • MySQL数据库导出与导入及常见错误解决

    MySQL数据库导出与导入及常见错误解决

    MySQL数据库导出与导入的过程中将会发生众多不可预知的错误,本文整理了一些常见错误及相应的解决方法,遇到类似情况的朋友可以参考下,希望对大家有所帮助
    2013-07-07
  • 一文了解Mysql分区的使用

    一文了解Mysql分区的使用

    分区允许根据可以设置为任意大小的规则,跨文件系统分配单个表的多个部分,本文主要介绍了Mysql分区的使用,具有一定的参考价值,感兴趣的可以了解一下
    2024-06-06
  • mysql count详解及函数实例代码

    mysql count详解及函数实例代码

    这篇文章主要介绍了mysql count详解及函数实例代码的相关资料,需要的朋友可以参考下
    2017-01-01
  • mysql 查看表大小的方法实践

    mysql 查看表大小的方法实践

    本文主要介绍了mysql 查看表大小的方法实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • Mysql大表全表查询的全过程(分析底层的数据流转过程)

    Mysql大表全表查询的全过程(分析底层的数据流转过程)

    这篇文章主要介绍了Mysql大表全表查询的全过程(分析底层的数据流转过程),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • Scott 数据 映射 MySQL代码实现分享

    Scott 数据 映射 MySQL代码实现分享

    这篇文章主要介绍了Scott 数据 映射 MySQL,文章围绕Scott 数据 映射 MySQL的相关代码分享给大家,具有一定的参考价值,需要的小伙伴可以参考一下,希望对你的学习有所帮助
    2022-02-02
  • 在mac上如何使用终端打开XAMPP自带的MySQL

    在mac上如何使用终端打开XAMPP自带的MySQL

    本文给大家介绍在mac上如何使用终端打开XAMPP自带的MySQL,解决方法非常简单,需要的朋友参考下吧
    2016-12-12
  • myeclipse中连接mysql数据库示例代码

    myeclipse中连接mysql数据库示例代码

    这篇文章主要为大家详细介绍了MyEclipse连接MySQL数据库图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • mysql 5.7.17 安装配置方法图文教程

    mysql 5.7.17 安装配置方法图文教程

    这篇文章主要为大家详细介绍了mysql 5.7.17 安装配置方法图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-06-06

最新评论