Oracle和MySQL中生成32位uuid的方法舉例(國產(chǎn)達(dá)夢同Oracle)
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
代碼層面 (新增時設(shè)置字段自動生成uuid)
twoDeOneMember.setTwoOneRecordUuid(UUID.randomUUID().toString().replaceAll("-","").toUpperCase()); String uId = UUID.randomUUID().toString().replaceAll("-","").toUpperCase();
MySQL中生成UUID
SELECT UUID(); 結(jié)果為:0a3eed30-9ad5-11e9-9835-b8ee6591991d SELECT REPLACE(UUID(), '-', ''); 結(jié)果為:eccc72479ad511e99835b8ee6591991d
1、往數(shù)據(jù)庫中新增一條主鍵為UUID的數(shù)據(jù),常用的方式有如下兩種:
insert into stu VALUES(UUID(),'小明');
2、使用java.util類庫中的方法生成UUID,然后通過傳參的方式插入數(shù)據(jù)庫
String uId = UUID.randomUUID().toString().replaceAll("-","");
3、當(dāng)主鍵為自增id,為了獲取新插入數(shù)據(jù)的主鍵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語句生效,默認(rèn)情況下,其值為false,當(dāng)設(shè)置為true時,表示,若是主鍵列為自增列,允許 JDBC 支持自動生成主鍵,并可將自動生成的主鍵返回。keyColumn,keyProperty是聲明主鍵的數(shù)據(jù)庫字段以及java映射字段,也可以忽略,但是useGeneratedKeys = "true"是必須需要寫得。
在上面的代碼中,生成的自增主鍵可以在com.zzl.Stu類中通過其get方法拿到。
除了上述的1、2、3點(diǎn)概述的方法外,還可以通過如下的方法插入UUID或者獲取自增ID,即靈活使用Mybatis提供的selectKey組件。
1、在插入前獲取UUID,并且作為參數(shù)傳入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語句的參數(shù)id;order值有BEFORE/AFTER兩種,當(dāng)order = "BEFORE"時,表示在執(zhí)行insert語句前,執(zhí)行該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語句執(zhí)行結(jié)束之后執(zhí)行selectKey語句,resultType定義selectKey的返回值。最后可以通過com.zzl.Stu2類中的get方法獲取到返回的自增id。
另外,對于UUID的處理,除了以上方法,還可以引入AOP切面原理,使其達(dá)到全局處理的目的。如下可以作為一個簡單的參考模式,可以根據(jù)實(shí)際的業(yè)務(wù)邏輯進(jìn)行擴(kuò)展。
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() { } /** * 數(shù)據(jù)插入前操作 * * @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注解修飾該類為切面類,如下的操作將切面類的操作進(jìn)行執(zhí)行。@Component注解是使其切面類能被Spring掃描到,并且將其注冊成為Spring容器中的Bean。@PointCut注解定義一個切點(diǎn),且參數(shù)定義了匹配規(guī)則,唯有滿足對應(yīng)的匹配規(guī)則,該切點(diǎn)才得以執(zhí)行。@Before注解指名了在切點(diǎn)執(zhí)行之前,該執(zhí)行哪些具體的業(yè)務(wù)邏輯,因?yàn)槎x該切面類的初衷是在插入前生成UUID。于是在該切面類中,在判斷insert語句中的參數(shù)實(shí)體類是否是BaseEntity或者其子類(這個步驟就是簡單的進(jìn)行過濾),若滿足條件,則在插入前執(zhí)行set方法,將生成的UUID傳至對應(yīng)的參數(shù)中。
于是,每當(dāng)我們執(zhí)行insert開頭的插入語句,該切面類會起作用,會判斷insert中的實(shí)體類是否是BaseEntity或者其子類,若是,則會自動生成UUID,不需要再對UUID值進(jìn)行手動處理,其靈活性會高很多。
總結(jié)
到此這篇關(guān)于Oracle和MySQL中生成32位uuid的文章就介紹到這了,更多相關(guān)Oracle MySQL生成32位uuid內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql explain的用法(使用explain優(yōu)化查詢語句)
mysql explain可以幫助你檢查索引和更好的優(yōu)化查詢語句,今天特地學(xué)習(xí)了下mysql explain的用法,需要的朋友可以參考下2017-01-01MySQL子查詢與HAVING/SELECT的結(jié)合使用
這篇文章主要介紹了MySQL子查詢在HAVING/SELECT字句中使用、及相關(guān)子查詢和WITH/EXISTS字句的使用,具有一定的參考價值,感興趣的可以了解一下2023-06-06