批量保存到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));
}
}
}
批量保存到mysql_关于保存批量数据进入mysql相关推荐
- jTable保存到mysql_怎么把从数据库里的数据输到JTABLE里面
int i=0; int column; Vector vcdata=new Vector();//使用容器 DefaultTableModel dtm=new DefaultTableModel() ...
- scrapy 保存到mysql_scrapy爬虫保存数据到mysql
直接上例子 # -*- coding: utf-8 -*- #!/usr/bin/python3 # Define your item pipelines here # # Don't forget ...
- 怎么把数据存到MySQL_怎样将Arduino数据直接存储到MySQL
刻录以下内容 voidsetup() { Serial.begin(9600); } voidloop() { inti=0,j=0; i=analogRead(A0); j=analogRead(A ...
- 餐饮汇总表mysql_基于某餐饮数据的mysql+powerBI综合案列
一.关于本次案列的概述 相关资料与结果: 本次案列的数据是来自某餐饮数据的日销售情况,基于已经提供的数据,需要在excel中做一个各个店面的分析仪,其KPI 指标相关如下: 该问题的难点还是在于表之间 ...
- excel数据命令导入mysql_如何将EXCEL数据导入MYSQL
VBA对MySql数据库进行读取和写入操作时间:2009-10-06 09:18:47来源:网络 作者:未知 点击:178次 '以下代码用于32位系统,Office 2003,环境,MySql版本5. ...
- csv mysql_将csv的数据导入mysql
手头有一份8MB的CSV文件需要分析,对于程序员来说,还有比在数据库里分析更愉快的事情吗? 所以让我们把CSV导入MYSQL吧. 一.首先按照文件列数创建相应的SQL表 例如: DROP TABLE ...
- mysql 命令行批量sql_命令行中执行批量SQL的方法
基础信息介绍 测试库:test: 测试表:user: user表定义: CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `nam ...
- e语言mysql怎么放在超级列表框,『易语言怎么将超级列表框的内容保存到excel或者Access!』...
易语言把编辑框里的内容保存到Excel里 个人建议: 1.建议选据库成你要的修改.添加.查作 2.添加一个列表框,可以轻松直观的处理数据 3.如果有使用Excel的需求,那就弄一个导出按键 这样才能是 ...
- python数据采集 爬虫 生意宝_Python爬虫实战 :批量采集股票数据,并保存到Excel中...
小编说:通过本文,读者可以掌握分析网页的技巧.Python编写网络程序的方法.Excel的操作,以及正则表达式的使用.这些都是爬虫项目中必备的知识和技能.本文选自<Python带我起飞>. ...
最新文章
- postgresql 子查询_PostgreSQL子事务及性能分析
- 哪位有方法把 dd/mm/yyyy的字符串 格式化成yyyy-mm-dd
- 高德地图 街道范围_高德地图发布交通“评诊治”系统:针对各类交通拥堵场景“因地制宜”...
- 将有序数组转为二叉搜索树
- WCF中如何用nettcp协议进行通讯
- java22:API-Object-String
- Gartner 解析容器新发展, 阿里云、AWS布局最完善
- SQL Server 2008R2密钥
- Creo参数曲面设计视频教程
- WPF教程:依赖属性
- 怎么获取大量新鲜可用的迅雷白金会员账号!?
- 作业一 统计软件简介与数据操作
- 为什么程序员 996 会猝死,而老板 007 却不会? ​
- 副驾驶的意义_副驾驶位置有什么含义?
- 把redis部署到百度BAE上时的注意点
- 计算机c盘中无法搜索文件格式,电脑C盘中programdata文件夹找不到该怎么办
- 【python--爬虫】千图网高清背景图片
- 怎样删除计算机硬盘记录,有什么方法能删除电脑里使用过的移动硬盘的记录
- 流动性风险与次贷危机
- 消费互联网、产业互联网、工业互联网、能源互联网的关键区别是什么?智慧城市、智慧园区、智慧交通、智慧水务、智能电网、智慧工厂中都需要的关键技术是什么?
热门文章
- python正则表达式匹配aabb_Python正则表达式拆分多个匹配项
- 二级Python 第三方库
- opencv中的椭圆拟合
- face alignment by 3000 fps系列学习总结
- linux中设置默认权限的命令,Linux默认权限掩码
- 定义动画名字html,CSS3 animation-name属性怎么用?
- 阅读【现代网络技术 SDN/NFV/QOE 物联网和云计算】 第一章
- English trip -- VC(情景课)10 C I like to watch TV. 我爱看电视
- 0530JavaScript基础2
- 牛顿插值法及其C++实现