赞
踩
SELECT sys_guid() from dual connect by rownum<10
- 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();
- 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>
在上面的代码中,生成的自增主键可以在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值进行手动处理,其灵活性会高很多。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。