在实际开发中碰到一个需求,需要大量不重复的验证码或者兑换码,首先想到的是采用UUID来生成,但实际运用不合适因为采用UUID生成的字符串太长。所以下面我们自己生成十万的测试数据。为了快速排除生成的字符串是否重复我们可以将数据插入到数据库使用数据库的distinct方法。
开发工具:idea
开发jar包:mysql-connector-java-5.1.34-bin.jar
package cn.bjyy.demo;
import cn.bjyy.utils.JdbcUtils;
import org.junit.Test;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class CdkeyDemo {
static List<String> list=new ArrayList<String>();
public static String getStringRandom(int length) {
String val = "";
Random random = new Random();
// 参数length,表示生成几位随机数
for (int i = 0; i < length; i++) {
String charOrNum = random.nextInt(2) % 2 == 0 ? "char" : "num";
// 输出字母还是数字
if ("char".equalsIgnoreCase(charOrNum)) {
// 输出是大写字母还是小写字母
int temp = random.nextInt(2) % 2 == 0 ? 65 : 97;
val += (char) (random.nextInt(26) + temp);
} else if ("num".equalsIgnoreCase(charOrNum)) {
val += String.valueOf(random.nextInt(10));
}
}
return val;
}
public static void main(String[] args) {
try {
generalInsert();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void generalInsert() throws ClassNotFoundException,SQLException{
long start = System.currentTimeMillis();
Class.forName("com.mysql.jdbc.Driver");
//数据库链接 账号密码自己替换
Connection connection = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/CDKEY", "root", "xxx");
connection.setAutoCommit(false);
PreparedStatement cmd = connection
.prepareStatement("insert into CD_KEY(TKEY,STATUS) values(?,?)");
//生成十万条不同的十位数兑换码 当然我是简化验证添加数据。实际中我们可以将数据放入list或者缓存
for (int i = 0; i < 100000; i++) {
//cmd.setInt(1,i);
//自定义位数建议8位数以上,这个如果生成数据特别大的话有重复可能
String stringRandom = getStringRandom(10);
System.out.println(stringRandom);
cmd.setString(1, stringRandom);
cmd.setInt(2, 0);
cmd.executeUpdate();
}
connection.commit();
cmd.close();
connection.close();
//long end = System.currentTimeMillis();
//System.out.println(end - start);//
}
}
最后如果添加数据库十万条数据成功后我们打开数据使用sql语句再次检验是否重复
SELECT 字段名,COUNT(*) FROM 表名 GROUP BY 字段名 HAVING COUNT(*) > 1;
SELECT DISTINCT 字段名 FROM 表名;去重查询显示的条数和插入数据的条数一致证明没有重复数据。