批量保存到mysql_关于保存批量数据进入mysql

提出的要求:

生成13位纯数字的卡号与8位纯数字的卡密,要求卡号与卡密都必须全表唯一,然后保存到mysql。

思路:

1.首先mysql中将这两个字段设置唯一索引,保证这两个字段的值在该表中是唯一存在的

2.卡号是有序增长的,实现比较容易,先查询数据库中该字段的最大值,然后进行增长生成

3.卡密是无序的,实现起来有些困难,(网上查找和经过多次运行结果,发现随机数的重复率是处于最低,所以选定了随机生成),查询数据库中该字段,将该字段放入map中(为了在生成卡密的时候进行判断,该卡密是否存在)每次生成唯一的时候,都会将值放入该map,生成的卡密放入linedklist中(因为这是个频繁的添加操作,linkedlist性能比arraylist性能高)

4.循环遍历卡号(卡号和卡密数量是一样的),然后生成保存的对象,放入list中

5.重新saveAll()方法(因为使用的springdatajpa,该saveAll()源码中是将数据进行循环遍历然后还是一条条的保存,使用了jpa的批量保存配置,设置后与未配置时并没有多少区别),进行保存。

代码:

service层的方法

@PersistenceContext()

protected EntityManager entityManager;

public List add(PayGeneralCardFormBean formBean){

//校验当前spAppId是否时有效期

PayServiceProvider provider = payServiceProviderService.checkSpAppIdAndState(formBean.getSpAppId());

if(null == provider){

return null;

}

//获取当前应用最大的批次号

int maxBatchNumber = findMaxBatchNumber(formBean.getSpAppId());

//获取最大的卡号

Long byMaxCardNumber = findByMaxCardNumber();

//获取所有卡号,由于是写的sql查询所以数据类型变成了BigInteger,后面会转成Long

List cardPasswordfindAll = payGeneralCardDao.cardPasswordfindAll();

HashMap map = new HashMap<>();

List cardPasswords = cardPasswordfindAll.stream().map(item-> item.longValue()).collect(Collectors.toList());

for(Long cardPassword:cardPasswords){

map.put(cardPassword.toString(),true);

}

//生成卡号

ArrayList cardNumbers = PayCardNumberUtil.createNumber(formBean.getCount(), byMaxCardNumber);

//生成卡密

LinkedList passwords = PayCardPassWordUtil.createPassword(formBean.getCount(),map);

//组装数据

LinkedList list = new LinkedList<>();

for(int i = 0;i

PayGeneralCard bean = createBean(formBean.getSpAppId(), formBean.getType(), cardNumbers.get(i),

passwords.get(i), maxBatchNumber);

list.add(bean);

}

//保存数据

List payGeneralCards = savaAll(list);

return payGeneralCards;

}

//批量添加数据

public List savaAll(List payGeneralCards){

ArrayList list = new ArrayList<>(16);

for(PayGeneralCard payGeneralCard : payGeneralCards){

entityManager.persist(payGeneralCard);

list.add(payGeneralCard);

}

return list;

}

PayCardNumberUtil

import java.util.ArrayList;

public class PayCardNumberUtil {

private static long seq = 1000000000000l;

private static final long ROTATION = 9999999999999l;

public static synchronized long next() {

if (seq > ROTATION) seq = 1000000000000l;

return seq++;

}

/**

* 生成一卡通卡号的方法

* @param count 生成总数

* @param startNumber 从这个数开始往后生成

* @return

*/

public static ArrayList createNumber(long count,long startNumber){

if(seq < startNumber){

seq = startNumber;

}

ArrayList list = new ArrayList<>();

for (int i = 0; i < count; i++) {

long next = PayCardNumberUtil.next();

list.add(next);

}

return list;

}

public static void main(String[] args) {

System.out.println(PayCardNumberUtil.createNumber(10l, 2004000000057l));

}

}

PayCardPassWordUtil

import java.util.*;

/**

* 一卡通密码生成器

*

* @author nature

* @create 2017-12-22 10:58

*/

public class PayCardPassWordUtil {

public static LinkedList createPassword(Long count,Map map){

LinkedList list = new LinkedList<>();

for (int i = 0; i < count; i++) {

String number = generateUID(map);

list.add(Long.parseLong(number));

}

return list;

}

//唯一一个在测试时没有重复项的方法

public static String generateUID(Map map){

Random random = new Random();

String result="";

for(int i=0;i<8;i++){

//首字母不能为0

result += (random.nextInt(9)+1);

}

//如果有值说明改卡密已经存在了,需要重新再生成

if(null != map.get(result)){

return generateUID(map);

}

map.put(result,true);

return result;

}

public static void main(String[] args) {

Map map = new HashMap();

for (int i = 0; i < 1000; i++) {

System.out.println(generateUID(map));

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值