提出的要求:

  生成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的更多相关文章

  1. SpringMVC保存数据到mysql乱码问题

    SpringMVC保存数据到mysql乱码问题 乱码问题常见配置 一.web.xml配置过滤器 <filter> <filter-name>encoding-filter< ...

  2. EF 连接MySQL 数据库  保存中文数据后乱码问题

    EF 连接MySQL 数据库  保存中文数据后乱码问题 采用Code First 生成的数据库,MySQL数据库中,生成的表的编码格式为***** 发现这个问题后,全部手动改成UTF8(图是另一个表的 ...

  3. mysql批量数据脚本

    mysql批量数据脚本 1 建表 create table dept( id int unsigned primary key auto_increment, deptno mediumint uns ...

  4. 用python批量向数据库(MySQL)中导入数据

    用python批量向数据库(MySQL)中导入数据 现有数十万条数据,如下的经过打乱处理过的数据进行导入 数据库内部的表格的数据格式如下与下面的表格结构相同 Current database: pyt ...

  5. scrapy爬虫事件以及数据保存为txt,json,mysql

    今天要爬取的网页是虎嗅网 我们将完成如下几个步骤: 创建一个新的Scrapy工程 定义你所需要要抽取的Item对象 编写一个spider来爬取某个网站并提取出所有的Item对象 编写一个Item Pi ...

  6. 随笔编号-09 批量导入数据(Mysql)报MySQL server has gone away 问题的解决方法

    问题场景: 使用*.sql 脚本,批量导入数据到mysql实例中,使用DOS 界面导入的,期间,到最后一步 source D:\aaa.sql  回车后,系统提示 MySQL server has g ...

  7. hibernate保存数据到mysql时的中文乱码问题

    因为hibernate底层使用的是jdbc的技术,所以我参考了别人使用jdbc保存数据到mysql里面时解决乱码问题的方法! 首先要告诉数据库要插入的字符串的字符集,mysql 默认使用的字符集是 l ...

  8. Mysql 函数定义及批量数据脚本

    零.说在前面 在定义函数之前 需要先将 log_bin_trust_function_creators 值设为开启,原因如下 在主从复制的两台Mysql服务器中,slaver会从master复制数据, ...

  9. C API向MySQL插入批量数据的快速方法——关于mysql_autocommit

    MySQL默认的数据提交操作模式是自动提交模式(autocommit).这就表示除非显式地开始一个事务,否则每个查询都被当做一个单独的事务自动执行.我们可以通过设置autocommit的值改变是否是自 ...

随机推荐

  1. python 给IDLE添加行号

    [LineNumbers] enable=1 enable_editor=1 enable_shell=1 visible=1 [LineNumbers_cfgBindings] linenumber ...

  2. lens distortion

    来源:http://michel.thoby.free.fr/Fisheye_history_short/International_Standards_about_Distortion.html H ...

  3. TCP/IP 邮件

    原文:TCP/IP 邮件 第一节:TCP/IP 简介 第二节:TCP/IP 寻址 第三节:TCP/IP 协议 第四节:TCP/IP 邮件 电子邮件是 TCP/IP 最重要的应用之一. 你不会用到... ...

  4. 【题解】[SDOI2016]征途

    Link 题目大意:给定序列,将它划分为\(m\)段使得方差最小,输出\(s^2*m^2\)(一个整数). \(\text{Solution:}\) 这题我通过题解中的大佬博客学到了一般化方差柿子的写 ...

  5. 编程体系结构(06):Java面向对象

    本文源码:GitHub·点这里 || GitEE·点这里 一.基础概念 1.面向对象概念 面向对象编程的主要思想是把构成问题的各个事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙一 ...

  6. Java安全之Commons Collections1分析(一)

    Java安全之Commons Collections1分析(一) 0x00 前言 在CC链中,其实具体执行过程还是比较复杂的.建议调试前先将一些前置知识的基础给看一遍. Java安全之Commons ...

  7. Python 中 pip 工具的安装与使用

    pip 是 Python 包管理工具,该工具提供了对Python 包的查找.下载.安装.卸载的功能. 目前如果你在 python.org 下载最新版本的安装包,则是已经自带了该工具. Python 2 ...

  8. 多测师讲解接口测试 _HTTP常见的状态码归纳_高级讲师肖sir

    100 Continue  初始的请求已经接受,客户应当继续发送请求的其余部分 101 Switching Protocols  服务器将遵从客户的请求转换到另外一种协议 200 OK  一切正常,对 ...

  9. day58 Pyhton 框架Django 01

    内容回顾 python基础    网路编程    并发编程    数据库    前端     osi7层           tcp/ip 5层模型    应用层    表示层             ...

  10. 网络编程—【自己动手】用C语言写一个基于服务器和客户端(TCP)!

    如果想要自己写一个服务器和客户端,我们需要掌握一定的网络编程技术,个人认为,网络编程中最关键的就是这个东西--socket(套接字). socket(套接字):简单来讲,socket就是用于描述IP地 ...