批量保存到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));

}

}

}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/271993.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/271993.shtml
英文地址,請注明出處:http://en.pswp.cn/news/271993.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SpringCloud主要組件

SpringCloud主要組件 SpringCloud組件停更說明

求數組中的最小子數組,時間復雜度o(n),java

石家莊鐵道大學 信1405-1 班 唐炳輝 題目&#xff1a;給定一個整數數組&#xff0c;找到一個具有最小和的子數組。返回其最小和。 設計思路&#xff1a;兩個變量 &#xff0c;一個記錄當前并入的數組的值&#xff0c;另外一個記錄所算過得最大的數組的值,當并入的值為小于…

mysql 輸出解釋怎么看_了解MySQL中EXPLAIN解釋命令

1 EXPLAIN概念EXPLAIN會向我們提供一些MySQL是執行sql的信息&#xff1a;EXPLAIN可以解釋說明 SELECT, DELETE, INSERT, REPLACE, and UPDATE 等語句.當EXPLAIN與可解釋的語句一起使用時&#xff0c;mysql會顯示一些來自于優化器的關于sql執行計劃的信息。即mysql解釋它是如何處…

MYSQL數據庫默認latin1字符集轉換為GBK或UTF8

可以采用下面的方法latin1字符集轉換為gbk字符集或utf8字符集。具體的轉換步驟如下&#xff1a;一、latin1轉gbk1、導出數據庫mysqldump --default-character-setlatin1 -h 數據庫連接ip -u root -P 3306 -p數據庫密碼 db_name table_name > /usr/home/test/table_name.sql2…

【Post工具】PostMan 他媳婦 PostWoman

一個免費&#xff0c;快速&#xff0c;美觀的API請求構建器&#xff0c;可以替代 Postman。 測試網址&#xff1a; https://postwoman.io/ 下載地址 https://github.com/liyasthomas/postwoman 主要特性&#xff1a; 支持自定義換膚支持權限支持參數、請求體支持 PWA支持歷…

MYSQL統計和識別重復值

1、查詢和計算表person_tbl中&#xff08;last_name&#xff0c;first_name&#xff09;組合有重復的記錄的數量。mysql> SELECT COUNT (*) AS repetitions, last_name, first_nameFROM person_tbl GROUP BY last_name, first_nameHAVING repetitions > 1;2、從結果集中…

main spring啟動_SpringBoot學習(一):為什么main方法啟動類需要放在項目根目錄...

一、概述使用SpringBoot的應用是需要將應用代碼編譯打包成jar包&#xff0c;然后基于main方法的方式來獨立啟動這個應用&#xff0c;使得該應用作為一個獨立進程運行。這是跟傳統的將項目打包成war包&#xff0c;然后部署到tomcat服務器去運行的一個區別。而在應用當中&#xf…

學習筆記~~~~LinkedHashMap

LinkedHashMap實現了Map接口&#xff0c;繼承了HashMap 應用場景 HashMap是無序的&#xff0c;當我們希望有順序地去存儲key-value時&#xff0c;就需要使用LinkedHashMap了。 我們是按照7、2、3、4 的順序插入的&#xff0c;但是輸出結果并不是按照順序的。 同樣的數據&…

[轉]Mysql Join語法解析與性能分析

轉自&#xff1a;http://www.cnblogs.com/BeginMan/p/3754322.html 一&#xff0e;Join語法概述 join 用于多表中字段之間的聯系&#xff0c;語法如下&#xff1a; ... FROM table1 INNER|LEFT|RIGHT JOIN table2 ON conditiona table1:左表&#xff1b;table2:右表。 JOIN 按照…

css radial-gradient 徑向漸變基本語法與使用

在之前的文章《深入理解Css linear-gradient線性漸變》我們了解了CSS中的線性漸變&#xff0c;本文將介紹CSS中的另一種漸變———徑向漸變&#xff08;Radial Gradient&#xff09;&#xff1a; CSS中的徑向漸變&#xff08;Radial Gradient&#xff09;允許你創建從一個顏色…

華為鴻蒙系統技術細節盤點

面對安卓的限制&#xff0c;華為似乎十分淡定從容&#xff0c;絲毫都不慌&#xff0c;華為的底氣&#xff0c;很大原因來自華為自研的操作系統——鴻蒙系統&#xff01;鴻蒙系統剛提出來的時候就在各界媒體中炸開了花&#xff0c;花粉們對其關注程度也是只增不減&#xff0c;那…

spring boot2.x設置session有效時間_Spring 源碼解析 Scopes 之 Request 、Session 、Application...

(給ImportNew加星標&#xff0c;提高Java技能)轉自&#xff1a;開源中國&#xff0c;作者&#xff1a;麥克斯鏈接&#xff1a;my.oschina.net/wang5v/blog/3017934Request、Session、Application概念在這篇Spring源碼解析-Singleton Scope(單例)和Prototype Scope(多例)博客中介…

[SQLite]使用記錄

1. 自增列 1.1 隱藏的 rowid 1.2 顯式創建 ID INTEGER PRIMARY KEY AUTOINCREMENT 其中 ID 可以改變為實際列名 使用自增長字段&#xff0c;引擎會自動產生一個sqlite_sequence表 sqlite3_last_insert_rowid() 返回最后插入的ID 2. 下載 SQLite 時&#xff0c;要選擇 靜態的不…

學習筆記~~~~~TreeMap

TreeMap繼承了AbstractMap類&#xff0c;實現了NavigableMap、Cloneable、Serializable 接口 TreeMap也是一個很常用的map實現類&#xff0c;因為他具有一個很大的特點就是會對Key進行排序&#xff0c;使用了TreeMap存儲鍵值對&#xff0c;再使用iterator進行輸出時&#xff0c…

程序員別再迷茫,賺錢,方法比你想的更多

每次打開公號&#xff0c;撲面而來一陣陣焦慮&#xff1a;95后畢業3個月就買房&#xff0c;你的同齡人正在拋棄你畢業3年&#xff0c;年薪超100萬&#xff1a;賺錢&#xff0c;是一種修行一線城市財務自由門檻2.9億&#xff0c;看看你還差多少說來說去就是&#xff0c;牛人跑得…

Mac 創建本地Mysql_2018-09-25:mac下創建本地數據庫mysql

問題&#xff1a;如何在mac系統下&#xff0c;創建本地數據庫mysql&#xff1f;過程&#xff1a;1.安裝brew install mysql2.啟動mysql過程中遇到的問題&#xff1a;(1)ERROR 2002 (HY000): Cant connect to local MySQL server through socket /tmp/mysql.sock (2)解決過程&am…

.NET Core 學習資料精選:入門

開源跨平臺的.NET Core&#xff0c;還沒上車的趕緊的&#xff0c;來不及解釋了……本系列文章&#xff0c;主要分享一些.NET Core比較優秀的社區資料和微軟官方資料。我進行了知識點歸類&#xff0c;讓大家可以更清晰的學習.NET Core。首先感謝資料原作者的貢獻。第一篇&#x…

學習筆記~~~~~Set接口實現

Java中提供了HashSet、TreeSet、LinkedHashSet三種常用的Set實現&#xff0c;以下具體分析它們的用法和性能。 我們使用Set的原因是Set集合不包含重復元素&#xff0c;HashSet、TreeSet和LinkedHashSet三種類型什么時候使用它們&#xff0c;使用哪個這是一個很重要的選擇性問題…

15句喬布斯經典語錄(中英文)

1.Life is brief, and then you die, you know&#xff1f;人生短暫&#xff0c;過著過著你就沒了&#xff0c;明白么&#xff1f;2.Innovation distinguishes between a leader and a follower.領袖和跟風者的區別就在于創新。3.Were here to put a dent in the universe. Oth…

HashOperations

存儲格式&#xff1a;Key>(Map<HK,HV>) 1.put(H key, HK hashKey, HV value) putAll(H key, java.util.Map<? extends HK,? extends HV> m) 2.get(H key, java.lang.Object hashKey) multiGet(H key, java.util.Collection<HK> hashKeys) &#xff1…