模板方法模式 生成唯一编号
发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,模板抽象类/** * 编码生成器 */public abstract class AbstractNumberGenerator { private int leastSerialNoLengt
千家信息网最后更新 2026年11月02日模板方法模式 生成唯一编号
模板抽象类
/** * 编码生成器 */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安全错误
数据库的锁怎样保障安全
礼当家互联网科技
互联网科技的英文
互联网科技ppt模板
北京禾田雨橡互联网科技
卓越科技互联网 招聘
安控科技rtu产品工业互联网
互联网科技项目计划书材料类
世界互联网科技公司市值排名
坤平互联网科技
云南省自由互联网科技有限公司
美国互联网科技公司
互联网安防科技感
西安有哪些互联网高科技企业
中国科技和美国互联网
易租星互联网科技有限公司
马化腾互联网科技教学
北京品多多互联网科技有限公司
黑龙江互联网科技公司
互联网高科技绘画
高科技和互联网的现代国家
上海睿民互联网科技有限公司
山东特亿宝互联网科技有限公司
互联网科技公司的优势
互联网科技小额贷款
富国互联网科技创新基金
黑云互联网科技有限公司
广州燕处互联网科技有限公司
云南互联网科技学费
中国互联网公司的科技投入
华人运通互联网科技公司