利用Java反射生成随机不重复主键算法 发表于 2017-09-24 | 分类于 技术日志 | | 浏览 次 为了练习使用java的反射,写了这个算法,使用@abel533提供的通用Mapper3的同学可以参考此文档 具体实现12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849public 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; }}