模板方法模式 生成唯一编号
发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,模板抽象类/** * 编码生成器 */public abstract class AbstractNumberGenerator { private int leastSerialNoLengt
千家信息网最后更新 2025年12月03日模板方法模式 生成唯一编号
模板抽象类
/** * 编码生成器 */public abstract class AbstractNumberGenerator { private int leastSerialNoLength = 6; /** * 生成编码 * @return */ public String generateNumber() throws Exception { return new StringBuilder().append(getPrefix()).append(getBusinessCode()).append(getWrapperSerialNo()).toString(); } /** * 前缀 * @return */ public abstract String getPrefix(); /** * 业务码 * @return */ public abstract String getBusinessCode(); /** * 顺序号 * @return */ public abstract int getSerialNo() throws Exception ; /** * 顺序号最少位数 * @param length */ protected void setLeastSerialNo(int length){ this.leastSerialNoLength = length; } /** * 顺序号不足补位 * @return */ protected String getWrapperSerialNo() throws Exception { String format = "%0"+ leastSerialNoLength +"d"; return String.format(format, getSerialNo()); }}数据库实现顺序号
/** * 通过数据库的索引机制,建表生成相关数据 */public class CustomerNumberCounterGenerator extends AbstractNumberGenerator { private static final Logger LOGGER = LoggerFactory.getLogger(CustomerNumberCounterGenerator.class); @Override public String getPrefix() { return "K"; } @Override public String getBusinessCode() { return DateUtils.format(new Date(), "yyMMdd"); } /** * 获取顺序号。注:数据库建立的唯一索引机制,获取多并发的情况会报错,因此尝试第二次获取。 * @return * @throws Exception */ @Override public int getSerialNo() throws Exception { int serialNo = Integer.MIN_VALUE; try { serialNo = getCustomSerialNo(); } catch (Exception e) { try { serialNo = getCustomSerialNo(); } catch (Exception e1) { throw new Exception("getSerialNo is failed.", e1); } } return serialNo; } public int getCustomSerialNo() throws Exception { String prefix = getPrefix(); String businessCode = getBusinessCode(); CustomerNumberCounter numberCounter = CustomerNumberCounter.findFirst(CustomerNumberCounter.class, "prefix=? and timeCode=?", new Object[]{prefix, businessCode}); if (null == numberCounter){ numberCounter = new CustomerNumberCounter(); numberCounter.setPrefix(prefix); numberCounter.setTimeCode(businessCode); numberCounter.setSerialNo(1); numberCounter.create(); return 1; } try { BaseDomain.beginTransaction(CustomerNumberCounter.class); int execute = BaseDomain.execute(BaseDomain.class, "update t_customer_number_counter set serialNo = serialNo+1 where id = ?", new Object[]{numberCounter.getId()}); if (execute != 1) throw new IllegalAccessException("更新计数器报错"); return CustomerNumberCounter.find(CustomerNumberCounter.class, numberCounter.getId()).getSerialNo(); }catch (Exception e){ BaseDomain.rollback(CustomerNumberCounter.class); if (LOGGER.isErrorEnabled()) LOGGER.error("to generate customer number occur error.", e); }finally { if (BaseDomain.getCurrentTransaction(CustomerNumberCounter.class) != null) BaseDomain.commit(CustomerNumberCounter.class); } throw new IllegalAccessException("生成客户编码失败"); }}
顺序
顺序号
生成
数据
数据库
编码
机制
索引
模板
业务
位数
前缀
客户
情况
生成器
计数器
会报
尝试
更新
方法
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
软件开发项目意义
门头沟区网络技术咨询成本价
应用软件开发方向是什么
口碑好的软件开发中介
沈阳 软件开发公司有哪些
服务器的年托管
安卓手机l2tp服务器地址怎么查询
怎样给数据库中的列备注
ping服务器通设备不通
小学网络安全计划
微信传照片会不会存到服务器
易语言外部数据库打开
郑州软件开发催收系统
杭州物流软件开发有哪些流程
lbs 数据库
华中网络技术基础答案
宋会要辑稿数据库
软件开发国企有哪些
旅游局 网络安全和信息化
前端与数据库交互实验报告
软件开发项目意义
赤子城网络技术北京有限公司下载
软件开发的男生简称是什么
电脑如何远程控制录像服务器
咸宁计算机软件开发管理
医院网站前台数据库设计
二道区网络技术服务质量推荐
全国网络安全员竞赛视频回放
网络专业的网络安全维护
中小学教师网络安全知识