Zohan
  • 首页
  • Java
  • JavaScript
  • Nginx
  • About
  1. 首页
  2. zohan
  3. 详细信息
spring 集成mybatis使用32位UUID自动填充实体类:zohan 发布于:2017年04月27日 阅读次数:6006
spring 集成mybatis使用32位UUID自动填充实体类


Mybatis提供了主键生成器接口KeyGenerator,其实现类的主键生成策略根据不同的数据库类型实现自增或者序列。

我们想使用UUID来实现自己的业务,如何实现呢?

  1.  UUID生成器

  通过jvm,时间、机器ip 生成hex的32位值,具体可以参考hibernate的UUIDHexGenerator

  1.  AutoUUID 注解

  通过注解,标示需要自动填充的uuid的实体类

  1.  实体类父类

  统一实体类的主键,方便uuid的注入;如主键不统一,在注入的过程中可以使用,注解或者其他的方式辨识。

  1. spring aop

  通过使用spring 的aop技术来切面拦截dao层的save方法,小伙伴们的不同包名、类名、方法名可以通过aop的配置灵活运用。

  1.  代码干活

  •  实体类父类


  public abstract class BaseEntity<PK extends Serializable> implements Serializable, Cloneable {
    /* 实体的主键 */
    public abstract PK getId();
    /* 设置实体的主键值*/
    public abstract void setId(PK id);
}


  •  AutoUUID 注解


@Target({ TYPE})
@Retention(RUNTIME)
public @interface AutoUUID {
}



  •  拦截处理


public class GeneratedUUIDInterceptor {
    /**
     * 检测是否是BaseEntity子类,并且带有AutoUUID注解的新增方法,自动生成uuid
     * @param joinPoint
     */
    public void checkUUID(JoinPoint joinPoint) {
        for (Object entity : joinPoint.getArgs()) {
            if (entity instanceof BaseEntity && entity.getClass().getAnnotation(AutoUUID.class) != null) {
                BaseEntity e = (BaseEntity) entity;
                e.setId(UIDGenerator.getInstance().createUID());
            }
        }
    }
}



  • spring aop



 <bean id="generatedUUID" class="com.zohan.sdk.interceptor.myBatis.GeneratedUUIDInterceptor"/>
 <aop:config>
       <aop:aspect id="secutityAspect" ref="generatedUUID">
           <aop:pointcut id="saveMethod" expression="execution(* com.zohan..dao..save*(..)) "/>
           <aop:before method="checkUUID" pointcut-ref="saveMethod"/>
       </aop:aspect>
   </aop:config>



  •  示例



public class Scheduler extends BaseEntity<String> {
    //id
    private String id;



  • Spring
  • MyBatis
本文由 zohan 创作,采用 CC BY 3.0 CN协议 进行许可。 可自由转载、引用,但需署名作者且注明文章出处,本文地址:/blog/26.html
打赏
支付宝打赏
微信打赏
Copyright © 2013-2025 zohan.cc 版权所有 .京ICP备15012738号-4
京公网安备11010802015888