利用Java反射生成随机不重复主键算法

为了练习使用java的反射,写了这个算法,使用@abel533提供的通用Mapper3的同学可以参考此文档

具体实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
public class RandomUtils {
/**
* 获取指定位数的的string随机数,随机范围为a-z A-Z 0-9
*
* @param length string的长度
* @return 指定lenght的随机字符串
*/
public static String randomString(int length) {
String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
Random random = new Random();
StringBuffer buf = new StringBuffer();
for (int i = 0; i < length; i++) {
int num = random.nextInt(62);
buf.append(str.charAt(num));
}
return buf.toString();
}
/**
* 获取随机长度为12的字符串作为@Id标注的不重复主键
*
* @param clazz
* @return
* @throws Exception
*/
public String getRandomPrimaryKey(Class<?> clazz) throws Exception {
String clazzName = clazz.getSimpleName();
Object record = clazz.newInstance();
Mapper<Object> mapper = SpringContextUtil.getBean(clazzName.substring(0, 1).toLowerCase() + clazzName.substring(1) + "Mapper");//从spring中获取到找到实体类对应的Mapper
String primaryKey = null;
for (Field field : clazz.getDeclaredFields()) {
Id annotation = field.getAnnotation(Id.class);//此处的Id是javax.persistence.Id;此方法根据实体字段的@Id注解判断主键,可以用别的方式代替(比如作为参数传入主键)
if (annotation != null) {
primaryKey = field.getName();
break;
}
}
String randomString = RandomUtils.randomString(12);//这里的12是随机主键的长度,可以自定义修改
if (primaryKey != null) {
clazz.getMethod("set" + primaryKey.substring(0, 1).toUpperCase() + primaryKey.substring(1), String.class).invoke(record, randomString);//主键的set方法
} else {
throw new Exception("未找到@Id注解的字段");
}
if (mapper.selectCount(record) > 0) {
return this.getRandomPrimaryKey(clazz);
}
return randomString;
}
}