批量保存到mysql_关于保存批量数据进入mysql
提出的要求:
生成13位純數(shù)字的卡號(hào)與8位純數(shù)字的卡密,要求卡號(hào)與卡密都必須全表唯一,然后保存到mysql。
思路:
1.首先mysql中將這兩個(gè)字段設(shè)置唯一索引,保證這兩個(gè)字段的值在該表中是唯一存在的
2.卡號(hào)是有序增長(zhǎng)的,實(shí)現(xiàn)比較容易,先查詢數(shù)據(jù)庫(kù)中該字段的最大值,然后進(jìn)行增長(zhǎng)生成
3.卡密是無(wú)序的,實(shí)現(xiàn)起來(lái)有些困難,(網(wǎng)上查找和經(jīng)過(guò)多次運(yùn)行結(jié)果,發(fā)現(xiàn)隨機(jī)數(shù)的重復(fù)率是處于最低,所以選定了隨機(jī)生成),查詢數(shù)據(jù)庫(kù)中該字段,將該字段放入map中(為了在生成卡密的時(shí)候進(jìn)行判斷,該卡密是否存在)每次生成唯一的時(shí)候,都會(huì)將值放入該map,生成的卡密放入linedklist中(因?yàn)檫@是個(gè)頻繁的添加操作,linkedlist性能比arraylist性能高)
4.循環(huán)遍歷卡號(hào)(卡號(hào)和卡密數(shù)量是一樣的),然后生成保存的對(duì)象,放入list中
5.重新saveAll()方法(因?yàn)槭褂玫膕pringdatajpa,該saveAll()源碼中是將數(shù)據(jù)進(jìn)行循環(huán)遍歷然后還是一條條的保存,使用了jpa的批量保存配置,設(shè)置后與未配置時(shí)并沒(méi)有多少區(qū)別),進(jìn)行保存。
代碼:
service層的方法
@PersistenceContext()
protected EntityManager entityManager;
public List add(PayGeneralCardFormBean formBean //校驗(yàn)當(dāng)前spAppId是否時(shí)有效期
PayServiceProvider provider = payServiceProviderService.checkSpAppIdAndState(formBean.getSpAppId());
if(null == provider){
return null;
}
//獲取當(dāng)前應(yīng)用最大的批次號(hào)
int maxBatchNumber = findMaxBatchNumber(formBean.getSpAppId());
//獲取最大的卡號(hào)
Long byMaxCardNumber = findByMaxCardNumber();
//獲取所有卡號(hào),由于是寫(xiě)的sql查詢所以數(shù)據(jù)類型變成了BigInteger,后面會(huì)轉(zhuǎn)成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);
}
//生成卡號(hào)
ArrayList cardNumbers = PayCardNumberUtil.createNumber(formBean.getCount(), byMaxCardNumber);
//生成卡密
LinkedList passwords = PayCardPassWordUtil.createPassword(formBean.getCount(),map);
//組裝數(shù)據(jù)
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);
}
//保存數(shù)據(jù)
List payGeneralCards = savaAll(list);
return payGeneralCards;
}
//批量添加數(shù)據(jù)
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++;
}
/**
* 生成一卡通卡號(hào)的方法
* @param count 生成總數(shù)
* @param startNumber 從這個(gè)數(shù)開(kāi)始往后生成
* @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;
}
//唯一一個(gè)在測(cè)試時(shí)沒(méi)有重復(fù)項(xiàng)的方法
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);
}
//如果有值說(shuō)明改卡密已經(jīng)存在了,需要重新再生成
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));
}
}
}
總結(jié)
以上是生活随笔為你收集整理的批量保存到mysql_关于保存批量数据进入mysql的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Qt Label自适应显示Logo图片
- 下一篇: mysql 输出解释怎么看_了解MySQ