提出的要求:

生成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相关推荐

  1. jTable保存到mysql_怎么把从数据库里的数据输到JTABLE里面

    int i=0; int column; Vector vcdata=new Vector();//使用容器 DefaultTableModel dtm=new DefaultTableModel() ...

  2. scrapy 保存到mysql_scrapy爬虫保存数据到mysql

    直接上例子 # -*- coding: utf-8 -*- #!/usr/bin/python3 # Define your item pipelines here # # Don't forget ...

  3. 怎么把数据存到MySQL_怎样将Arduino数据直接存储到MySQL

    刻录以下内容 voidsetup() { Serial.begin(9600); } voidloop() { inti=0,j=0; i=analogRead(A0); j=analogRead(A ...

  4. 餐饮汇总表mysql_基于某餐饮数据的mysql+powerBI综合案列

    一.关于本次案列的概述 相关资料与结果: 本次案列的数据是来自某餐饮数据的日销售情况,基于已经提供的数据,需要在excel中做一个各个店面的分析仪,其KPI 指标相关如下: 该问题的难点还是在于表之间 ...

  5. excel数据命令导入mysql_如何将EXCEL数据导入MYSQL

    VBA对MySql数据库进行读取和写入操作时间:2009-10-06 09:18:47来源:网络 作者:未知 点击:178次 '以下代码用于32位系统,Office 2003,环境,MySql版本5. ...

  6. csv mysql_将csv的数据导入mysql

    手头有一份8MB的CSV文件需要分析,对于程序员来说,还有比在数据库里分析更愉快的事情吗? 所以让我们把CSV导入MYSQL吧. 一.首先按照文件列数创建相应的SQL表 例如: DROP TABLE ...

  7. mysql 命令行批量sql_命令行中执行批量SQL的方法

    基础信息介绍 测试库:test: 测试表:user: user表定义: CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `nam ...

  8. e语言mysql怎么放在超级列表框,『易语言怎么将超级列表框的内容保存到excel或者Access!』...

    易语言把编辑框里的内容保存到Excel里 个人建议: 1.建议选据库成你要的修改.添加.查作 2.添加一个列表框,可以轻松直观的处理数据 3.如果有使用Excel的需求,那就弄一个导出按键 这样才能是 ...

  9. python数据采集 爬虫 生意宝_Python爬虫实战 :批量采集股票数据,并保存到Excel中...

    小编说:通过本文,读者可以掌握分析网页的技巧.Python编写网络程序的方法.Excel的操作,以及正则表达式的使用.这些都是爬虫项目中必备的知识和技能.本文选自<Python带我起飞>. ...

最新文章

  1. postgresql 子查询_PostgreSQL子事务及性能分析
  2. 哪位有方法把 dd/mm/yyyy的字符串 格式化成yyyy-mm-dd
  3. 高德地图 街道范围_高德地图发布交通“评诊治”系统:针对各类交通拥堵场景“因地制宜”...
  4. 将有序数组转为二叉搜索树
  5. WCF中如何用nettcp协议进行通讯
  6. java22:API-Object-String
  7. Gartner 解析容器新发展, 阿里云、AWS布局最完善
  8. SQL Server 2008R2密钥
  9. Creo参数曲面设计视频教程
  10. WPF教程:依赖属性
  11. 怎么获取大量新鲜可用的迅雷白金会员账号!?
  12. 作业一 统计软件简介与数据操作
  13. 为什么程序员 996 会猝死,而老板 007 却不会? ​
  14. 副驾驶的意义_副驾驶位置有什么含义?
  15. 把redis部署到百度BAE上时的注意点
  16. 计算机c盘中无法搜索文件格式,电脑C盘中programdata文件夹找不到该怎么办
  17. 【python--爬虫】千图网高清背景图片
  18. 怎样删除计算机硬盘记录,有什么方法能删除电脑里使用过的移动硬盘的记录
  19. 流动性风险与次贷危机
  20. 消费互联网、产业互联网、工业互联网、能源互联网的关键区别是什么?智慧城市、智慧园区、智慧交通、智慧水务、智能电网、智慧工厂中都需要的关键技术是什么?

热门文章

  1. python正则表达式匹配aabb_Python正则表达式拆分多个匹配项
  2. 二级Python 第三方库
  3. opencv中的椭圆拟合
  4. face alignment by 3000 fps系列学习总结
  5. linux中设置默认权限的命令,Linux默认权限掩码
  6. 定义动画名字html,CSS3 animation-name属性怎么用?
  7. 阅读【现代网络技术 SDN/NFV/QOE 物联网和云计算】 第一章
  8. English trip -- VC(情景课)10 C I like to watch TV. 我爱看电视
  9. 0530JavaScript基础2
  10. 牛顿插值法及其C++实现