mybatis新增对象自动生成uuid方案

mybatis新增对象时, 使用拦截器自动生成uuid方案
有了它不再去xml中手动添加selectKey了, 生成id方案实现类自行实现, 实现IdGenerator接口便可, 主要代码由公司同事编写, 我进行改造

使用时可以在id字段上添加@Id注解, 也可以在getId方法上添加或者不添加, 但是主键名字必须是id, 类型必须是String

@Target({ METHOD, FIELD })
@Retention(RUNTIME)
public @interface Id {

	Class<?> strategy() default UUIDGenerator.class;
}

  

public interface IdGenerator {

    Serializable generator();
}

  

public class PropertySet {

	private Set<ProPertyStrategyMapper> propertys = new HashSet<ProPertyStrategyMapper>();

	private Class<?> entity;

	@SuppressWarnings("unused")
	private PropertySet() {

	}

	public PropertySet(Class<?> entity) {
		this.entity = entity;
		this.build();
	}

	public Set<ProPertyStrategyMapper> getPropertys() {
		return propertys;
	}

	public void setPropertys(Set<ProPertyStrategyMapper> propertys) {
		this.propertys = propertys;
	}

	public PropertySet build() {
        List<Field> fieldList = new ArrayList<>();
        Class clazz = entity;
        while (null != clazz) {
            Field[] declaredFields = clazz.getDeclaredFields();
            fieldList.addAll(Arrays.asList(declaredFields));
            clazz = clazz.getSuperclass();
        }
		for (Field field : fieldList) {
			if ("serialVersionUID".equals(field.getName()))
                continue;
            field.setAccessible(true);
			PropertyDescriptor propertyDescriptor = null;
			try {
				propertyDescriptor = new PropertyDescriptor(field.getName(), entity);
			} catch (IntrospectionException e) {
				e.printStackTrace();
			}
			if (propertyDescriptor == null)
				continue;
			// 获取类的get方法
			Method method = propertyDescriptor.getReadMethod();
			if (method == null) {
				continue;
			}
            if (field.isAnnotationPresent(Id.class)) {
                Id id = field.getAnnotation(Id.class);
                if (null == id.strategy()) {
                    continue;
                }
                Class<?> strategy = id.strategy();
                Object newInstance = null;
                try {
                    newInstance = strategy.newInstance();
                } catch (InstantiationException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
                if (!(newInstance instanceof IdGenerator)) {
                    continue;
                }
                IdGenerator idGenerator = (IdGenerator) newInstance;
                ProPertyStrategyMapper proPertyStrategyMapper = new ProPertyStrategyMapper(field.getName(),
                        idGenerator);
                propertys.add(proPertyStrategyMapper);
            }
			else if (method.isAnnotationPresent(Id.class)) {
				Id id = method.getAnnotation(Id.class);
				if (id.strategy() == null) {
					continue;
				}
				Class<?> generator = id.strategy();
				Object object = null;
				try {
					object = generator.newInstance();
				} catch (InstantiationException e) {
					e.printStackTrace();
				} catch (IllegalAccessException e) {
					e.printStackTrace();
				}
				if (!(object instanceof IdGenerator)) {
					continue;
				}
				IdGenerator idGenerator = (IdGenerator) object;
				ProPertyStrategyMapper proPertyStrategyMapper = new ProPertyStrategyMapper(field.getName(),
						idGenerator);
				propertys.add(proPertyStrategyMapper);
				break;
			} else if (String.class.equals(field.getType()) && "id".equalsIgnoreCase(field.getName())) {
                IdGenerator idGenerator = new UUIDGenerator();
                ProPertyStrategyMapper proPertyStrategyMapper = new ProPertyStrategyMapper(field.getName(),
                        idGenerator);
                propertys.add(proPertyStrategyMapper);
            }
		}
		return this;
	}
}

  

public class ProPertyStrategyMapper {

	private String propertyName;
	private IdGenerator generator;

	public ProPertyStrategyMapper(String propertyName, IdGenerator generator) {
		super();
		this.propertyName = propertyName;
		this.setGenerator(generator);
	}

	public String getPropertyName() {
		return propertyName;
	}

	public void setPropertyName(String propertyName) {
		this.propertyName = propertyName;
	}

	public IdGenerator getGenerator() {
		return generator;
	}

	public void setGenerator(IdGenerator generator) {
		this.generator = generator;
	}

}

  

public class UUIDGenerator implements IdGenerator {

	@Override
	public Serializable generator() {
	    // 自行修改此处生成id方案
        return UUID.randomUUID().toString();
	}

}

  

@Intercepts({ @Signature(type = Executor.class, method = "update", args = { MappedStatement.class, Object.class }) })
public class UUIDInterceptor implements Interceptor {

	@Override
	public Object intercept(Invocation invocation) throws Throwable {

		Object[] args = invocation.getArgs();
		if (args == null || args.length != 2 || !(args[0] instanceof MappedStatement) || (args[1] instanceof Map)) {
			return invocation.proceed();
		}
		MappedStatement mappedStatement = (MappedStatement) args[0];
		SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType();
		if (!SqlCommandType.INSERT.equals(sqlCommandType)) {
			return invocation.proceed();
		}
		setDefultProperty(args[1]);
		return invocation.proceed();
	}

	public void setDefultProperty(Object obj) {

		PropertySet propertySet = new PropertySet(obj.getClass());
		Set<ProPertyStrategyMapper> propers = propertySet.getPropertys();
		if (propers == null || propers.isEmpty())
			return;
		for (ProPertyStrategyMapper pro : propers) {
			try {
				BeanUtils.setProperty(obj, pro.getPropertyName(), pro.getGenerator().generator());
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			} catch (InvocationTargetException e) {
				e.printStackTrace();
			}
		}
	}

	@Override
	public Object plugin(Object target) {
		return Plugin.wrap(target, this);
	}

	@Override
	public void setProperties(Properties properties) {
		System.out.println("init UUIDInterceptor");
	}

}

  

原文地址:https://www.cnblogs.com/bangiao/p/10201449.html

时间: 2024-10-11 21:53:52

mybatis新增对象自动生成uuid方案的相关文章

mybatis使用generator自动生成代码时的类型转换

使用mybatis的generator自动生成代码,但是oracle数据库中number(6,2)总是自动转成BigDecimal,我想要转成的是float类型 这样就写了一个类型转换器,需要继承JavaTypeResolver接口 然后在mybaties配置文件generatorConfig.xml中类型转换配置位置添加上即可 <javaTypeResolver type="com.generator.MyJavaTypeResolver"> <property n

solr亿万级索引优化实践-自动生成UUID

solr亿万级索引优化实践(三) 原创 2017年03月14日 17:03:09 本篇文章主要介绍下如何从客户端solrJ以及服务端参数配置的角度来提升索引速度. solrJ6.0提供的Java客户端主要有下面几种接口:HttpSolrClient,ConcurrentUpdateSolrClient,CloudSolrClient.下面分别对这三种接口做一个简单的比较.HttpSolrClient在定义的时候需要明确指定一个solr节点路径,他在提交数据的时候也只能提交到这个节点上:Concu

JAVA入门[7]-Mybatis generator(MBG)自动生成mybatis代码

一.新建测试项目 新建Maven项目MybatisDemo2,修改pom.xml引入依赖.dependencies在上节基础上新增 <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.3.2</version> </dependency>

MyBatis使用Generator自动生成代码

MyBatis中,可以使用Generator自动生成代码,包括DAO层. MODEL层 .MAPPING SQL映射文件. 第一步:下载MyBatis的Generator工具 http://mybatis.github.io/generator/ 第二步:配置自动生成代码所需的XML配置文件,例如(generator.xml) 将这个文件保存至你下载的mybatis-generator-core-1.3.2文件夹下 第三步:进入XML配置文件(generator.xml)所在的的目录并执行命令:

mybatis利用maven自动生成mapper、xml、domain

第一种方式: 配置maven插件 在src/main/resources下新建generatorConfig.xml   内容如下: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "ht

Mybatis使用generator自动生成映射配置文件信息

 使用mybatis配置映射文件比较的麻烦,但是有自动生成jar工具,方便加速开发速度,下面主要是该工具的使用以及相关的配置. 1.下载相关的资源 我们需要下载mybatis-generator-core-1.3.2.jar,mysql-connector-java-5.1.34.jar(对应相关数据库的驱动包),generator.xml(配置文件)  我的网盘全部相关下载地址:http://pan.baidu.com/s/1ntn48pb 下载解压后会有 generator.xml  和两个

spring和mybatis集成,自动生成model、mapper,增加mybatis分页功能

软件简介 Spring是一个流行的控制反转(IoC)和面向切面(AOP)的容器框架,在java webapp开发中使用广泛.http://projects.spring.io/spring-framework/ MyBatis是一个基于Java的数据持久层框架,其原名是iBatis,在升级到3.0版本后,更名为MyBatis.https://github.com/mybatis/mybatis-3/ MyBatis Generator是一个MyBatis的代码生成器,通过配置,可自动生成数据操作

帕莱克P1500-PSC对刀仪的量测管理和NC代码自动生成技改方案

本文针对Parlec 帕莱克P1500-PSC刀具对刀仪, 进行技术改造, 完成对测量结果的管理和NC代码的自动生成. 客户反馈相当不错. 如果有谁需要定制开发, 可以联系我, [email protected] 简述一下技改的背景, 以及目标. 大家都知道, 机械加工刀具都会有磨损的, 在加工中心加工之前都需要先量测一下刀具的一些关键尺寸(比如高度/半径/夹角等). 然后根据这些尺寸对加工程序(NC程序)进行微调, 这样才能保证加工产品尺寸精度. 客户公司有一台Parlec 帕莱克P1500-

新增时自动生成流水号ID

在项目中,新增某条记录的时候,为了定义某个不可重复的值,会采用自动生成流水号的方式来定义这个值.根据需要,定义的方法也多种多样,比如日期加3位流水号(例:20180115001).因此了解到两种生成流水号的方法: 一.Java生成流水号 生成流水号格式为yyyyMMddXXXX import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.Date; public class Primary