关于保存批量数据进入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<PayGeneralCard> 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<BigInteger> cardPasswordfindAll = payGeneralCardDao.cardPasswordfindAll();
HashMap<String, Boolean> map = new HashMap<>();
List<Long> cardPasswords = cardPasswordfindAll.stream().map(item-> item.longValue()).collect(Collectors.toList());
for(Long cardPassword:cardPasswords){
map.put(cardPassword.toString(),true);
} //生成卡号
ArrayList<Long> cardNumbers = PayCardNumberUtil.createNumber(formBean.getCount(), byMaxCardNumber); //生成卡密
LinkedList<Long> passwords = PayCardPassWordUtil.createPassword(formBean.getCount(),map); //组装数据
LinkedList<PayGeneralCard> list = new LinkedList<>();
for(int i = 0;i<cardNumbers.size();i++){
PayGeneralCard bean = createBean(formBean.getSpAppId(), formBean.getType(), cardNumbers.get(i),
passwords.get(i), maxBatchNumber);
list.add(bean);
} //保存数据
List<PayGeneralCard> payGeneralCards = savaAll(list);
return payGeneralCards;
}
//批量添加数据
public List<PayGeneralCard> savaAll(List<PayGeneralCard> payGeneralCards){
ArrayList<PayGeneralCard> 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<Long> createNumber(long count,long startNumber){
if(seq < startNumber){
seq = startNumber;
}
ArrayList<Long> 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<Long> createPassword(Long count,Map<String, Boolean> map){
LinkedList<Long> 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<String, Boolean> 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<String, Boolean> map = new HashMap<String, Boolean>();
for (int i = 0; i < 1000; i++) {
System.out.println(generateUID(map));
}
}
}
关于保存批量数据进入mysql的更多相关文章
- SpringMVC保存数据到mysql乱码问题
SpringMVC保存数据到mysql乱码问题 乱码问题常见配置 一.web.xml配置过滤器 <filter> <filter-name>encoding-filter< ...
- EF 连接MySQL 数据库 保存中文数据后乱码问题
EF 连接MySQL 数据库 保存中文数据后乱码问题 采用Code First 生成的数据库,MySQL数据库中,生成的表的编码格式为***** 发现这个问题后,全部手动改成UTF8(图是另一个表的 ...
- mysql批量数据脚本
mysql批量数据脚本 1 建表 create table dept( id int unsigned primary key auto_increment, deptno mediumint uns ...
- 用python批量向数据库(MySQL)中导入数据
用python批量向数据库(MySQL)中导入数据 现有数十万条数据,如下的经过打乱处理过的数据进行导入 数据库内部的表格的数据格式如下与下面的表格结构相同 Current database: pyt ...
- scrapy爬虫事件以及数据保存为txt,json,mysql
今天要爬取的网页是虎嗅网 我们将完成如下几个步骤: 创建一个新的Scrapy工程 定义你所需要要抽取的Item对象 编写一个spider来爬取某个网站并提取出所有的Item对象 编写一个Item Pi ...
- 随笔编号-09 批量导入数据(Mysql)报MySQL server has gone away 问题的解决方法
问题场景: 使用*.sql 脚本,批量导入数据到mysql实例中,使用DOS 界面导入的,期间,到最后一步 source D:\aaa.sql 回车后,系统提示 MySQL server has g ...
- hibernate保存数据到mysql时的中文乱码问题
因为hibernate底层使用的是jdbc的技术,所以我参考了别人使用jdbc保存数据到mysql里面时解决乱码问题的方法! 首先要告诉数据库要插入的字符串的字符集,mysql 默认使用的字符集是 l ...
- Mysql 函数定义及批量数据脚本
零.说在前面 在定义函数之前 需要先将 log_bin_trust_function_creators 值设为开启,原因如下 在主从复制的两台Mysql服务器中,slaver会从master复制数据, ...
- C API向MySQL插入批量数据的快速方法——关于mysql_autocommit
MySQL默认的数据提交操作模式是自动提交模式(autocommit).这就表示除非显式地开始一个事务,否则每个查询都被当做一个单独的事务自动执行.我们可以通过设置autocommit的值改变是否是自 ...
随机推荐
- 探究"补阶乘大法的本质"——糖水不等式!
废话不多说先来康一条例题: 证明: 下面给出题目的一种解法(我称之为"补阶乘大法"): 思考:为什么补上一个阶乘(准确说不是阶乘,是两个数阶乘的之商)项,放缩后再给去掉,就能达到我 ...
- matlab中卷积convolution与filter用法
转自:https://blog.csdn.net/dkcgx/article/details/46652021 转自:https://blog.csdn.net/Reborn_Lee/article/ ...
- C/C++常用头文件
原文来源:https://blog.csdn.net/thisispan/article/details/7470335 无聊的时候可以多看看: C/C++头文件一览C#include <ass ...
- win10下安装使用Docker:Docker for Windows
一.下载win10下安装docker和桌面管理的工具: 下载地址:Docker for Windows 安装软件学习地址:https://www.runoob.com/docker/docker-tu ...
- AD(Altium Designer)PCB布线中的“格式刷”,助力快速布局布线
摘要:在AD(Altium Designer)进行电路板布线时,孔丙火(微信公众号:孔丙火)经常会碰到电路中有相同功能的模块,比如2路相同的RS485通信电路.多路相同继电器输出电路.多路相同的输入电 ...
- Cypress系列(63)- 使用 Custom Commands
如果想从头学起Cypress,可以看下面的系列文章哦 https://www.cnblogs.com/poloyy/category/1768839.html Custom Commands 自定义命 ...
- Oracle误操作 数据恢复
SELECT * FROM v$sqlarea //查询最近sql记录 SELECT r.FIRST_LOAD_TIME,r.* FROM v$sqlarea r ORDER BY r.FIRST_L ...
- Linux运维学习第四周记
古木阴中系短篷 杖藜扶我过桥东 沾衣欲湿杏花雨 吹面不寒杨柳风 *不要辜负绵绵春意 第四周学记 第四周主要学习了文件查找和打包压缩的相关工具,以及软件包管理工具 文件查找相关命令 1.locate 在 ...
- spring与struts2整合出现错误HTTP Status 500 - Unable to instantiate Action
在进行spring和struts2整合的时候因为大意遇到了一个问题,费了半天神终于找到了问题所在,故分享出来望广大博友引以为戒!! 我们都知道在spring和struts2整合时,spring接管了a ...
- 在java的多态调用中,new的是哪一个类就是调用的哪个类的方法。
在java的多态调用中,new的是哪一个类就是调用的哪个类的方法.(x) 原因: ava多态有两种情况:重载和覆写 在覆写中,运用的是动态单分配,是根据new的类型确定对象,从而确定调用的方法: 在重 ...