批量保存到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.mzph.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…