关于保存批量数据进入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的值改变是否是自 ...
随机推荐
- mac常用指令
mkdir demo //创建一个文件夹 touch index.html // 创建一个html文件 rm rouch index.html //删除找个index.html文件 rmdir dem ...
- java安全编码指南之:lock和同步的正确使用
目录 简介 使用private final object来作为lock对象 不要synchronize可被重用的对象 不要sync Object.getClass() 不要sync高级并发对象 不要使 ...
- [BJWC 2011]元素
题目大意: 你有n个二元组(x,y),要求从中任取几个,使得x的值亦或起来不为0,且y之和最大. 题解: 显然是以x来构造线性基的,然而加入元素的个数是有限制的,那当然就是大的先来喽,排个序就OK啦! ...
- devops-jenkins分布式构建
1. devops-jenkins分布式构建 1) 点击系统管理 进入节点管理 2) 点击新建节点 3) 进行节点配置在node节点服务器配置,进行java的安装 [root@nginx-backup ...
- 多测师讲解_ 高级自动化测试selenium_001基本学习
高级自动化测试python+selenium教程手册 --高级讲师肖sir 第 1 章webdriver 环境搭建好了,我们正式学习 selenium 的 webdriver 框架,它不像 QTP 之 ...
- rs232转网络
rs232转网络 rs232转网络ZLAN5103可以实现RS232/485/422和TCP/IP之间进行透明数据转发.方便地使得串口设备连接到以太网和Internet,实现串口设备的网络化升级.支持 ...
- boost之asio
asio asio是C++的准标准网络库,并且C++20标准库的网络部分将基于ASIO,需引入头文件#include <boost/asio.hpp>. ip地址 boost定义了表示ip ...
- charles详解
Charles抓包https:https://www.jianshu.com/p/ec0a38d9a8cf 浅谈charles抓取https原理:https://www.jianshu.com/p/4 ...
- 【博弈论】51Nod 1534 棋子游戏
题目内容 波雷卡普和瓦西里喜欢简单的逻辑游戏.今天他们玩了一个游戏,这个游戏在一个很大的棋盘上进行,他们每个人有一个棋子.他们轮流移动自己的棋子,波雷卡普先开始.每一步移动中,波雷卡普可以将他的棋子从 ...
- 解决python的requests库在使用过代理后出现拒绝连接的问题
在使用过代理后,调用python的requests库出现拒绝连接的异常 问题 在windows10环境下,在使用代理(VPN)后.如果在python中调用requests库来地址访问时,有时会出现这样 ...