关于保存批量数据进入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的值改变是否是自 ...
随机推荐
- python 给IDLE添加行号
[LineNumbers] enable=1 enable_editor=1 enable_shell=1 visible=1 [LineNumbers_cfgBindings] linenumber ...
- lens distortion
来源:http://michel.thoby.free.fr/Fisheye_history_short/International_Standards_about_Distortion.html H ...
- TCP/IP 邮件
原文:TCP/IP 邮件 第一节:TCP/IP 简介 第二节:TCP/IP 寻址 第三节:TCP/IP 协议 第四节:TCP/IP 邮件 电子邮件是 TCP/IP 最重要的应用之一. 你不会用到... ...
- 【题解】[SDOI2016]征途
Link 题目大意:给定序列,将它划分为\(m\)段使得方差最小,输出\(s^2*m^2\)(一个整数). \(\text{Solution:}\) 这题我通过题解中的大佬博客学到了一般化方差柿子的写 ...
- 编程体系结构(06):Java面向对象
本文源码:GitHub·点这里 || GitEE·点这里 一.基础概念 1.面向对象概念 面向对象编程的主要思想是把构成问题的各个事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙一 ...
- Java安全之Commons Collections1分析(一)
Java安全之Commons Collections1分析(一) 0x00 前言 在CC链中,其实具体执行过程还是比较复杂的.建议调试前先将一些前置知识的基础给看一遍. Java安全之Commons ...
- Python 中 pip 工具的安装与使用
pip 是 Python 包管理工具,该工具提供了对Python 包的查找.下载.安装.卸载的功能. 目前如果你在 python.org 下载最新版本的安装包,则是已经自带了该工具. Python 2 ...
- 多测师讲解接口测试 _HTTP常见的状态码归纳_高级讲师肖sir
100 Continue 初始的请求已经接受,客户应当继续发送请求的其余部分 101 Switching Protocols 服务器将遵从客户的请求转换到另外一种协议 200 OK 一切正常,对 ...
- day58 Pyhton 框架Django 01
内容回顾 python基础 网路编程 并发编程 数据库 前端 osi7层 tcp/ip 5层模型 应用层 表示层 ...
- 网络编程—【自己动手】用C语言写一个基于服务器和客户端(TCP)!
如果想要自己写一个服务器和客户端,我们需要掌握一定的网络编程技术,个人认为,网络编程中最关键的就是这个东西--socket(套接字). socket(套接字):简单来讲,socket就是用于描述IP地 ...