日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

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

發(fā)布時(shí)間:2023/12/10 数据库 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 批量保存到mysql_关于保存批量数据进入mysql 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

提出的要求:

生成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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。